Skip to content

[core] Allow run_started to record input in absence of run_created - #5270

Merged
VaguelySerious merged 1 commit into
mainfrom
check-if-run-started-without-run-created
Nov 6, 2026
Merged

VaguelySerious merged 1 commit into
mainfrom
check-if-run-started-without-run-created

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

Forward-compat for spec 9, where a resilient start's run_started that creates the run can be written alone at the run's first slot, carrying the creation data, with no separate run_created. This is the run-level counterpart of #4866 (step_started alone as a step's creation).


This PR is reader-side only, like #4866: nothing in this SDK asks a World to write this shape yet. The Vercel backend side is vercel/workflow-server#1372. It writes the shape only for a run_started that sends meta.createsRun, which no SDK sends today. Sending it, and teaching the local Worlds to write it, come in a follow-up once these readers have shipped.

How a reader recognizes the creation: isRunCreationEvent (new in @workflow/world) is true for a run_created, or for a run_started at the first slot. It goes by position, not by input, for two reasons: only a run's creation can hold slot 1 (every World pins or restores it there), and a replay page can be listed without payloads. A first-slot run_started whose input was omitted falls back to the existing sources (queue runInput, the run record), so the rule never makes a reader worse off.

Readers changed:

  • @workflow/core
    • QuickJS (quickjs-runtime.ts) takes the workflow arguments from the creation event. Today a log without run_created and a delivery without runInput (any redelivery) throws "no run_created event found".
    • Spec 9 delivery (spec9/delivery.ts):
      • takes the run input from the creation event, falling back as before;
      • starts the replay payload cache and the workflow compile from it.
    • resolveRunStartHook reads the start Hook from the creation event.
  • @workflow/world-vercel: reconstructRunFromReplayEvents (the run_started / hook_received replay preloads) rebuilds the run from a creating run_started.
  • @workflow/web-shared:
    • the run span starts at the creation event;
    • the run bar reads run_failed as for any event-sourced run, instead of falling back to the V1 status-only bar.
    • The event list view already treats a first run_started with no run_created as the creation.

Turbo: a turbo first delivery holds a run_created it builds at slot 1 without loading the log. When the World answers the run_started at slot 1 instead, the two replay alike. Merging by id keeps the placeholder, so nothing needs replacing; a test covers it.

In-band count: a World that writes this shape keeps the count a log with run_created would have. The creation holds IN_BAND_SEQ_AT_RUN_CREATION and the start the next position, and the run_started write reports allocated: 1, because the writer (turbo in particular) cannot infer that from the slot. This is documented on isRunCreationEvent and IN_BAND_SEQ_AT_RUN_CREATION. vercel/workflow-server#1372 does this.

Tests

  • world/src/slot-identity.test.ts: isRunCreationEvent.

  • core/src/runtime/spec9/run-creation-shape.runtime.test.ts (node and QuickJS), against an AppendOnlyWorld with a new test-only creationOnStart option:

    • a resilient start in this shape;
    • a cold replay of a finished log with no run_created, whose run record holds no input;
    • a redelivery, with no runInput, of a log holding only the creating run_started.

    The last two fail on both engines without the core change.

  • core/src/runtime/spec9/turbo.runtime.test.ts: a turbo resilient start in this shape.

  • core/src/runtime/start-hook-binding.test.ts: the start Hook is read from a first-slot run_started, and not from one above it.

  • world-vercel/src/events.test.ts: the run is reconstructed from a creating run_started (fails without the change).

  • web-shared: the run span start, and run-bar segments for a run with run_failed and no run_created.

Results: pnpm test passes in core (4440), world (303), world-vercel (1162), web-shared (252) and world-local (794). Typecheck passes for the touched packages.

Not changed: world-local, world-postgres and world-sim always write run_created, which stays valid.

🤖 Generated with Claude Code

Forward-compat for spec 9, where a resilient start's run_started that
creates the run can be written alone at the run's first slot, carrying
the creation data, with no separate run_created.

Reader-side support only: nothing in this SDK asks a World to write
this shape yet. The Vercel backend writes it only for a run_started
that opts in (vercel/workflow-server#1372).

Readers recognize the creation by position, not by its input
(isRunCreationEvent: a run_created, or a run_started at the first
slot), since only a creation can hold slot 1 and a replay page may omit
payloads.

Co-Authored-By: Claude <noreply@anthropic.com>

Co-Authored-By: Peter Wielander <29887157+VaguelySerious@users.noreply.github.com>
@VaguelySerious
VaguelySerious requested a review from a team as a code owner November 5, 2026 19:44
@vercel

vercel Bot commented Nov 5, 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 5, 2026 7:48pm UTC
example-nextjs-workflow-webpack Ready Ready Preview, v0 Nov 5, 2026 7:48pm UTC
example-workflow Ready Ready Preview, v0 Nov 5, 2026 7:48pm UTC
workbench-astro-workflow Ready Ready Preview, v0 Nov 5, 2026 7:48pm UTC
workbench-express-workflow Ready Ready Preview, v0 Nov 5, 2026 7:48pm UTC
workbench-fastify-workflow Ready Ready Preview, v0 Nov 5, 2026 7:48pm UTC
workbench-hono-workflow Ready Ready Preview, v0 Nov 5, 2026 7:48pm UTC
workbench-nestjs-workflow Ready Ready Preview, v0 Nov 5, 2026 7:48pm UTC
workbench-nitro-workflow Ready Ready Preview, v0 Nov 5, 2026 7:48pm UTC
workbench-nuxt-workflow Ready Ready Preview, v0 Nov 5, 2026 7:48pm UTC
workbench-python-workflow Ready Ready Preview, v0 Nov 5, 2026 7:48pm UTC
workbench-sveltekit-workflow Ready Ready Preview, v0 Nov 5, 2026 7:48pm UTC
workbench-tanstack-start-workflow Ready Ready Preview, v0 Nov 5, 2026 7:48pm UTC
workbench-vite-workflow Ready Ready Preview, v0 Nov 5, 2026 7:48pm UTC
workflow-docs Ready Ready Preview, v0 Nov 5, 2026 7:48pm UTC
workflow-swc-playground Ready Ready Preview, v0 Nov 5, 2026 7:48pm UTC
workflow-tarballs Ready Ready Preview, v0 Nov 5, 2026 7:48pm UTC
workflow-web Ready Ready Preview, v0 Nov 5, 2026 7:48pm UTC

@changeset-bot

changeset-bot Bot commented Nov 5, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 8660cfc

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/core Patch
@workflow/world-vercel Patch
@workflow/web-shared Patch
@workflow/cli Patch
@workflow/errors Patch
@workflow/vitest Patch
@workflow/web Patch
@workflow/world-local Patch
@workflow/world-postgres Patch
@workflow/world-testing Patch
@workflow/builders Patch
@workflow/next Patch
@workflow/nitro Patch
workflow 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

@github-actions

github-actions Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit 8660cfc · Thu, 05 Nov 2026 20:00:40 GMT · run logs

Backend: vercel · app: nextjs-turbopack

Metric Scenario Best (ms) P75 (ms) P90 (ms) P99 (ms) Samples
TTFS step 324 (-79%) 💚 2122 🔴 (+14%) 2180 🔴 (+14%) 2438 🔴 (+17%) 🔻 30
TTFS stream 286 (-81%) 💚 686 🔴 (-62%) 💚 2088 🔴 (+15%) 2465 🔴 (+33%) 🔻 30
TTFS hook + stream 547 (-69%) 💚 2475 🔴 (+13%) 2584 🔴 (+14%) 5020 🔴 (+109%) 🔻 30
Fan-out TTFS Promise.all(100 steps) 552 (+5.1%) 744 (+1.2%) 881 (-4.1%) 2613 (+38%) 🔻 10
Fan-out TTLS Promise.all(100 steps) 2726 (+5.9%) 4180 (±0%) 4225 (-4.7%) 7993 (+25%) 🔻 10
STSO 1020 steps (inline) 83 (+19%) 🔻 107 (+9.2%) 125 (+5.0%) 226 (+12%) 1019
WO 1020 steps 107878 (+8.2%) 107878 (+8.2%) 107878 (+8.2%) 107878 (+8.2%) 1
📈 STSO distribution vs main (inline / queue-hop histograms)

1020 steps (inline)

Cumulative STSO time: main 99488ms → this run 107573ms (Δ +8085ms, +8%)

 50-100 ms  ███████████████┃████████  main 792  this 536  -256
100-150 ms  ██████░░░░░░░┃            main 206  this 448  +242
150-200 ms  ┃                         main  10  this  17    +7
200-250 ms  ┃                         main   6  this  11    +5
250-300 ms  ┃                         main   1  this   5    +4
300-350 ms  ┃                         main   1  this   1    +0
350-400 ms  ┃                         main   1  this   1    +0
400-450 ms  ┃                         main   2  this   0    -2
ℹ️ 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 5, 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.

  • a run can take over its own earlier hook (nextjs-webpack · local-dev / local / node / canary)
  • RetryableError respects custom retryAfter delay (vite · vercel-http-transport / vercel / node / http)

🛠 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 · runs app-generated source against a registered step (tanstack-start) · at 19:49:45Z · abandoned wrun_01M6PM4QVQJQKQCT8SRXS89VVB
  • cold-start-warmup · suite warmup (tanstack-start) · at 19:49:58Z · abandoned wrun_01M6PM4QVZN3RZYDQ9X89WJJ58
  • run-pickup-stall · WorkflowNotRegisteredError fails the run when workflow does not exist (nextjs-webpack) · at 19:55:10Z · abandoned wrun_01M6PMENA2RFRHG1TPCTF92EJ5
  • run-pickup-stall · StepNotRegisteredError fails the step but workflow can catch it (nextjs-webpack) · at 19:55:11Z · abandoned wrun_01M6PMENPCYARGFAN0B5YF15VH
  • run-pickup-stall · StepNotRegisteredError fails the run when not caught in workflow (nextjs-webpack) · at 19:55:12Z · abandoned wrun_01M6PMEQ7636H64MHW08RJR7M9
  • run-pickup-stall · nested function calls preserve message and stack trace (nextjs-webpack) · at 19:55:15Z · abandoned wrun_01M6PMESP80QD5S9YQEHWNBX15

E2E Test Summary

Summary
Passed Failed Skipped Total
✅ ▲ Vercel Production 4619 0 916 5535
✅ 💻 Local Development 5379 0 566 5945
✅ 📦 Local Production 5379 0 566 5945
✅ 🐘 Local Postgres 5379 0 566 5945
✅ 🪟 Windows 397 0 13 410
✅ 🌐 Cross-language Conformance 68 0 112 180
✅ dynamic-runs 0 0 0 0
✅ local-postgres-spec9 0 0 360 360
✅ vercel-http-transport 1047 0 183 1230
✅ vercel-multi-region 27 0 0 27
✅ vercel-spec9 391 0 19 410
✅ vercel-ws-transport 707 0 113 820
Total 23393 0 3414 26807
Details by Category

✅ ▲ Vercel Production

App Passed Failed Skipped
✅ astro-node 170 0 35
✅ astro-quickjs 169 0 36
✅ example-node 170 0 35
✅ example-quickjs 169 0 36
✅ express-node 170 0 35
✅ express-quickjs 169 0 36
✅ fastify-node 170 0 35
✅ fastify-quickjs 169 0 36
✅ hono-node 170 0 35
✅ hono-quickjs 169 0 36
✅ nest-node 170 0 35
✅ nest-quickjs 169 0 36
✅ nextjs-turbopack-node 197 0 8
✅ nextjs-turbopack-quickjs 196 0 9
✅ nextjs-webpack-node 197 0 8
✅ nextjs-webpack-quickjs 196 0 9
✅ nitro-node 170 0 35
✅ nitro-quickjs 169 0 36
✅ nuxt-node 170 0 35
✅ nuxt-quickjs 169 0 36
✅ python-node 66 0 139
✅ sveltekit-node 189 0 16
✅ sveltekit-quickjs 188 0 17
✅ tanstack-start-node 170 0 35
✅ tanstack-start-quickjs 169 0 36
✅ vite-node 170 0 35
✅ vite-quickjs 169 0 36

✅ 💻 Local Development

App Passed Failed Skipped
✅ astro-stable-node 176 0 29
✅ astro-stable-quickjs 175 0 30
✅ express-stable-node 176 0 29
✅ express-stable-quickjs 175 0 30
✅ fastify-stable-node 176 0 29
✅ fastify-stable-quickjs 175 0 30
✅ hono-stable-node 176 0 29
✅ hono-stable-quickjs 175 0 30
✅ nest-stable-node 176 0 29
✅ nest-stable-quickjs 175 0 30
✅ nextjs-turbopack-canary-node 204 0 1
✅ nextjs-turbopack-canary-quickjs 203 0 2
✅ nextjs-turbopack-quickjs-snapshot 203 0 2
✅ nextjs-turbopack-stable-node 204 0 1
✅ nextjs-turbopack-stable-quickjs 203 0 2
✅ nextjs-webpack-canary-node 204 0 1
✅ nextjs-webpack-canary-quickjs 203 0 2
✅ nextjs-webpack-stable-node 204 0 1
✅ nextjs-webpack-stable-quickjs 203 0 2
✅ nitro-stable-node 176 0 29
✅ nitro-stable-quickjs 175 0 30
✅ nuxt-stable-node 176 0 29
✅ nuxt-stable-quickjs 175 0 30
✅ sveltekit-stable-node 195 0 10
✅ sveltekit-stable-quickjs 194 0 11
✅ tanstack-start-node 176 0 29
✅ tanstack-start-quickjs 175 0 30
✅ vite-stable-node 176 0 29
✅ vite-stable-quickjs 175 0 30

✅ 📦 Local Production

App Passed Failed Skipped
✅ astro-stable-node 176 0 29
✅ astro-stable-quickjs 175 0 30
✅ express-stable-node 176 0 29
✅ express-stable-quickjs 175 0 30
✅ fastify-stable-node 176 0 29
✅ fastify-stable-quickjs 175 0 30
✅ hono-stable-node 176 0 29
✅ hono-stable-quickjs 175 0 30
✅ nest-stable-node 176 0 29
✅ nest-stable-quickjs 175 0 30
✅ nextjs-turbopack-canary-node 204 0 1
✅ nextjs-turbopack-canary-quickjs 203 0 2
✅ nextjs-turbopack-quickjs-snapshot 203 0 2
✅ nextjs-turbopack-stable-node 204 0 1
✅ nextjs-turbopack-stable-quickjs 203 0 2
✅ nextjs-webpack-canary-node 204 0 1
✅ nextjs-webpack-canary-quickjs 203 0 2
✅ nextjs-webpack-stable-node 204 0 1
✅ nextjs-webpack-stable-quickjs 203 0 2
✅ nitro-stable-node 176 0 29
✅ nitro-stable-quickjs 175 0 30
✅ nuxt-stable-node 176 0 29
✅ nuxt-stable-quickjs 175 0 30
✅ sveltekit-stable-node 195 0 10
✅ sveltekit-stable-quickjs 194 0 11
✅ tanstack-start-node 176 0 29
✅ tanstack-start-quickjs 175 0 30
✅ vite-stable-node 176 0 29
✅ vite-stable-quickjs 175 0 30

✅ 🐘 Local Postgres

App Passed Failed Skipped
✅ astro-stable-node 176 0 29
✅ astro-stable-quickjs 175 0 30
✅ express-stable-node 176 0 29
✅ express-stable-quickjs 175 0 30
✅ fastify-stable-node 176 0 29
✅ fastify-stable-quickjs 175 0 30
✅ hono-stable-node 176 0 29
✅ hono-stable-quickjs 175 0 30
✅ nest-stable-node 176 0 29
✅ nest-stable-quickjs 175 0 30
✅ nextjs-turbopack-canary-node 204 0 1
✅ nextjs-turbopack-canary-quickjs 203 0 2
✅ nextjs-turbopack-quickjs-snapshot 203 0 2
✅ nextjs-turbopack-stable-node 204 0 1
✅ nextjs-turbopack-stable-quickjs 203 0 2
✅ nextjs-webpack-canary-node 204 0 1
✅ nextjs-webpack-canary-quickjs 203 0 2
✅ nextjs-webpack-stable-node 204 0 1
✅ nextjs-webpack-stable-quickjs 203 0 2
✅ nitro-stable-node 176 0 29
✅ nitro-stable-quickjs 175 0 30
✅ nuxt-stable-node 176 0 29
✅ nuxt-stable-quickjs 175 0 30
✅ sveltekit-stable-node 195 0 10
✅ sveltekit-stable-quickjs 194 0 11
✅ tanstack-start-node 176 0 29
✅ tanstack-start-quickjs 175 0 30
✅ vite-stable-node 176 0 29
✅ vite-stable-quickjs 175 0 30

✅ 🪟 Windows

App Passed Failed Skipped
✅ nextjs-turbopack-node 199 0 6
✅ nextjs-turbopack-quickjs 198 0 7

✅ 🌐 Cross-language Conformance

App Passed Failed Skipped
✅ python 68 0 112

✅ 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 180
✅ nextjs-turbopack-stable-quickjs 0 0 180

✅ vercel-http-transport

App Passed Failed Skipped
✅ example 170 0 35
✅ express 170 0 35
✅ hono 170 0 35
✅ nextjs-turbopack 197 0 8
✅ nitro 170 0 35
✅ vite 170 0 35

✅ vercel-multi-region

App Passed Failed Skipped
✅ nextjs-turbopack 27 0 0

✅ vercel-spec9

App Passed Failed Skipped
✅ nextjs-turbopack-node 196 0 9
✅ nextjs-turbopack-quickjs 195 0 10

✅ vercel-ws-transport

App Passed Failed Skipped
✅ example 170 0 35
✅ express 170 0 35
✅ nextjs-turbopack 197 0 8
✅ vite 170 0 35

📋 View full workflow run

@github-actions

github-actions Bot commented Nov 5, 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 5, 2026

Copy link
Copy Markdown
Contributor
Framework Flow route Step reg. Framework output
hono 274.2 KiB (±0) 102.3 KiB (+2 B) 2.17 MiB (+444 B)
nextjs-turbopack 281.5 KiB (±0) 433 B (±0) 1006.3 KiB (+97 B)
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.

8660cfc · run

@VaguelySerious VaguelySerious changed the title [core] Read run creation recorded on run_started alone [core] Allow run_started to record input in absence of run_created Nov 5, 2026

@karthikscale3 karthikscale3 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.

Reviewed the replay readers, run reconstruction, start-hook binding, and timeline changes. No actionable issues found. Affected packages build successfully and all 183 focused tests pass locally.

@VaguelySerious
VaguelySerious merged commit ef6343a into main Nov 6, 2026
191 checks passed
@VaguelySerious
VaguelySerious deleted the check-if-run-started-without-run-created branch November 6, 2026 18:27
@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

No backport to stable for ef6343a (AI decision).

This is forward-compat feature work for spec 9 (single orchestrator). It adds a new isRunCreationEvent export to @workflow/world and teaches readers to accept a new event-log shape (a creating run_started with no run_created) that, per the PR, no World writes yet. It fixes no defect that exists on stable, and it builds on spec-9 and slot-identity code from main.

To override, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

ef6343aa79bbdef1e99200952c4b4f5a24cdfe35

This branch was successfully deployed

1 active deployment
Preview – workflow-docs — 8660cfc0 Deployed Nov 5, 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.

2 participants