Skip to content

[backport] ci: switch Vercel deployment-protection bypass to OIDC Trusted Sources (#1882)#1897

Merged
VaguelySerious merged 2 commits intostablefrom
peter/backport-1882-stable
May 3, 2026
Merged

[backport] ci: switch Vercel deployment-protection bypass to OIDC Trusted Sources (#1882)#1897
VaguelySerious merged 2 commits intostablefrom
peter/backport-1882-stable

Conversation

@VaguelySerious
Copy link
Copy Markdown
Member

Backports #1882 onto stable.

Cherry-pick of cd50618d1f with conflict resolution for stable's diverged state:

  • docs/scripts/check-docs-smoke.mjs: Dropped — file does not exist on stable (docs app is a placeholder).
  • .github/workflows/docs-checks.yml: Kept stable's no-op stub (if: false); the OIDC-equipped smoke job from main is not applicable.
  • .github/workflows/tests.yml: Took the OIDC version of the env block.
  • packages/world-vercel/src/utils.ts: Added the missing getWorkflowServerUrlOverride() helper (referenced by the cherry-picked changes but only defined on main as part of an earlier PR), so WORKFLOW_SERVER_URL_OVERRIDE and VERCEL_WORKFLOW_SERVER_URL are honored consistently across getHttpUrl and getHeaders.
  • AGENTS.md, packages/world-vercel/src/encryption.ts, packages/world-vercel/src/resolve-latest-deployment.ts: Trivial whitespace / casing conflicts resolved in favor of the cherry-pick.
  • packages/world-vercel/src/utils.test.ts: Added (new on main, didn't exist on stable). All 11 tests pass.

🤖 Generated with Claude Code

#1882)

* ci: switch Vercel deployment-protection bypass to OIDC Trusted Sources

The e2e, benchmark, and docs-smoke CI jobs previously used the static
`VERCEL_AUTOMATION_BYPASS_SECRET` deployment-protection bypass token
to reach protected Vercel deployments. Switch them over to the new OIDC
Trusted Sources flow: the GitHub Actions runner mints a short-lived
OIDC token via `core.getIDToken()` and forwards it on requests in the
`x-vercel-trusted-oidc-idp-token` header.

Each workbench project (and `workflow-docs`) has been configured with a
matching trusted-source rule:
  aud=https://github.com/vercel, repository=vercel/workflow

The shared header helper now lives at `scripts/trusted-sources-headers.mjs`
and is imported by both the e2e/bench tests and the docs smoke script,
removing the previous duplication.

* rename to VERCEL_OIDC_TOKEN and wire through world-vercel

- Rename the env var from VERCEL_TRUSTED_OIDC_TOKEN to VERCEL_OIDC_TOKEN
  to match Vercel's convention (also read by @vercel/oidc's
  getVercelOidcToken()).
- In @workflow/world-vercel, replace the legacy
  VERCEL_WORKFLOW_SERVER_PROTECTION_BYPASS / x-vercel-protection-bypass
  flow with VERCEL_OIDC_TOKEN / x-vercel-trusted-oidc-idp-token. The
  trusted-source header is attached on every outbound workflow-server
  request (both proxied through api.vercel.com and direct).
- Drop the bypass header from the encryption-key and
  resolve-latest-deployment fetches: those go to api.vercel.com which
  is public.
- Drop VERCEL_WORKFLOW_SERVER_PROTECTION_BYPASS plumbing from tests.yml.
- Update the pending world-vercel changeset to describe the final
  trusted-sources flow.

* .

* .

* ci: add statuses:read permission for wait-for-vercel-project action

The action queries /commits/{sha}/status (Commit Statuses API) in addition
to the Deployments API, in order to extract the Vercel `dpl_...` ID. With
an explicit permissions block in place, GITHUB_TOKEN now needs
`statuses: read` or the action 403s when resolving the deployment ID.

Reported by Copilot review on #1882.

* ci(docs): log status code and body when waitForServer times out

Helps diagnose deployment-protection / OIDC-trusted-source bypass
failures (e.g. SSO redirects) on the workflow-docs preview.

* ci(docs): log OIDC token claims (aud, repository, etc.) for diagnostics

Helps determine whether the bypass is failing because of missing
trusted-source config, claim mismatch, or audience mismatch.

* ci(docs): add curl debug step to verify OIDC header reaches Vercel

* .

* ci: remove debug logging now that trusted-sources config is correct

The fetch-failure root cause was the trusted-sources rule format: the
labs workbench projects had been PATCHed with just `to.slugs` (no
`preset`), but Vercel's edge requires the dashboard-form-style
`to.preset: 'all-custom'` field plus `development` in the slug list to
match incoming requests. After re-PATCHing all projects with the
correct format, the bypass works end-to-end.

* ci(docs): debug — test trusted-sources bypass against docs and labs deployments

Trying repository_owner claim added to one labs project to see if that
fixes the bypass.

* ci(docs): revert curl debug step

The GitHub Actions OIDC trusted-sources bypass returns 401 on all tested
projects regardless of claim configuration (including workflow-docs which
was set up via the dashboard). This is not a per-project config issue.
Need to investigate with Vercel team before continuing.

* ci(docs): probe trusted-sources bypass and surface x-vercel-id

Adds a debug step that does two HEAD requests against the docs preview
deployment (with and without the OIDC trusted-sources header) and prints
the response status line plus `x-vercel-id` for each. The proxy-side
trusted-sources changes for GitHub Actions OIDC tokens are rolling out
gradually (~12+ hours), so the edge-node identifier in `x-vercel-id`
helps explain why a request might succeed or fail during the rollout
window.

Also includes `x-vercel-id` in the `waitForServer` timeout error so
post-mortem analysis of failing runs has the same edge-node info.

* ci(docs): drop trusted-sources curl probe — bypass works once proxy fix reaches the serving edge node

The probe served its purpose: confirmed the bypass is functional once
the request lands on a region that has the proxy-side trusted-sources
fix rolled out. The waitForServer error message still surfaces
x-vercel-id for any future rollout-window debugging.

* .

* world-vercel: log outbound OIDC token claims once per process

Adds a one-shot diagnostic that prints the non-sensitive claims of the
OIDC token (`iss`, `aud`, `owner_id`, `project_id`, `environment`,
`sub`, `scope`, `exp`) on the first request that uses bearer auth.

This is invaluable for debugging Vercel deployment-protection
trusted-source rule mismatches: a 401 from the edge tells you nothing
about why the rule didn't match, and the token's claims are the only
thing that determines that. The signature is never logged.

Gated to once per process — Vercel-issued tokens are process-stable for
the lambda's lifetime so further log lines would just be redundant
spam.

* world-vercel: route trusted-sources header through getVercelOidcToken()

The Authorization bearer correctly preferred config.token (a static
Vercel auth token from CLI / Actions runner) and fell back to
getVercelOidcToken() inside a Vercel function. But the trusted-sources
bypass header (x-vercel-trusted-oidc-idp-token) was being read directly
from process.env.VERCEL_OIDC_TOKEN inside getHeaders(). That env var is
the bake-time token, frozen at deployment-creation time — on a project
that has been redeployed after a settings change, it carries stale
claims (e.g. an iss from when the project was briefly in 'global' mode)
that no longer match the workflow-server's trusted-sources rule.

Move trusted-sources header attachment from getHeaders() (sync) to
getHttpConfig() (async) and source it from getVercelOidcToken(). That
function reads getContext().headers['x-vercel-oidc-token'] first — a
freshly minted per-request token that always reflects current project
settings — and only falls back to the env var when that header is
missing.

Bearer auth source remains config.token-first.

Also expand the diagnostic to log claims from BOTH the per-request OIDC
token AND the bake-time env var so the divergence is visible in logs
when debugging future trusted-source mismatches.

Removes the now-misleading getProtectionBypassHeader() helper (its
'read env var directly' semantics were exactly the bug).

* world-vercel: skip OIDC trusted-sources header on proxied path

The two outbound flows have different auth requirements:

  1. Proxied (usingProxy=true) — calls api.vercel.com/v1/workflow.
     Public endpoint, authenticated with a static Vercel auth token via
     config.token. The api-workflow proxy mints its own OIDC token
     before forwarding to workflow-server, so the trusted-sources
     bypass header on the SDK→proxy hop is meaningless. CLI, GitHub
     Actions, and other API-client callers take this path.

  2. Direct (usingProxy=false) — runs inside a Vercel deployment
     talking straight to workflow-server. workflow-server validates a
     Vercel OIDC bearer; Vercel's edge validates the trusted-sources
     header. Both must come from getVercelOidcToken() (the per-request
     fresh token), not process.env.VERCEL_OIDC_TOKEN (the bake-time
     token that can be stale after a project config change).

Previously getHttpConfig attached x-vercel-trusted-oidc-idp-token on
both paths whenever getVercelOidcToken() resolved. That accidentally
forwarded the GitHub Actions OIDC token (when wired into
VERCEL_OIDC_TOKEN by the test runner) onto every SDK→proxy request,
which is harmless but wrong-by-design — the proxy is public, doesn't
look at that header on its inbound side, and the GHA token isn't its
intended audience.

Bearer auth source rules:
  - Proxied: only config.token. (No fallback to OIDC; that auth
    pathway doesn't go through the proxy's auth checks.)
  - Direct: config.token (for tests / local dev), falling back to
    getVercelOidcToken() (for Vercel-runtime calls).

* world-vercel: throw if proxied path is hit without a Vercel auth token

The api-workflow proxy authenticates the caller with a regular Vercel
auth token (not OIDC), so reaching the proxied path with no
config.token is always wrong: the proxy will reject the request and
the SDK caller would see an opaque 401 with no actionable hint.

Throw at config-resolution time with a clear message that points to
the WORKFLOW_VERCEL_AUTH_TOKEN env var the SDK reads from. Adds tests
covering both the no-token-throws case and the with-token-attaches-
bearer-and-skips-trusted-sources case.

* test(e2e): include x-vercel-id in startWorkflowViaHttp error message

When the trusted-sources bypass returns 401, the error message now
surfaces the response's x-vercel-id header so we can identify which
edge node served the failure. Helps distinguish proxy-rollout
incompleteness from actual config errors during incremental
rollouts of edge-side changes.

* ci: mint GHA OIDC tokens on demand to survive 5-minute expiry

GitHub Actions OIDC tokens have a hard 5-minute lifetime that cannot be
extended (no API to ask for a longer TTL — exp is always iat + ~300s).
Pre-minting once at the start of the job and shipping the result down
to the test runner via env var means tests that run late in the suite
hit an expired token and 401 on /api/trigger-pages (and any other
trusted-sources protected endpoint).

Move minting into scripts/trusted-sources-headers.mjs:
  - getTrustedSourcesHeaders() is now async.
  - It calls the runner's ACTIONS_ID_TOKEN_REQUEST_URL endpoint directly
    (the env vars GHA exposes when permissions: id-token: write is on)
    and re-mints 60s before the cached token's exp.
  - Falls back to process.env.VERCEL_OIDC_TOKEN for non-GHA contexts
    (Vercel runtime, local dev).

Workflow files drop the now-redundant 'Mint OIDC token' step and the
VERCEL_OIDC_TOKEN env-var passthrough on the test step. The runner env
vars propagate to subsequent steps automatically.

Updates all 17 callers in e2e.test.ts / bench.bench.ts / utils.ts /
docs/scripts/check-docs-smoke.mjs to await the now-async call.

* address PR #1882 code review

- Drop `statuses: read` from the three workflow permission blocks (the
  wait-for-vercel-project action works without it on a public repo).
- Revert the `x-vercel-id` debug logging in `startWorkflowViaHttp`.
- Delete `packages/world-vercel/src/jwt-claims.ts` (debug-only helper).
- Drop the JWT claims diagnostic logging from `getHttpConfig`.
- Tighten the auth-flow comment in `getHttpConfig` and remove the
  historical 'no longer attaches' note from `getHeaders`/its test.
- Restore `.changeset/world-vercel-protection-bypass.md` (already
  shipped in a beta release per .changeset/pre.json).
- Trim the `.changeset/world-vercel-trusted-sources.md` description to
  one short paragraph.

* docs(AGENTS): document local VERCEL_OIDC_TOKEN via vercel env pull

Configured trustedSources.projects on all 11 workbench app projects so
each one accepts a Vercel-issued OIDC token from any of the others. A
developer running e2e locally can now do `vercel env pull` from any
workbench app's directory and use the resulting VERCEL_OIDC_TOKEN to
bypass Deployment Protection on any of the workbench preview/prod
deployments — no need to disable protection on the project just to run
the suite locally.
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 2, 2026

🦋 Changeset detected

Latest commit: 37a537d

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

This PR includes changesets to release 18 packages
Name Type
@workflow/world-vercel Minor
@workflow/cli Patch
@workflow/core Patch
@workflow/web Patch
workflow Patch
@workflow/world-testing Patch
@workflow/builders Patch
@workflow/next Patch
@workflow/nitro Patch
@workflow/vitest Patch
@workflow/web-shared Patch
@workflow/ai 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

@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented May 2, 2026

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

Project Deployment Actions Updated (UTC)
example-nextjs-workflow-turbopack Ready Ready Preview, Comment May 2, 2026 11:41am
example-nextjs-workflow-webpack Ready Ready Preview, Comment May 2, 2026 11:41am
example-workflow Ready Ready Preview, Comment May 2, 2026 11:41am
workbench-astro-workflow Ready Ready Preview, Comment May 2, 2026 11:41am
workbench-express-workflow Ready Ready Preview, Comment May 2, 2026 11:41am
workbench-fastify-workflow Ready Ready Preview, Comment May 2, 2026 11:41am
workbench-hono-workflow Ready Ready Preview, Comment May 2, 2026 11:41am
workbench-nitro-workflow Ready Ready Preview, Comment May 2, 2026 11:41am
workbench-nuxt-workflow Ready Ready Preview, Comment May 2, 2026 11:41am
workbench-sveltekit-workflow Ready Ready Preview, Comment May 2, 2026 11:41am
workbench-vite-workflow Ready Ready Preview, Comment May 2, 2026 11:41am
workflow-swc-playground Ready Ready Preview, Comment May 2, 2026 11:41am
workflow-web Ready Ready Preview, Comment May 2, 2026 11:41am
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
workflow-docs Skipped Skipped May 2, 2026 11:41am

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 2, 2026

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 901 0 67 968
✅ 💻 Local Development 970 0 86 1056
✅ 📦 Local Production 970 0 86 1056
✅ 🐘 Local Postgres 970 0 86 1056
✅ 🪟 Windows 88 0 0 88
❌ 🌍 Community Worlds 139 83 0 222
✅ 📋 Other 246 0 18 264
Total 4284 83 343 4710

❌ Failed Tests

🌍 Community Worlds (83 failed)

mongodb (11 failed):

  • readableStreamWorkflow | wrun_01KQNT4NH5JF117WZNGX2TWX02
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KQNT5BKWA0SFB75PKSXFBY3S
  • webhookWorkflow | wrun_01KQNT5MEYA1KVXYBG00TZ6CS1
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getStreamChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getStreamChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getStreamChunks getStreamChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions | wrun_01KQNT8SQ0S09D92XWK9T9DB4Q
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KQNTDC36R35BBSTR373VCRP2
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KQNTKN5BFD9HCJCEHQS0QDDP

redis (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KQNT5BKWA0SFB75PKSXFBY3S
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getStreamChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getStreamChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getStreamChunks getStreamChunks returns same content as reading the stream
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KQNTDC36R35BBSTR373VCRP2
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KQNTKN5BFD9HCJCEHQS0QDDP

turso (65 failed):

  • addTenWorkflow | wrun_01KQNT44S11HEH2KR52DHPW51P
  • addTenWorkflow | wrun_01KQNT44S11HEH2KR52DHPW51P
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_01KQNT4EYQ40B3MKJE2CAJK4XT
  • should work with react rendering in step
  • promiseAllWorkflow | wrun_01KQNT4C76P26WJMV427SZ2NGA
  • promiseRaceWorkflow | wrun_01KQNT4GK7584E13TSQS4K7XXW
  • promiseAnyWorkflow | wrun_01KQNT4JS7M25R8600JC7ZP4M9
  • importedStepOnlyWorkflow | wrun_01KQNT4V2RER4GDP1F0TK0Q2CH
  • readableStreamWorkflow | wrun_01KQNT4NH5JF117WZNGX2TWX02
  • hookWorkflow | wrun_01KQNT507DM3GKSWJ6KW3DTE4N
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KQNT5BKWA0SFB75PKSXFBY3S
  • webhookWorkflow | wrun_01KQNT5MEYA1KVXYBG00TZ6CS1
  • sleepingWorkflow | wrun_01KQNT5T3VFXCZ4WR3R0ZWNZG1
  • parallelSleepWorkflow | wrun_01KQNT680BR6CG7N801J1Z4QQD
  • nullByteWorkflow | wrun_01KQNT6BA87T09SSZ52ZDY4BDA
  • workflowAndStepMetadataWorkflow | wrun_01KQNT6DCTBC1KHX6S318HDN52
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getStreamChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getStreamChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getStreamChunks getStreamChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions | wrun_01KQNT8SQ0S09D92XWK9T9DB4Q
  • fetchWorkflow | wrun_01KQNT97BXDEM6626A90GC5F39
  • promiseRaceStressTestWorkflow | wrun_01KQNT9B18D8PBG9SMNQKHRWVP
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_01KQNTCS54VM7YRBSN94KDZ2SC
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KQNTDC36R35BBSTR373VCRP2
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_01KQNTE0AS5X3QYEK854KZW939
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_01KQNTEK1THSSNPHG4HX2F5TH0
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_01KQNTETRVXAPAC49N7WGFBGR6
  • closureVariableWorkflow - nested step functions with closure variables | wrun_01KQNTEZJWERFDNMK17A5ZT537
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_01KQNTF1PP531WPH5WJM2R05RK
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_01KQNTFFCP6PVTVVAQP0JD1ZC1
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_01KQNTFMB0Q2T4G81Z82X8JXKF
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_01KQNTG04D6KYD100ZB8HFGDTQ
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_01KQNTG652W1NCQBX9HJHNZG27
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_01KQNTGCCGYKW20ZZKB78Y17W2
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KQNTGJKS9N0186N3X13D8JAK
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_01KQNTGSR4GFBF804KG73F9Q29
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_01KQNTH3ZGA7J6064WA8RPZEKM
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_01KQNTHCFRWHT0QXQBR11APV36
  • cancelRun - cancelling a running workflow | wrun_01KQNTHJHHQVHJES8R3NTG4BWT
  • cancelRun via CLI - cancelling a running workflow | wrun_01KQNTHV39MC3JRWYRN612QW7A
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_01KQNTJ5VXGD68RRYMFG2WVE1M
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_01KQNTJX6SCWSH98BDCY4HMWVH
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KQNTKA4Z462T5562STE2XNVB
  • importMetaUrlWorkflow - import.meta.url is available in step bundles | wrun_01KQNTKGGX8XZT1BAKH2W8PDNC
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) | wrun_01KQNTKJS2N7THQAF6GE3B8GTD
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KQNTKN5BFD9HCJCEHQS0QDDP

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 81 0 7
✅ example 81 0 7
✅ express 81 0 7
✅ fastify 81 0 7
✅ hono 81 0 7
✅ nextjs-turbopack 86 0 2
✅ nextjs-webpack 86 0 2
✅ nitro 81 0 7
✅ nuxt 81 0 7
✅ sveltekit 81 0 7
✅ vite 81 0 7
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 82 0 6
✅ express-stable 82 0 6
✅ fastify-stable 82 0 6
✅ hono-stable 82 0 6
✅ nextjs-turbopack-canary 69 0 19
✅ nextjs-turbopack-stable 88 0 0
✅ nextjs-webpack-canary 69 0 19
✅ nextjs-webpack-stable 88 0 0
✅ nitro-stable 82 0 6
✅ nuxt-stable 82 0 6
✅ sveltekit-stable 82 0 6
✅ vite-stable 82 0 6
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 82 0 6
✅ express-stable 82 0 6
✅ fastify-stable 82 0 6
✅ hono-stable 82 0 6
✅ nextjs-turbopack-canary 69 0 19
✅ nextjs-turbopack-stable 88 0 0
✅ nextjs-webpack-canary 69 0 19
✅ nextjs-webpack-stable 88 0 0
✅ nitro-stable 82 0 6
✅ nuxt-stable 82 0 6
✅ sveltekit-stable 82 0 6
✅ vite-stable 82 0 6
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 82 0 6
✅ express-stable 82 0 6
✅ fastify-stable 82 0 6
✅ hono-stable 82 0 6
✅ nextjs-turbopack-canary 69 0 19
✅ nextjs-turbopack-stable 88 0 0
✅ nextjs-webpack-canary 69 0 19
✅ nextjs-webpack-stable 88 0 0
✅ nitro-stable 82 0 6
✅ nuxt-stable 82 0 6
✅ sveltekit-stable 82 0 6
✅ vite-stable 82 0 6
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 88 0 0
❌ 🌍 Community Worlds
App Passed Failed Skipped
✅ mongodb-dev 5 0 0
❌ mongodb 58 11 0
✅ redis-dev 5 0 0
❌ redis 62 7 0
✅ turso-dev 5 0 0
❌ turso 4 65 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 82 0 6
✅ e2e-local-postgres-nest-stable 82 0 6
✅ e2e-local-prod-nest-stable 82 0 6

📋 View full workflow run

@VaguelySerious VaguelySerious marked this pull request as ready for review May 2, 2026 12:41
@VaguelySerious VaguelySerious enabled auto-merge (squash) May 2, 2026 12:42
@VaguelySerious VaguelySerious merged commit 677867b into stable May 3, 2026
410 of 472 checks passed
@VaguelySerious VaguelySerious deleted the peter/backport-1882-stable branch May 3, 2026 02:45
@github-actions github-actions Bot mentioned this pull request May 4, 2026
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