Skip to content

QuickJS engine: host-side, side-effect-free serialization via handles - #3263

Open
TooTallNate wants to merge 1 commit into
quickjs-vm-perffrom
quickjs-host-serde
Open

QuickJS engine: host-side, side-effect-free serialization via handles#3263
TooTallNate wants to merge 1 commit into
quickjs-vm-perffrom
quickjs-host-serde

Conversation

@TooTallNate

@TooTallNate TooTallNate commented Jul 31, 2026

Copy link
Copy Markdown
Member

Summary

Moves the QuickJS engine's serialization entirely to the host, operating on JSValueHandles — the serde bundle previously bundled by esbuild and evaluated inside the VM is gone. This mirrors the node:vm engine's architecture (the serializer is host code reaching into the sandbox realm) and is the QuickJS counterpart to #3257's side-effect-free serialization for node:vm.

Built on:

Architecture

runtime/quickjs-serde.ts implements the workflow wire codec over handles:

  • Hybrid stringify value space: workflow reducers return host shapes with handle leaves (exactly how the node:vm codec mixes host shapes with sandbox-realm leaves); every operation dispatches on JSValueHandle and falls back to defaultStringifyOperations for host values. Parse operations are handle-only — every revived value is built inside the VM through boot-captured constructors.
  • Side-effect freedom: classification by engine brand (boot-sampled classId map, isError, isProxy) — never instanceof or Symbol.toStringTag; extraction through boot-captured intrinsics invoked with explicit receivers; property access through descriptors. Patched prototypes and spoofed brands can no longer perturb serialization (a Symbol.toStringTag: 'Date' spoof serializes as the plain object it is — the previous codec crashed on that input). The only guest code executed is what the contract always executed: WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE, __closureVarsFn, WORKFLOW_USE_STEP on revival.
  • Bootstrap simplification: pending ops carry RAW values (step input, hook metadata, abort payloads), and raw workflow results/errors; the host serializes through handles at collection time, with a per-VM byte cache for ops that stay pending across suspensions.
  • Determinism preserved: correlationId ULIDs move host-side but draw from the same seeded PRNG instance as the VM's Math.random, so the interleaved draw sequence — and every generated ID — is identical to the in-VM factory's. Existing runs replay byte-for-byte.

Wire-format parity

Event logs persist across SDK versions, so parity with the previous in-VM codec is load-bearing (old runs must replay; node-engine steps must read VM-serialized inputs). The old codec's value-space implementation is retained as serialization/workflow-vm.ts (host reference codec) and a new parity suite byte-compares against it in both directions: 42 tests covering primitives/bigints/-0/NaN, containers, typed arrays/views/buffers, the full Error family with cause chains, shared refs + cycles, null-proto objects, boxed primitives, step-function proxies (closure vars + bound this), workflow refs, symbol-stamped stream handles, registry class instances, and patched-prototype/spoof resistance.

Removed

  • scripts/build-vm-serde-bundle.js, the generated vm-serde-bundle.generated.ts, serialization/vm-bundle-entry.ts, and the bundle eval in VM init.

Testing

  • New: 42 serde parity tests
  • Existing: 16 quickjs-runtime tests green unchanged (their fixtures are built with the reference codec, so they also validate parity end to end)
  • Full @workflow/core suite: 1757 passed | 3 expected fail
  • Local e2e (WORKFLOW_VM=quickjs, dev server): hooks 26✓, AbortController 26✓, streams 7✓, retries/errors 7✓, instance methods ✓, recursive start() (fibonacci) ✓

Follow-up candidates

@TooTallNate
TooTallNate requested review from a team and ijjk as code owners July 31, 2026 18:50
Copilot AI review requested due to automatic review settings July 31, 2026 18:50
@changeset-bot

changeset-bot Bot commented Jul 31, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: cecd664

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 16 packages
Name Type
@workflow/core Patch
@workflow/builders Patch
@workflow/cli Patch
@workflow/next Patch
@workflow/nitro Patch
@workflow/vitest Patch
@workflow/web-shared Patch
@workflow/web Patch
workflow Patch
@workflow/world-testing Patch
@workflow/astro Patch
@workflow/nest Patch
@workflow/rollup Patch
@workflow/sveltekit Patch
@workflow/vite Patch
@workflow/nuxt Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

⚠️ Results below are stale and not from the latest commit. This comment will be updated when CI completes on the latest run.

Tests are running...


_Started at: _


Some tests failed

❌ Failed E2E Tests

▲ Vercel Production (26 failed)

astro-quickjs (3 failed):

example-quickjs (3 failed):

express-quickjs (2 failed):

fastify-quickjs (2 failed):

hono-quickjs (2 failed):

nextjs-turbopack-quickjs (2 failed):

nextjs-webpack-quickjs (3 failed):

nitro-quickjs (2 failed):

nuxt-quickjs (2 failed):

sveltekit-quickjs (3 failed):

vite-quickjs (2 failed):

💻 Local Development (22 failed)

astro-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

express-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

fastify-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

hono-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

nextjs-turbopack-canary-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

nextjs-turbopack-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

nextjs-webpack-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

nitro-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

nuxt-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

sveltekit-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

vite-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM
📦 Local Production (26 failed)

astro-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

express-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

fastify-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

hono-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

nextjs-turbopack-canary-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

nextjs-turbopack-stable-node (1 failed):

  • webhookWorkflow | wrun_41KYX1QSJW0GP13ZYSHQFFGTVP

nextjs-turbopack-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

nextjs-webpack-canary-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

nextjs-webpack-stable-node (1 failed):

  • webhookWorkflow | wrun_41KYX1QSJW0GP13ZYSHQFFGTVP

nextjs-webpack-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

nitro-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

nuxt-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

sveltekit-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

vite-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM
🐘 Local Postgres (22 failed)

astro-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

express-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

fastify-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

hono-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

nextjs-turbopack-canary-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

nextjs-webpack-canary-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

nextjs-webpack-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

nitro-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

nuxt-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

sveltekit-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

vite-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

🪟 Windows (2 failed)

nextjs-turbopack-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM
📋 Other (16 failed)

e2e-local-dev-nest-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

e2e-local-dev-tanstack-start-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

e2e-local-postgres-nest-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

e2e-local-postgres-tanstack-start-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

e2e-local-prod-nest-stable-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

e2e-local-prod-tanstack-start-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

e2e-vercel-prod-nest-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

e2e-vercel-prod-tanstack-start-quickjs (2 failed):

  • nullByteWorkflow | wrun_41KYX1SE9M0GK807M72582WNNR
  • promiseRaceStressTestWorkflow | wrun_41KYX1XX9G0GR0Z1EHG8NPMHMM

E2E Test Summary

Summary
Passed Failed Skipped Total
❌ ▲ Vercel Production 2884 26 478 3388
❌ 💻 Local Development 2950 22 416 3388
❌ 📦 Local Production 3216 26 454 3696
❌ 🐘 Local Postgres 3066 22 454 3542
❌ 🪟 Windows 306 2 0 308
❌ 📋 Other 2024 16 424 2464
✅ vercel-multi-region 27 0 0 27
Total 14473 114 2226 16813
Details by Category

❌ ▲ Vercel Production

App Passed Failed Skipped
✅ astro-node 126 0 28
❌ astro-quickjs 123 3 28
✅ example-node 126 0 28
❌ example-quickjs 123 3 28
✅ express-node 126 0 28
❌ express-quickjs 124 2 28
✅ fastify-node 126 0 28
❌ fastify-quickjs 124 2 28
✅ hono-node 126 0 28
❌ hono-quickjs 124 2 28
✅ nextjs-turbopack-node 151 0 3
❌ nextjs-turbopack-quickjs 149 2 3
✅ nextjs-webpack-node 151 0 3
❌ nextjs-webpack-quickjs 148 3 3
✅ nitro-node 126 0 28
❌ nitro-quickjs 124 2 28
✅ nuxt-node 126 0 28
❌ nuxt-quickjs 124 2 28
✅ sveltekit-node 145 0 9
❌ sveltekit-quickjs 142 3 9
✅ vite-node 126 0 28
❌ vite-quickjs 124 2 28

❌ 💻 Local Development

App Passed Failed Skipped
✅ astro-stable-node 128 0 26
❌ astro-stable-quickjs 126 2 26
✅ express-stable-node 128 0 26
❌ express-stable-quickjs 126 2 26
✅ fastify-stable-node 128 0 26
❌ fastify-stable-quickjs 126 2 26
✅ hono-stable-node 128 0 26
❌ hono-stable-quickjs 126 2 26
✅ nextjs-turbopack-canary-node 135 0 19
❌ nextjs-turbopack-canary-quickjs 133 2 19
✅ nextjs-turbopack-stable-node 154 0 0
❌ nextjs-turbopack-stable-quickjs 152 2 0
✅ nextjs-webpack-stable-node 154 0 0
❌ nextjs-webpack-stable-quickjs 152 2 0
✅ nitro-stable-node 128 0 26
❌ nitro-stable-quickjs 126 2 26
✅ nuxt-stable-node 128 0 26
❌ nuxt-stable-quickjs 126 2 26
✅ sveltekit-stable-node 147 0 7
❌ sveltekit-stable-quickjs 145 2 7
✅ vite-stable-node 128 0 26
❌ vite-stable-quickjs 126 2 26

❌ 📦 Local Production

App Passed Failed Skipped
✅ astro-stable-node 128 0 26
❌ astro-stable-quickjs 126 2 26
✅ express-stable-node 128 0 26
❌ express-stable-quickjs 126 2 26
✅ fastify-stable-node 128 0 26
❌ fastify-stable-quickjs 126 2 26
✅ hono-stable-node 128 0 26
❌ hono-stable-quickjs 126 2 26
✅ nextjs-turbopack-canary-node 135 0 19
❌ nextjs-turbopack-canary-quickjs 133 2 19
❌ nextjs-turbopack-stable-node 153 1 0
❌ nextjs-turbopack-stable-quickjs 152 2 0
✅ nextjs-webpack-canary-node 135 0 19
❌ nextjs-webpack-canary-quickjs 133 2 19
❌ nextjs-webpack-stable-node 153 1 0
❌ nextjs-webpack-stable-quickjs 152 2 0
✅ nitro-stable-node 128 0 26
❌ nitro-stable-quickjs 126 2 26
✅ nuxt-stable-node 128 0 26
❌ nuxt-stable-quickjs 126 2 26
✅ sveltekit-stable-node 147 0 7
❌ sveltekit-stable-quickjs 145 2 7
✅ vite-stable-node 128 0 26
❌ vite-stable-quickjs 126 2 26

❌ 🐘 Local Postgres

App Passed Failed Skipped
✅ astro-stable-node 128 0 26
❌ astro-stable-quickjs 126 2 26
✅ express-stable-node 128 0 26
❌ express-stable-quickjs 126 2 26
✅ fastify-stable-node 128 0 26
❌ fastify-stable-quickjs 126 2 26
✅ hono-stable-node 128 0 26
❌ hono-stable-quickjs 126 2 26
✅ nextjs-turbopack-canary-node 135 0 19
❌ nextjs-turbopack-canary-quickjs 133 2 19
✅ nextjs-turbopack-stable-node 154 0 0
✅ nextjs-webpack-canary-node 135 0 19
❌ nextjs-webpack-canary-quickjs 133 2 19
✅ nextjs-webpack-stable-node 154 0 0
❌ nextjs-webpack-stable-quickjs 152 2 0
✅ nitro-stable-node 128 0 26
❌ nitro-stable-quickjs 126 2 26
✅ nuxt-stable-node 128 0 26
❌ nuxt-stable-quickjs 126 2 26
✅ sveltekit-stable-node 147 0 7
❌ sveltekit-stable-quickjs 145 2 7
✅ vite-stable-node 128 0 26
❌ vite-stable-quickjs 126 2 26

❌ 🪟 Windows

App Passed Failed Skipped
✅ nextjs-turbopack-node 154 0 0
❌ nextjs-turbopack-quickjs 152 2 0

❌ 📋 Other

App Passed Failed Skipped
✅ e2e-local-dev-nest-stable-node 128 0 26
❌ e2e-local-dev-nest-stable-quickjs 126 2 26
✅ e2e-local-dev-tanstack-start-node 128 0 26
❌ e2e-local-dev-tanstack-start-quickjs 126 2 26
✅ e2e-local-postgres-nest-stable-node 128 0 26
❌ e2e-local-postgres-nest-stable-quickjs 126 2 26
✅ e2e-local-postgres-tanstack-start-node 128 0 26
❌ e2e-local-postgres-tanstack-start-quickjs 126 2 26
✅ e2e-local-prod-nest-stable-node 128 0 26
❌ e2e-local-prod-nest-stable-quickjs 126 2 26
✅ e2e-local-prod-tanstack-start-node 128 0 26
❌ e2e-local-prod-tanstack-start-quickjs 126 2 26
✅ e2e-vercel-prod-nest-node 126 0 28
❌ e2e-vercel-prod-nest-quickjs 124 2 28
✅ e2e-vercel-prod-tanstack-start-node 126 0 28
❌ e2e-vercel-prod-tanstack-start-quickjs 124 2 28

✅ vercel-multi-region

App Passed Failed Skipped
✅ nextjs-turbopack 27 0 0

📋 View full workflow run

@vercel

vercel Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
example-nextjs-workflow-turbopack Ready Ready Preview Jul 31, 2026 11:13pm
example-nextjs-workflow-webpack Ready Ready Preview Jul 31, 2026 11:13pm
example-workflow Ready Ready Preview Jul 31, 2026 11:13pm
workbench-astro-workflow Ready Ready Preview Jul 31, 2026 11:13pm
workbench-express-workflow Ready Ready Preview Jul 31, 2026 11:13pm
workbench-fastify-workflow Ready Ready Preview Jul 31, 2026 11:13pm
workbench-hono-workflow Ready Ready Preview Jul 31, 2026 11:13pm
workbench-nestjs-workflow Ready Ready Preview Jul 31, 2026 11:13pm
workbench-nitro-workflow Ready Ready Preview Jul 31, 2026 11:13pm
workbench-nuxt-workflow Ready Ready Preview Jul 31, 2026 11:13pm
workbench-sveltekit-workflow Ready Ready Preview Jul 31, 2026 11:13pm
workbench-tanstack-start-workflow Ready Ready Preview Jul 31, 2026 11:13pm
workbench-vite-workflow Ready Ready Preview Jul 31, 2026 11:13pm
workflow-docs Ready Ready Preview, v0 Jul 31, 2026 11:13pm
workflow-swc-playground Ready Ready Preview Jul 31, 2026 11:13pm
workflow-tarballs Ready Ready Preview Jul 31, 2026 11:13pm
workflow-web Ready Ready Preview Jul 31, 2026 11:13pm

@socket-security

socket-security Bot commented Jul 31, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updatednpm/​devalue@​5.8.1 ⏵ 5.9.0100100100 +192100

View full report

@TooTallNate
TooTallNate requested a review from a team as a code owner July 31, 2026 22:59
(Re-applied onto the review-fixed base; original commits da27230 +
9814ed9 squashed.)

Replace the in-VM serde bundle with a host-side codec
(runtime/quickjs-serde.ts) built on quickjs-wasi 3.3's introspection
primitives and devalue 5.9's pluggable stringify/parse operations —
mirroring the node:vm engine's architecture.

Review fixes incorporated:
- reducer/reviver key sets are pinned against codec-devalue-vm's
  workflow mode by exhaustiveness tests (exact order for reducers —
  first match wins), so the handle-space codec can't silently drift
  from the shared value-space sets.
- the devalue entry in minimumReleaseAgeExclude is removed: the exact
  version is pinned via the workspace catalog + lockfile, so the
  cooldown waiver was unnecessary (verified with both frozen and
  regular installs).
- eval-string interpolation inherits the JSON.stringify(cid) hardening
  from the base branch.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants