Skip to content

[world] Deprecate runs.experimentalSetAttributes and remove the unused attributes bridge - #5406

Draft
pranaygp wants to merge 2 commits into
mainfrom
world-runs-set-attributes
Draft

pranaygp wants to merge 2 commits into
mainfrom
world-runs-set-attributes

Conversation

@pranaygp

@pranaygp pranaygp commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

Deprecates the optional World method runs.experimentalSetAttributes (and ExperimentalSetAttributesResult) instead of renaming it, and removes the __builtin_set_attributes step bridge, its only caller. Nothing in the current SDK can reach either: setAttributes() writes attr_set events through events.create.

Why

The method looked like part of the attributes API, and the World docs said run attributes depend on it. They don't. Since workflow 5.0.0-beta.15 (#2226), setAttributes() and start(..., { attributes }) write through the event log. The direct write survived only as a dead step and an optional interface member that new World authors were told to implement.

Reachability (why it is dead for the current SDK)

  • No dispatch: __builtin_set_attributes was referenced only by its own definition. The workflow-body path dispatches WORKFLOW_SET_ATTRIBUTES to createSetAttributes (core/src/workflow.ts:719-724), and the QuickJS / spec 9 engine does the same with a pending attribute op (core/src/runtime/quickjs-runtime.ts:1066). The step-body path calls events.create with attr_set (core/src/set-attributes.ts). Neither calls useStep('__builtin_set_attributes') or runs.experimentalSetAttributes.
  • MVP-era runs: the bridge was dispatched only by 5.0.0-beta.8 to beta.14. Those runs are spec 3 with ULID event IDs. A v5 runtime cannot replay them: its writes derive eventCount from the loaded log through maxEventSlot → requireEventSlot, which throws on a non-slot ID (core/src/runtime/helpers.ts:980-989, slotSnapshotParams at :1201, spec8/suspension-handler.ts:599). The upgrading-to-v5 callout already documents that pre-v5 runs must drain on their old build. Even if a replay got that far, the current VM writes attr_set where the log recorded a step_created, so it would not call the step.
  • Stale step messages: steps queued by those betas went to __wkf_step_* topics, which were retired in 5.0.0-beta.37 (Remove retired v1 step route plumbing #3061) and are not consumed by current Worlds. On Vercel, messages and runs stay on the deployment that created them.
  • Cross-deployment starts: a run executes on its target deployment's bundled SDK and World, so the current SDK's builtins are never involved.

Why the first-party implementations stay

Old SDKs can still call the method. workflow 5.0.0-beta.8 to beta.14 call runs.experimentalSetAttributes (the workflow-body bridge, and step bodies from beta.9). workflow → @workflow/core → world-local / world-vercel are exact pins (workspace:*), so the default pairing is always same-release. But world-postgres declares no peer dependency on workflow or @workflow/core, any World can be selected by package name through WORKFLOW_TARGET_WORLD, and those betas have no World spec-range check (core/src/runtime/world-compatibility.ts doesn't exist there). So a newer World package can be installed next to one of them. world-local, world-postgres and world-vercel are left unchanged, and the /v2/runs/:runId/attributes endpoint is untouched.

Changes

  • @workflow/world: runs.experimentalSetAttributes and ExperimentalSetAttributesResult are marked @deprecated. The JSDoc says the SDK no longer calls the method, attributes are attr_set / run_created events, new Worlds should not implement it, and which releases were the last callers.
  • workflow: removes __builtin_set_attributes and its test.
  • core: adds a test that a step-body setAttributes() writes attr_set and never calls runs.experimentalSetAttributes, even when the World has it.
  • Docs: building-a-world drops the method from the Storage interface and adds a short "Run attributes" rule (validate and materialize attr_set / run_created attributes atomically; reject attr_set on a terminal run). upgrading-to-v5 drops the row claiming attributes depend on the method.
  • packages/core/src/attributes-mvp.md records the retirement, and both migration skills (versions bumped) stop recommending the method.
  • Changesets: @workflow/world patch (deprecation), workflow patch (bridge removal).

Validation

  • tsc --noEmit passes in world, world-local, world-postgres, world-vercel, workflow, core.
  • Tests pass:
    • world: 300
    • world-local: 637
    • world-vercel: 1194
    • workflow: 10
    • core attribute tests: 34
    • world-postgres test/storage.test.ts: 183, against Postgres in Docker
  • Full core suite: 4594 passed (6 expected fail, 24 skipped).
  • Not run locally: world-testing and world-postgres's spec.test.ts (both need the Rust-built SWC plugin), the rest of the world-postgres suite (container-heavy), and e2e.

Keep experimentalSetAttributes as a deprecated optional alias on the World interface; callers prefer runs.setAttributes and fall back to the old name.

Signed-off-by: Pranay Prakash <pranay.gp@gmail.com>
Co-authored-by: vercel-v[bot] <353008837+vercel-v[bot]@users.noreply.github.com>
@changeset-bot

changeset-bot Bot commented Nov 13, 2026 •

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 611553b

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

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

vercel Bot commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

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

Project Deployment Actions Updated
example-nextjs-workflow-turbopack Ready Ready Preview, v0 Nov 13, 2026 3:08am UTC
example-nextjs-workflow-webpack Ready Ready Preview, v0 Nov 13, 2026 3:08am UTC
example-workflow Ready Ready Preview, v0 Nov 13, 2026 3:08am UTC
workbench-astro-workflow Ready Ready Preview, v0 Nov 13, 2026 3:08am UTC
workbench-express-workflow Ready Ready Preview, v0 Nov 13, 2026 3:08am UTC
workbench-fastify-workflow Ready Ready Preview, v0 Nov 13, 2026 3:08am UTC
workbench-hono-workflow Ready Ready Preview, v0 Nov 13, 2026 3:08am UTC
workbench-nestjs-workflow Ready Ready Preview, v0 Nov 13, 2026 3:08am UTC
workbench-nitro-workflow Ready Ready Preview, v0 Nov 13, 2026 3:08am UTC
workbench-nuxt-workflow Ready Ready Preview, v0 Nov 13, 2026 3:08am UTC
workbench-python-workflow Ready Ready Preview, v0 Nov 13, 2026 3:08am UTC
workbench-sveltekit-workflow Ready Ready Preview, v0 Nov 13, 2026 3:08am UTC
workbench-tanstack-start-workflow Ready Ready Preview, v0 Nov 13, 2026 3:08am UTC
workbench-vite-workflow Ready Ready Preview, v0 Nov 13, 2026 3:08am UTC
workflow-docs Ready Ready Preview, v0 Nov 13, 2026 3:08am UTC
workflow-swc-playground Ready Ready Preview, v0 Nov 13, 2026 3:08am UTC
workflow-tarballs Ready Ready Preview, v0 Nov 13, 2026 3:08am UTC
workflow-web Ready Ready Preview, v0 Nov 13, 2026 3:08am UTC

@github-actions

github-actions Bot commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit 611553b · Fri, 13 Nov 2026 03:20:26 GMT · run logs

Backend: vercel · app: nextjs-turbopack

Metric Scenario Best (ms) P75 (ms) P90 (ms) P99 (ms) Samples
TTFS step 2085 (+53%) 🔻 2232 🔴 (+54%) 🔻 2271 🔴 (+49%) 🔻 2346 🔴 (+48%) 🔻 30
TTFS stream 2085 (+127%) 🔻 2163 🔴 (+50%) 🔻 2193 🔴 (+50%) 🔻 2230 🔴 (+50%) 🔻 30
TTFS hook + stream 2308 (+45%) 🔻 2436 🔴 (+43%) 🔻 2505 🔴 (+41%) 🔻 5278 🔴 (+181%) 🔻 30
Fan-out TTFS Promise.all(100 steps) 476 (+42%) 🔻 918 (+16%) 🔻 2367 (+105%) 🔻 2434 (+23%) 🔻 10
Fan-out TTLS Promise.all(100 steps) 2239 (+53%) 🔻 3112 (-21%) 💚 4106 (-12%) 8602 (+58%) 🔻 10
STSO 1020 steps (inline) 93 (-8.8%) 118 (-13%) 132 (-15%) 184 (-15%) 💚 1019
WO 1020 steps 119705 (-10%) 119705 (-10%) 119705 (-10%) 119705 (-10%) 1
📈 STSO distribution vs main (inline / queue-hop histograms)

1020 steps (inline)

Cumulative STSO time: main 133047ms → this run 117578ms (Δ -15469ms, -12%)

 50-100 ms  ┃                         main   0  this   4    +4
100-150 ms  ██████████████████████░┃  main 892  this 968   +76
150-200 ms  ┃██                       main 112  this  42   -70
200-250 ms  ┃                         main   9  this   3    -6
250-300 ms  ┃                         main   5  this   1    -4
300-350 ms  ┃                         main   0  this   1    +1
350-400 ms  ┃                         main   1  this   0    -1
📜 Previous results (1)

c8254e6

Fri, 13 Nov 2026 02:49:19 GMT · run logs

vercel / nextjs-turbopack

Metric Scenario Best (ms) P75 (ms) P90 (ms) P99 (ms) Samples
TTFS step 256 (+2.8%) 1829 🔴 (+26%) 🔻 2106 🔴 (+39%) 🔻 2147 🔴 (+13%) 30
TTFS stream 235 (-1.3%) 1856 🔴 (+38%) 🔻 2071 🔴 (+51%) 🔻 2155 🔴 (+43%) 🔻 30
TTFS hook + stream 392 (+13%) 1883 🔴 (+19%) 🔻 1963 🔴 (+18%) 🔻 2020 🔴 (+19%) 🔻 30
Fan-out TTFS Promise.all(100 steps) 394 (+9.4%) 577 (-2.5%) 917 (+49%) 🔻 2548 (+49%) 🔻 10
Fan-out TTLS Promise.all(100 steps) 1429 (+41%) 🔻 3565 (-12%) 3888 (-7.4%) 4075 (-41%) 💚 10
STSO 1020 steps (inline) 98 (+13%) 146 (+13%) 175 (+2.3%) 294 (-16%) 💚 1019
WO 1020 steps 141445 (+11%) 141445 (+11%) 141445 (+11%) 141445 (+11%) 1
ℹ️ Metric definitions & methodology

The collapsed STSO distribution section above buckets every step gap, split inline (same warm process — pure framework overhead) vs queue-hop (fresh process — dispatch, reinit, replay). █ = main, ┃ = this run, ░ = fill.

Best/P75/P90/P99 deltas compare against the most recent benchmark run on main at the time of this run. 🔻 flags a delta worse than +15%, 💚 one better than −15%.

Metrics — TTFS: time to first step body (in-deployment start() → first step body) · Fan-out TTFS: fan-out time to first step (in-deployment start() → first of the parallel step bodies to complete) · Fan-out TTLS: fan-out time to last step (in-deployment start() → last of the parallel step bodies to complete, i.e. when the Promise.all resolves) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · Promise.all(100 steps): 100 trivial no-op steps started together in a single Promise.all; Fan-out TTFS is the first of them to complete and Fan-out TTLS the last, both from the in-deployment clientStart, so their gap is the spread the runtime adds across the fan-out

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600

All timestamps are deployment-side; runs are triggered in-deployment, so the CI runner and api.vercel.com sit outside every measured window. TTFS = start() → first step body (includes dispatch + any cold start); Fan-out TTFS/TTLS = first/last step completion of one Promise.all from the same anchor (the gap is the runtime’s fan-out spread); STSO/WO between step bodies. Streaming delivery performance is measured in durabench.

Cold starts stay in the numbers (real bursty-workload latency, inflates P75+); Best is the warm floor.

@github-actions

github-actions Bot commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

✅ All tests passed

⚠️ Flaky E2E Tests (passed on retry)

These tests failed at least once and passed on a retry. A recurring entry here is a real race worth investigating.

  • fibonacciWorkflow - recursive workflow composition via start() (hono · vercel-prod / vercel / quickjs / production) — flaked in 2 jobs
  • distributedAbortController - manual abort triggers signal (unknown)
  • fibonacciWorkflow - recursive workflow composition via start() (vite · vercel-prod / vercel / node / production)
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running (unknown)
  • instanceMethodStepWorkflow - instance methods with "use step" directive (unknown)
  • readableStreamWorkflow (nextjs-webpack · vercel-prod / vercel / quickjs / production)
  • resumes the owner immediately after admission, before the run has started (unknown)
  • with no retention, the token is released when the run ends (sveltekit · vercel-prod / vercel / quickjs / production)

🛠 Infra Events (absorbed by the harness)

Platform anomalies the e2e harness detected and worked around (e.g. a run the queue never picked up, replaced by a fresh run). Clustered timestamps indicate a backend blip; a steady drip indicates a platform issue worth escalating.

  • run-pickup-stall · runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries (nitro) · at 03:10:24Z · abandoned wrun_41M79E4JMR0GV9SJEYR1RBCHRA
  • run-pickup-stall · a run can take over its own earlier hook (sveltekit) · at 03:10:25Z · abandoned wrun_41M79E4KMQ0GVP1HFBP2E86H4G
  • run-pickup-stall · StepNotRegisteredError fails the run when not caught in workflow (nextjs-turbopack) · at 03:10:57Z · abandoned wrun_41M79E5JMP0GMP4WBZ41P9PX9B
  • run-pickup-stall · runs app-generated source against a registered step (tanstack-start) · at 03:10:57Z · abandoned wrun_01M79E5MPC9S74786X97JS2C3D
  • run-pickup-stall · fires constructor + stream callbacks with the tool result (nextjs-turbopack) · at 03:10:59Z · abandoned wrun_41M79E5MBZ0GXJYGZH49FTBFNH
  • cold-start-warmup · suite warmup (tanstack-start) · at 03:11:10Z · abandoned wrun_01M79E5MPWSTFFW775J6QMWWS5
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (nextjs-webpack) · at 03:20:45Z · abandoned wrun_01M79EQJZVZZ140V7EJV3BN6GK

E2E Test Summary

Summary
Passed Failed Skipped Total
✅ ▲ Vercel Production 4649 0 940 5589
✅ 💻 Local Development 5272 0 731 6003
✅ 📦 Local Production 5272 0 731 6003
✅ 🐘 Local Postgres 5417 0 586 6003
✅ 🪟 Windows 401 0 13 414
✅ dynamic-runs 0 0 0 0
✅ local-postgres-spec9 0 0 364 364
✅ local-spec9 409 0 5 414
✅ vercel-http-transport 1054 0 188 1242
✅ vercel-multi-region 27 0 0 27
✅ vercel-queue-hold 0 0 0 0
✅ vercel-spec9 395 0 19 414
✅ vercel-ws-transport 712 0 116 828
Total 23608 0 3693 27301
Details by Category

✅ ▲ Vercel Production

App Passed Failed Skipped
✅ astro-node 171 0 36
✅ astro-quickjs 170 0 37
✅ example-node 171 0 36
✅ example-quickjs 170 0 37
✅ express-node 171 0 36
✅ express-quickjs 170 0 37
✅ fastify-node 171 0 36
✅ fastify-quickjs 170 0 37
✅ hono-node 171 0 36
✅ hono-quickjs 170 0 37
✅ nest-node 171 0 36
✅ nest-quickjs 170 0 37
✅ nextjs-turbopack-node 199 0 8
✅ nextjs-turbopack-quickjs 198 0 9
✅ nextjs-webpack-node 199 0 8
✅ nextjs-webpack-quickjs 198 0 9
✅ nitro-node 171 0 36
✅ nitro-quickjs 170 0 37
✅ nuxt-node 171 0 36
✅ nuxt-quickjs 170 0 37
✅ python-node 66 0 141
✅ sveltekit-node 190 0 17
✅ sveltekit-quickjs 189 0 18
✅ tanstack-start-node 171 0 36
✅ tanstack-start-quickjs 170 0 37
✅ vite-node 171 0 36
✅ vite-quickjs 170 0 37

✅ 💻 Local Development

App Passed Failed Skipped
✅ astro-stable-node 172 0 35
✅ astro-stable-quickjs 171 0 36
✅ express-stable-node 172 0 35
✅ express-stable-quickjs 171 0 36
✅ fastify-stable-node 172 0 35
✅ fastify-stable-quickjs 171 0 36
✅ hono-stable-node 172 0 35
✅ hono-stable-quickjs 171 0 36
✅ nest-stable-node 172 0 35
✅ nest-stable-quickjs 171 0 36
✅ nextjs-turbopack-canary-node 201 0 6
✅ nextjs-turbopack-canary-quickjs 200 0 7
✅ nextjs-turbopack-quickjs-snapshot 200 0 7
✅ nextjs-turbopack-stable-node 201 0 6
✅ nextjs-turbopack-stable-quickjs 200 0 7
✅ nextjs-webpack-canary-node 201 0 6
✅ nextjs-webpack-canary-quickjs 200 0 7
✅ nextjs-webpack-stable-node 201 0 6
✅ nextjs-webpack-stable-quickjs 200 0 7
✅ nitro-stable-node 172 0 35
✅ nitro-stable-quickjs 171 0 36
✅ nuxt-stable-node 172 0 35
✅ nuxt-stable-quickjs 171 0 36
✅ sveltekit-stable-node 191 0 16
✅ sveltekit-stable-quickjs 190 0 17
✅ tanstack-start-node 172 0 35
✅ tanstack-start-quickjs 171 0 36
✅ vite-stable-node 172 0 35
✅ vite-stable-quickjs 171 0 36

✅ 📦 Local Production

App Passed Failed Skipped
✅ astro-stable-node 172 0 35
✅ astro-stable-quickjs 171 0 36
✅ express-stable-node 172 0 35
✅ express-stable-quickjs 171 0 36
✅ fastify-stable-node 172 0 35
✅ fastify-stable-quickjs 171 0 36
✅ hono-stable-node 172 0 35
✅ hono-stable-quickjs 171 0 36
✅ nest-stable-node 172 0 35
✅ nest-stable-quickjs 171 0 36
✅ nextjs-turbopack-canary-node 201 0 6
✅ nextjs-turbopack-canary-quickjs 200 0 7
✅ nextjs-turbopack-quickjs-snapshot 200 0 7
✅ nextjs-turbopack-stable-node 201 0 6
✅ nextjs-turbopack-stable-quickjs 200 0 7
✅ nextjs-webpack-canary-node 201 0 6
✅ nextjs-webpack-canary-quickjs 200 0 7
✅ nextjs-webpack-stable-node 201 0 6
✅ nextjs-webpack-stable-quickjs 200 0 7
✅ nitro-stable-node 172 0 35
✅ nitro-stable-quickjs 171 0 36
✅ nuxt-stable-node 172 0 35
✅ nuxt-stable-quickjs 171 0 36
✅ sveltekit-stable-node 191 0 16
✅ sveltekit-stable-quickjs 190 0 17
✅ tanstack-start-node 172 0 35
✅ tanstack-start-quickjs 171 0 36
✅ vite-stable-node 172 0 35
✅ vite-stable-quickjs 171 0 36

✅ 🐘 Local Postgres

App Passed Failed Skipped
✅ astro-stable-node 177 0 30
✅ astro-stable-quickjs 176 0 31
✅ express-stable-node 177 0 30
✅ express-stable-quickjs 176 0 31
✅ fastify-stable-node 177 0 30
✅ fastify-stable-quickjs 176 0 31
✅ hono-stable-node 177 0 30
✅ hono-stable-quickjs 176 0 31
✅ nest-stable-node 177 0 30
✅ nest-stable-quickjs 176 0 31
✅ nextjs-turbopack-canary-node 206 0 1
✅ nextjs-turbopack-canary-quickjs 205 0 2
✅ nextjs-turbopack-quickjs-snapshot 205 0 2
✅ nextjs-turbopack-stable-node 206 0 1
✅ nextjs-turbopack-stable-quickjs 205 0 2
✅ nextjs-webpack-canary-node 206 0 1
✅ nextjs-webpack-canary-quickjs 205 0 2
✅ nextjs-webpack-stable-node 206 0 1
✅ nextjs-webpack-stable-quickjs 205 0 2
✅ nitro-stable-node 177 0 30
✅ nitro-stable-quickjs 176 0 31
✅ nuxt-stable-node 177 0 30
✅ nuxt-stable-quickjs 176 0 31
✅ sveltekit-stable-node 196 0 11
✅ sveltekit-stable-quickjs 195 0 12
✅ tanstack-start-node 177 0 30
✅ tanstack-start-quickjs 176 0 31
✅ vite-stable-node 177 0 30
✅ vite-stable-quickjs 176 0 31

✅ 🪟 Windows

App Passed Failed Skipped
✅ nextjs-turbopack-node 201 0 6
✅ nextjs-turbopack-quickjs 200 0 7

✅ dynamic-runs

App Passed Failed Skipped
✅ astro-vercel 0 0 0
✅ example-vercel 0 0 0
✅ express-vercel 0 0 0
✅ fastify-vercel 0 0 0
✅ hono-vercel 0 0 0
✅ nest-vercel 0 0 0
✅ nextjs-turbopack-vercel 0 0 0
✅ nextjs-webpack-vercel 0 0 0
✅ nitro-vercel 0 0 0
✅ nuxt-vercel 0 0 0
✅ sveltekit-vercel 0 0 0
✅ tanstack-start-vercel 0 0 0
✅ vite-vercel 0 0 0

✅ local-postgres-spec9

App Passed Failed Skipped
✅ nextjs-turbopack-stable-node 0 0 182
✅ nextjs-turbopack-stable-quickjs 0 0 182

✅ local-spec9

App Passed Failed Skipped
✅ nextjs-turbopack-node 205 0 2
✅ nextjs-turbopack-quickjs 204 0 3

✅ vercel-http-transport

App Passed Failed Skipped
✅ example 171 0 36
✅ express 171 0 36
✅ hono 171 0 36
✅ nextjs-turbopack 199 0 8
✅ nitro 171 0 36
✅ vite 171 0 36

✅ vercel-multi-region

App Passed Failed Skipped
✅ nextjs-turbopack 27 0 0

✅ vercel-queue-hold

App Passed Failed Skipped
✅ nextjs-turbopack 0 0 0

✅ vercel-spec9

App Passed Failed Skipped
✅ nextjs-turbopack-node 198 0 9
✅ nextjs-turbopack-quickjs 197 0 10

✅ vercel-ws-transport

App Passed Failed Skipped
✅ example 171 0 36
✅ express 171 0 36
✅ nextjs-turbopack 199 0 8
✅ vite 171 0 36

📋 View full workflow run

@github-actions

github-actions Bot commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

Sim World

Simulated world deterministic testing for races. Traces

🟢 world-sim scenario book — 0 fail of 45 total
scenario outcome events virt replay violations
✅ smoke-no-steps completed 3 0ms ok 0
✅ smoke-one-step completed 5 0ms ok 0
✅ hook-at-step-started completed 9 0ms ok 0
✅ hook-at-step-completed completed 9 0ms ok 0
✅ hook-at-hook-created completed 9 0ms ok 0
✅ claim-hook-at-registration completed 9 0ms ok 0
✅ claim-hook-at-step-started completed 9 0ms ok 0
✅ deadline-hook-wins completed 6 1.0h ok 0
✅ deadline-expires completed 6 1.0h ok 0
✅ step-vs-timer-early-settlement completed 6 1.0h ok 0
✅ long-sleep completed 9 30.0d ok 0
✅ hook-never-arrives stalled 3 0ms skipped 0
✅ step-retries-twice completed 9 2.0s ok 0
✅ parallel-steps completed 7 0ms ok 0
✅ hook-on-execution-state completed 9 0ms ok 0
✅ peek-hook-before-branch completed 9 0ms ok 0
✅ peek-hook-after-branch completed 9 0ms ok 0
✅ peek-hook-at-registration completed 9 0ms ok 0
✅ race-hook-before-probe completed 9 0ms ok 0
✅ race-hook-after-probe completed 9 0ms ok 0
✅ race-duplicate-delivery completed 10 0ms ok 0
✅ attr-hook-before-step completed 9 0ms ok 0
✅ attr-hook-after-step completed 9 0ms ok 0
✅ attr-from-step-body completed 10 0ms ok 0
✅ fork-hook-after-timeout completed 11 1.0m ok 0
✅ fork-hook-before-timeout completed 11 1.0m ok 0
✅ count-hook-after-timeout completed 13 1.0m ok 0
✅ count-hook-before-timeout completed 15 1.0m ok 0
✅ stale-read-step-count-fork completed 15 1.0m ok 0
✅ stale-read-equal-step-counts completed 11 1.0m ok 0
✅ step-vs-step-fork completed 9 0ms ok 0
✅ step-vs-step-fork-fenced completed 9 1.0s ok 0
✅ fence-catches-benign-direction completed 9 1.0s ok 0
✅ run-ahead-fenced-overlap completed 10 1.0s ok 0
✅ in-flight-before-decision completed 15 1.0m ok 0
✅ in-flight-before-decision-counted completed 13 1.0m ok 0
✅ in-flight-after-decision completed 15 2.0m ok 0
✅ stale-read-step-count-fork-fenced completed 15 1.0m ok 0
✅ fork-hook-wins completed 10 1.0m ok 0
✅ fork-timeout-wins completed 10 1.0m ok 0
✅ unclaimed-payload-under-fork completed 14 1.0m ok 0
✅ claimed-payload-under-fork completed 14 1.0m ok 0
✅ writers-independent-step-bodies completed 9 0ms ok 0
✅ writers-scripted-tempo completed 9 0ms ok 0
✅ cancel-mid-step cancelled 6 0ms skipped 0

Full trace: world-sim.txt

@github-actions

github-actions Bot commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor
Framework Flow route Step reg. Framework output
hono 306.2 KiB (-7 B) 123.3 KiB (-664 B) 2.37 MiB (-3.7 KiB)
nextjs-turbopack 397.7 KiB (-7 B) 491 B (±0) 1.13 MiB (-2.5 KiB)
About these numbers

Sizes are gzip; parentheses show the change against main.
Flow route and Step reg. gate this job, on raw bytes rather than the gzip shown, at max(2%, 50.0 KiB). Framework output is informational.

611553b · run

The current SDK writes attributes as attr_set events and never calls the method. Revert the rename, mark the method and ExperimentalSetAttributesResult deprecated, and remove the unreachable __builtin_set_attributes bridge. First-party World implementations stay for workflow 5.0.0-beta.8 to beta.14.

Signed-off-by: Pranay Prakash <pranay.gp@gmail.com>
Co-authored-by: vercel-v[bot] <353008837+vercel-v[bot]@users.noreply.github.com>
@pranaygp pranaygp changed the title [world] Rename runs.experimentalSetAttributes to runs.setAttributes [world] Deprecate runs.experimentalSetAttributes and remove the unused attributes bridge Nov 13, 2026

This branch was successfully deployed

1 active deployment
Preview – workflow-docs — 611553b9 Deployed Nov 13, 2026 by vercel[bot]
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.

1 participant