Skip to content

[world-sim] Restore the slot-era check in in-flight-before-decision-counted - #4783

Merged
pranaygp merged 1 commit into
mainfrom
pgp/fix-sim-in-flight-counted
Oct 8, 2026
Merged

pranaygp merged 1 commit into
mainfrom
pgp/fix-sim-in-flight-counted

Conversation

@pranaygp

@pranaygp pranaygp commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Summary

Sim World has reported in-flight-before-decision-counted as the book's one red on every PR, docs-only ones included. The cause is a stale expectation, not a runtime regression. This PR restores the check #3519 wrote for slot ids and adds a unit test for the count half of the fence, which no scenario reaches anymore.

Where it started

It started at ec709ba (#3544, Aug 17), not in the #4772–#4782 range. It has failed on every main push since then:

  • At b0adb50 (the parent of [world-sim] Remove mint-ordered log #3544), the append-only lane, which became the only lane, passes with ok check: the fence rejected the write.
  • At ec709ba the single remaining lane fails the count guard fenced the write the watermark let through.
  • I reproduced both locally (pnpm sim in-flight-before-decision-counted, with --append-only on the parent). The runtime trace is identical at both commits: the orchestrator's step_started decision is rejected with PreconditionFailedError: … changed out of band since the caller's snapshot, it reloads, and it completes with replay ok. Only the check changed.

While removing the mint-ordered log, #3544 put back the scenario's pre-#3519 check, which matches the count half's own message (at or below the caller). #3519 had replaced it on purpose. Watermarks used to be milliseconds, so the hook and the timeout compared equal and only the count could separate them. A slot watermark is strictly ordered.

Why the expectation is stale, not the runtime

With commit-time slots, the in-flight hook commits at slot 8, above the caller's watermark of 7. The watermark half rejects the decision, and it is evaluated first. The old check can't pass even if the count half is reached: I disabled the watermark half locally, and at the decision write recorded == loaded (7 == 7), so the count half lets it through. The count half fires only later, on the settle step's step_completed, after the branch has run.

That makes the old check worse than unsatisfiable. With the watermark half broken it passes, because it accepts that late rejection. The runtime does the right thing here: it fences the decision, reloads, and settles on the branch the log implies, with 0 violations.

Changes

  • in-flight-before-decision-counted: assert that the fence rejected the orchestrator's step_started decision (PreconditionFailedError, writer orchestrator). Matching any 412 would also accept the late step-body rejection above. The description now matches what happens.
  • store.test.ts: a test for the count half, a snapshot missing an event below its own watermark, rejected only with countGuard. I mutation-checked it: loosening the predicate to recorded > count + 1 makes it fail.

No changeset. @workflow/world-sim and the workbench are private, and nothing outside tests and scenarios changed.

Verification

  • pnpm sim: 42 passed, 0 failed, 0 violations (🟢 0 fail of 42).
  • pnpm sim --no-fence: only this scenario fails, by design, with 0 violations. This is what run.ts and the README document.
  • With the watermark half disabled in the built sim: the new check fails, and the old one passed.
  • vitest run src/store.test.ts in packages/world-sim: 25 passed. tsc --noEmit is clean.

Follow-up (not in this PR)

packages/world-sim/DESIGN.md still describes the mint-ordered model #3544 removed: "The three" table, appendOnlyLog, and "6 → 8" violations.

🤖 Generated with Claude Code

…ounted

#3544 removed the mint-ordered log and, with it, restored this
scenario's pre-#3519 check that the count half of the fence rejected a
write the watermark let through. That premise held when watermarks were
milliseconds. With commit-time slots the hook lands above the caller's
watermark, so the watermark half rejects the decision and the count at or
below the watermark never grows. The check has failed on every main push
since #3544, with the runtime trace identical to the passing one before it.

Assert that the fence rejected the orchestrator's decision write instead,
which is what #3519 meant by "the fence fires at all". Pinning it to the
decision rather than any 412 matters: with the watermark half disarmed,
the count half lets the decision through and rejects the settle step's
step_completed after the branch has run, which the old check accepted.

Add a store test for the count half, which no book scenario reaches now.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 8, 2026 20:02
@pranaygp
pranaygp requested a review from a team as a code owner October 8, 2026 20:02
@changeset-bot

changeset-bot Bot commented Oct 8, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 12b2dec

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a 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.

@vercel

vercel Bot commented Oct 8, 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 Oct 8, 2026 8:06pm UTC
example-nextjs-workflow-webpack Ready Ready Preview, v0 Oct 8, 2026 8:06pm UTC
example-workflow Ready Ready Preview, v0 Oct 8, 2026 8:06pm UTC
workbench-astro-workflow Ready Ready Preview, v0 Oct 8, 2026 8:06pm UTC
workbench-express-workflow Ready Ready Preview, v0 Oct 8, 2026 8:06pm UTC
workbench-fastify-workflow Ready Ready Preview, v0 Oct 8, 2026 8:06pm UTC
workbench-hono-workflow Ready Ready Preview, v0 Oct 8, 2026 8:06pm UTC
workbench-nestjs-workflow Ready Ready Preview, v0 Oct 8, 2026 8:06pm UTC
workbench-nitro-workflow Ready Ready Preview, v0 Oct 8, 2026 8:06pm UTC
workbench-nuxt-workflow Ready Ready Preview, v0 Oct 8, 2026 8:06pm UTC
workbench-python-workflow Ready Ready Preview, v0 Oct 8, 2026 8:06pm UTC
workbench-sveltekit-workflow Ready Ready Preview, v0 Oct 8, 2026 8:06pm UTC
workbench-tanstack-start-workflow Ready Ready Preview, v0 Oct 8, 2026 8:06pm UTC
workbench-vite-workflow Ready Ready Preview, v0 Oct 8, 2026 8:06pm UTC
workflow-swc-playground Ready Ready Preview, v0 Oct 8, 2026 8:06pm UTC
workflow-tarballs Ready Ready Preview, v0 Oct 8, 2026 8:06pm UTC
workflow-web Ready Ready Preview, v0 Oct 8, 2026 8:06pm UTC
1 Skipped Deployment
Project Deployment Actions Updated
workflow-docs Skipped Skipped v0 Oct 8, 2026 8:06pm UTC

@vercel
vercel Bot temporarily deployed to Preview – workflow-docs October 8, 2026 20:03 Inactive
@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Sim World

Simulated world deterministic testing for races. Traces

🟢 world-sim scenario book — 0 fail of 42 total

fence=per-spec

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

Full trace: world-sim.txt

@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit 12b2dec · Thu, 08 Oct 2026 20:23:58 GMT · run logs

Backend: vercel · app: nextjs-turbopack

Metric Scenario Best (ms) P75 (ms) P90 (ms) P99 (ms) Samples
TTFS step 1949 (+46%) 🔻 2119 🔴 (+38%) 🔻 2140 🔴 (+36%) 🔻 2218 🔴 (+37%) 🔻 30
TTFS stream 1942 (+37%) 🔻 2108 🔴 (+39%) 🔻 2147 🔴 (+41%) 🔻 2316 🔴 (+47%) 🔻 30
TTFS hook + stream 2308 (+66%) 🔻 2425 🔴 (+33%) 🔻 2480 🔴 (+32%) 🔻 2547 🔴 (+6.8%) 30
Fan-out TTFS Promise.all(100 steps) 728 (+38%) 🔻 829 (+16%) 🔻 1039 (+19%) 🔻 2871 (+55%) 🔻 10
Fan-out TTLS Promise.all(100 steps) 2134 (+38%) 🔻 3058 (-17%) 💚 3189 (-27%) 💚 8714 (+36%) 🔻 10
STSO 1020 steps (inline) 107 (+30%) 🔻 134 (+26%) 🔻 154 (+22%) 🔻 228 (+37%) 🔻 1019
WO 1020 steps 134551 (+27%) 🔻 134551 (+27%) 🔻 134551 (+27%) 🔻 134551 (+27%) 🔻 1
📈 STSO distribution vs main (inline / queue-hop histograms)

1020 steps (inline)

Cumulative STSO time: main 105566ms → this run 133882ms (Δ +28316ms, +27%)

 50-100 ms  ┃████████████████         main 624  this   0  -624
100-150 ms  ██████████░░░░░░░░░░░░░┃  main 367  this 893  +526
150-200 ms  █░┃                       main  23  this 108   +85
200-250 ms  ┃                         main   2  this  14   +12
250-300 ms  ┃                         main   2  this   2    +0
300-350 ms  ┃                         main   0  this   1    +1
400-450 ms  ┃                         main   0  this   1    +1
550-600 ms  ┃                         main   1  this   0    -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 Oct 8, 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.

  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running (nextjs-webpack · local-dev / local / node / canary)
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps (nextjs-webpack · local-dev / local / node / stable)
  • resumes in flight during the takeover are never lost: each lands in exactly one log (nextjs-webpack · local-prod / local / quickjs / stable)

🛠 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 · basic step error preserves message and stack trace (nextjs-webpack) · at 20:16:56Z · abandoned wrun_01M4EJJC3PEMSSSZH956F4ATZH
  • run-pickup-stall · hookCleanupTestWorkflow - hook token reuse after workflow completion (nextjs-webpack) · at 20:17:02Z · abandoned wrun_01M4EJJJTKVGEPM1P4BKXFNNH3

E2E Test Summary

Summary
Passed Failed Skipped Total
✅ ▲ Vercel Production 3982 0 878 4860
✅ 💻 Local Development 4669 0 551 5220
✅ 📦 Local Production 4669 0 551 5220
✅ 🐘 Local Postgres 4669 0 551 5220
✅ 🪟 Windows 348 0 12 360
✅ 🌐 Cross-language Conformance 68 0 87 155
✅ dynamic-runs 0 0 0 0
✅ vercel-http-transport 897 0 183 1080
✅ vercel-multi-region 27 0 0 27
✅ vercel-ws-transport 607 0 113 720
Total 19936 0 2926 22862
Details by Category

✅ ▲ Vercel Production

App Passed Failed Skipped
✅ astro-node 145 0 35
✅ astro-quickjs 145 0 35
✅ example-node 145 0 35
✅ example-quickjs 145 0 35
✅ express-node 145 0 35
✅ express-quickjs 145 0 35
✅ fastify-node 145 0 35
✅ fastify-quickjs 145 0 35
✅ hono-node 145 0 35
✅ hono-quickjs 145 0 35
✅ nest-node 145 0 35
✅ nest-quickjs 145 0 35
✅ nextjs-turbopack-node 172 0 8
✅ nextjs-turbopack-quickjs 172 0 8
✅ nextjs-webpack-node 172 0 8
✅ nextjs-webpack-quickjs 172 0 8
✅ nitro-node 145 0 35
✅ nitro-quickjs 145 0 35
✅ nuxt-node 145 0 35
✅ nuxt-quickjs 145 0 35
✅ python-node 66 0 114
✅ sveltekit-node 164 0 16
✅ sveltekit-quickjs 164 0 16
✅ tanstack-start-node 145 0 35
✅ tanstack-start-quickjs 145 0 35
✅ vite-node 145 0 35
✅ vite-quickjs 145 0 35

✅ 💻 Local Development

App Passed Failed Skipped
✅ astro-stable-node 151 0 29
✅ astro-stable-quickjs 151 0 29
✅ express-stable-node 151 0 29
✅ express-stable-quickjs 151 0 29
✅ fastify-stable-node 151 0 29
✅ fastify-stable-quickjs 151 0 29
✅ hono-stable-node 151 0 29
✅ hono-stable-quickjs 151 0 29
✅ nest-stable-node 151 0 29
✅ nest-stable-quickjs 151 0 29
✅ nextjs-turbopack-canary-node 179 0 1
✅ nextjs-turbopack-canary-quickjs 179 0 1
✅ nextjs-turbopack-quickjs-snapshot 179 0 1
✅ nextjs-turbopack-stable-node 179 0 1
✅ nextjs-turbopack-stable-quickjs 179 0 1
✅ nextjs-webpack-canary-node 179 0 1
✅ nextjs-webpack-canary-quickjs 179 0 1
✅ nextjs-webpack-stable-node 179 0 1
✅ nextjs-webpack-stable-quickjs 179 0 1
✅ nitro-stable-node 151 0 29
✅ nitro-stable-quickjs 151 0 29
✅ nuxt-stable-node 151 0 29
✅ nuxt-stable-quickjs 151 0 29
✅ sveltekit-stable-node 170 0 10
✅ sveltekit-stable-quickjs 170 0 10
✅ tanstack-start-node 151 0 29
✅ tanstack-start-quickjs 151 0 29
✅ vite-stable-node 151 0 29
✅ vite-stable-quickjs 151 0 29

✅ 📦 Local Production

App Passed Failed Skipped
✅ astro-stable-node 151 0 29
✅ astro-stable-quickjs 151 0 29
✅ express-stable-node 151 0 29
✅ express-stable-quickjs 151 0 29
✅ fastify-stable-node 151 0 29
✅ fastify-stable-quickjs 151 0 29
✅ hono-stable-node 151 0 29
✅ hono-stable-quickjs 151 0 29
✅ nest-stable-node 151 0 29
✅ nest-stable-quickjs 151 0 29
✅ nextjs-turbopack-canary-node 179 0 1
✅ nextjs-turbopack-canary-quickjs 179 0 1
✅ nextjs-turbopack-quickjs-snapshot 179 0 1
✅ nextjs-turbopack-stable-node 179 0 1
✅ nextjs-turbopack-stable-quickjs 179 0 1
✅ nextjs-webpack-canary-node 179 0 1
✅ nextjs-webpack-canary-quickjs 179 0 1
✅ nextjs-webpack-stable-node 179 0 1
✅ nextjs-webpack-stable-quickjs 179 0 1
✅ nitro-stable-node 151 0 29
✅ nitro-stable-quickjs 151 0 29
✅ nuxt-stable-node 151 0 29
✅ nuxt-stable-quickjs 151 0 29
✅ sveltekit-stable-node 170 0 10
✅ sveltekit-stable-quickjs 170 0 10
✅ tanstack-start-node 151 0 29
✅ tanstack-start-quickjs 151 0 29
✅ vite-stable-node 151 0 29
✅ vite-stable-quickjs 151 0 29

✅ 🐘 Local Postgres

App Passed Failed Skipped
✅ astro-stable-node 151 0 29
✅ astro-stable-quickjs 151 0 29
✅ express-stable-node 151 0 29
✅ express-stable-quickjs 151 0 29
✅ fastify-stable-node 151 0 29
✅ fastify-stable-quickjs 151 0 29
✅ hono-stable-node 151 0 29
✅ hono-stable-quickjs 151 0 29
✅ nest-stable-node 151 0 29
✅ nest-stable-quickjs 151 0 29
✅ nextjs-turbopack-canary-node 179 0 1
✅ nextjs-turbopack-canary-quickjs 179 0 1
✅ nextjs-turbopack-quickjs-snapshot 179 0 1
✅ nextjs-turbopack-stable-node 179 0 1
✅ nextjs-turbopack-stable-quickjs 179 0 1
✅ nextjs-webpack-canary-node 179 0 1
✅ nextjs-webpack-canary-quickjs 179 0 1
✅ nextjs-webpack-stable-node 179 0 1
✅ nextjs-webpack-stable-quickjs 179 0 1
✅ nitro-stable-node 151 0 29
✅ nitro-stable-quickjs 151 0 29
✅ nuxt-stable-node 151 0 29
✅ nuxt-stable-quickjs 151 0 29
✅ sveltekit-stable-node 170 0 10
✅ sveltekit-stable-quickjs 170 0 10
✅ tanstack-start-node 151 0 29
✅ tanstack-start-quickjs 151 0 29
✅ vite-stable-node 151 0 29
✅ vite-stable-quickjs 151 0 29

✅ 🪟 Windows

App Passed Failed Skipped
✅ nextjs-turbopack-node 174 0 6
✅ nextjs-turbopack-quickjs 174 0 6

✅ 🌐 Cross-language Conformance

App Passed Failed Skipped
✅ python 68 0 87

✅ 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

✅ vercel-http-transport

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

✅ vercel-multi-region

App Passed Failed Skipped
✅ nextjs-turbopack 27 0 0

✅ vercel-ws-transport

App Passed Failed Skipped
✅ example 145 0 35
✅ express 145 0 35
✅ nextjs-turbopack 172 0 8
✅ vite 145 0 35

📋 View full workflow run

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor
Framework Flow route Step reg. Framework output
hono 267.4 KiB (±0) 95.4 KiB (±0) 1.99 MiB (±0)
nextjs-turbopack 274.8 KiB (±0) 426 B (±0) 968.9 KiB (±0)
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.

12b2dec · run

@pranaygp
pranaygp merged commit fe4c644 into main Oct 8, 2026
188 checks passed
@pranaygp
pranaygp deleted the pgp/fix-sim-in-flight-counted branch October 8, 2026 20:45
@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

No backport to stable for fe4c644 (AI decision).

This commit only touches packages/world-sim/src/store.test.ts and workbench/sim-world/scenarios/in-flight-before-decision-counted.ts, and I verified with git ls-tree origin/stable that neither packages/world-sim nor workbench/sim-world exists on stable at all. It is also a correction to a simulation scenario's expectation that only became stale because of the commit-time slot model introduced on main (#3519/#3544), so the fixed assertion describes runtime behavior stable does not have. There is nothing to apply and nothing on the maintenance line it would keep working.

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

fe4c6443cc864047e81fa3734e7bac98b2c5bed6

This branch was previously deployed

1 inactive deployment
Preview – workflow-docs — 12b2dec4 Deployed Oct 8, 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.

3 participants