Skip to content

[e2e] Add Python e2e Test - #3369

Open
fantix wants to merge 1 commit into
mainfrom
fantix/python-conformance
Open

[e2e] Add Python e2e Test#3369
fantix wants to merge 1 commit into
mainfrom
fantix/python-conformance

Conversation

@fantix

@fantix fantix commented Aug 6, 2026

Copy link
Copy Markdown
Member

Description

Turns packages/core/e2e/e2e.test.ts into a cross-language conformance suite and adds workbench/python as its first non-JavaScript subject.

The gate. Tests whose subject is the JavaScript implementation itself — the compiler, @workflow/next, the CLI's TS codepaths — are marked testJsOnly / describeJsOnly. Everything else is in scope for any language and is gated on a per-app e2e-conformance.json:

field meaning
language anything but javascript skips the JS-only tests
fixtures which workflows/99_e2e fixtures the app implements
unsupported individual tests the app's runtime cannot pass yet, mapped to why

Both axes are ratchets, which is the point — a fixture listed but missing from the deployed manifest is a hard failure, not a skip, and an unsupported entry naming a test that no longer exists fails too. An app can only move forward by editing the declaration, and the declaration is the thing review looks at.

Apps that ship no e2e-conformance.json — every existing one — are reported as "JavaScript, all fixtures present", so this is a no-op for the JS matrix. Format reference: packages/core/e2e/e2e-conformance.example.json.

The Python app. workbench/python is a bare ASGI app on vercel-py, pinned by git rev rather than a release so the suite reports on what is actually being built. It serves the .well-known/workflow/v1 surface itself — the Python SDK does not claim to — and runs against both world-local (over HTTP) and a real Vercel deployment (over the CBOR queue transport, where the only HTTP route the driver touches is manifest.json).

Six fixtures are ported as a demo of the framework to start with: addTen, nullByte, parallelSleep, promiseAll, sleepInLoop, sleeping.

How did you test your changes?

Two CI lanes, both added here:

lane result
E2E Python Conformance (world-local) 8 passed, 129 skipped, of 137
E2E Vercel Prod Tests (python - node) 7 of 156 when the race below goes our way, 6 when it does not

One baseline, not two: the extra 19 collected on Vercel are e2e-agent.test.ts, which that lane picks up and skips whole, and the eighth local pass is deploymentId: 'latest' is a no-op in non-Vercel worlds.

E2E Python Conformance is deliberately its own job rather than a getTestMatrix row. Every step in the two local lanes is JS toolchain — pnpm dev / pnpm start, the canary next patch, dev.test.ts and local-build.test.ts, the per-framework DEV_TEST_CONFIG of compiler-generated paths — and none of it has a Python counterpart. The e2e-vercel-prod lane, whose rows only need a URL, does carry python as an ordinary matrix row.

PR Checklist - Required to merge

  • 📦 pnpm changeset was run to create a changelog for this PR
  • 🔒 DCO sign-off passes
  • 📝 Ping @vercel/workflow in a comment once the PR is ready, and the above checklist is complete

@changeset-bot

changeset-bot Bot commented Aug 6, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 672209f

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

This PR includes changesets to release 0 packages

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

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 Aug 6, 2026

Copy link
Copy Markdown
Contributor

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

Project Deployment Actions Updated (UTC)
example-nextjs-workflow-turbopack Ready Ready Preview Aug 11, 2026 8:40pm
example-nextjs-workflow-webpack Building Building Preview Aug 11, 2026 8:40pm
example-workflow Ready Ready Preview Aug 11, 2026 8:40pm
workbench-astro-workflow Ready Ready Preview Aug 11, 2026 8:40pm
workbench-express-workflow Ready Ready Preview Aug 11, 2026 8:40pm
workbench-fastify-workflow Ready Ready Preview Aug 11, 2026 8:40pm
workbench-hono-workflow Ready Ready Preview Aug 11, 2026 8:40pm
workbench-nestjs-workflow Ready Ready Preview Aug 11, 2026 8:40pm
workbench-nitro-workflow Ready Ready Preview Aug 11, 2026 8:40pm
workbench-nuxt-workflow Ready Ready Preview Aug 11, 2026 8:40pm
workbench-python-workflow Ready Ready Preview Aug 11, 2026 8:40pm
workbench-sveltekit-workflow Ready Ready Preview Aug 11, 2026 8:40pm
workbench-tanstack-start-workflow Ready Ready Preview Aug 11, 2026 8:40pm
workbench-vite-workflow Ready Ready Preview Aug 11, 2026 8:40pm
workflow-swc-playground Ready Ready Preview Aug 11, 2026 8:40pm
workflow-tarballs Ready Ready Preview Aug 11, 2026 8:40pm
workflow-web Ready Ready Preview Aug 11, 2026 8:40pm
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
workflow-docs Skipped Skipped Aug 11, 2026 8:40pm

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

All tests passed

E2E Test Summary

Summary
Passed Failed Skipped Total
✅ ▲ Vercel Production 3473 0 739 4212
✅ 💻 Local Development 3810 0 558 4368
✅ 📦 Local Production 3810 0 558 4368
✅ 🐘 Local Postgres 3810 0 558 4368
✅ 🪟 Windows 312 0 0 312
✅ 🌐 Cross-language Conformance 8 0 129 137
✅ vercel-multi-region 27 0 0 27
Total 15250 0 2542 17792
Details by Category

✅ ▲ Vercel Production

App Passed Failed Skipped
✅ astro-node 128 0 28
✅ astro-quickjs 128 0 28
✅ example-node 128 0 28
✅ example-quickjs 128 0 28
✅ express-node 128 0 28
✅ express-quickjs 128 0 28
✅ fastify-node 128 0 28
✅ fastify-quickjs 128 0 28
✅ hono-node 128 0 28
✅ hono-quickjs 128 0 28
✅ nest-node 128 0 28
✅ nest-quickjs 128 0 28
✅ nextjs-turbopack-node 153 0 3
✅ nextjs-turbopack-quickjs 153 0 3
✅ nextjs-webpack-node 153 0 3
✅ nextjs-webpack-quickjs 153 0 3
✅ nitro-node 128 0 28
✅ nitro-quickjs 128 0 28
✅ nuxt-node 128 0 28
✅ nuxt-quickjs 128 0 28
✅ python-node 7 0 149
✅ sveltekit-node 147 0 9
✅ sveltekit-quickjs 147 0 9
✅ tanstack-start-node 128 0 28
✅ tanstack-start-quickjs 128 0 28
✅ vite-node 128 0 28
✅ vite-quickjs 128 0 28

✅ 💻 Local Development

App Passed Failed Skipped
✅ astro-stable-node 130 0 26
✅ astro-stable-quickjs 130 0 26
✅ express-stable-node 130 0 26
✅ express-stable-quickjs 130 0 26
✅ fastify-stable-node 130 0 26
✅ fastify-stable-quickjs 130 0 26
✅ hono-stable-node 130 0 26
✅ hono-stable-quickjs 130 0 26
✅ nest-stable-node 130 0 26
✅ nest-stable-quickjs 130 0 26
✅ nextjs-turbopack-canary-node 137 0 19
✅ nextjs-turbopack-canary-quickjs 137 0 19
✅ nextjs-turbopack-stable-node 156 0 0
✅ nextjs-turbopack-stable-quickjs 156 0 0
✅ nextjs-webpack-canary-node 137 0 19
✅ nextjs-webpack-canary-quickjs 137 0 19
✅ nextjs-webpack-stable-node 156 0 0
✅ nextjs-webpack-stable-quickjs 156 0 0
✅ nitro-stable-node 130 0 26
✅ nitro-stable-quickjs 130 0 26
✅ nuxt-stable-node 130 0 26
✅ nuxt-stable-quickjs 130 0 26
✅ sveltekit-stable-node 149 0 7
✅ sveltekit-stable-quickjs 149 0 7
✅ tanstack-start-node 130 0 26
✅ tanstack-start-quickjs 130 0 26
✅ vite-stable-node 130 0 26
✅ vite-stable-quickjs 130 0 26

✅ 📦 Local Production

App Passed Failed Skipped
✅ astro-stable-node 130 0 26
✅ astro-stable-quickjs 130 0 26
✅ express-stable-node 130 0 26
✅ express-stable-quickjs 130 0 26
✅ fastify-stable-node 130 0 26
✅ fastify-stable-quickjs 130 0 26
✅ hono-stable-node 130 0 26
✅ hono-stable-quickjs 130 0 26
✅ nest-stable-node 130 0 26
✅ nest-stable-quickjs 130 0 26
✅ nextjs-turbopack-canary-node 137 0 19
✅ nextjs-turbopack-canary-quickjs 137 0 19
✅ nextjs-turbopack-stable-node 156 0 0
✅ nextjs-turbopack-stable-quickjs 156 0 0
✅ nextjs-webpack-canary-node 137 0 19
✅ nextjs-webpack-canary-quickjs 137 0 19
✅ nextjs-webpack-stable-node 156 0 0
✅ nextjs-webpack-stable-quickjs 156 0 0
✅ nitro-stable-node 130 0 26
✅ nitro-stable-quickjs 130 0 26
✅ nuxt-stable-node 130 0 26
✅ nuxt-stable-quickjs 130 0 26
✅ sveltekit-stable-node 149 0 7
✅ sveltekit-stable-quickjs 149 0 7
✅ tanstack-start-node 130 0 26
✅ tanstack-start-quickjs 130 0 26
✅ vite-stable-node 130 0 26
✅ vite-stable-quickjs 130 0 26

✅ 🐘 Local Postgres

App Passed Failed Skipped
✅ astro-stable-node 130 0 26
✅ astro-stable-quickjs 130 0 26
✅ express-stable-node 130 0 26
✅ express-stable-quickjs 130 0 26
✅ fastify-stable-node 130 0 26
✅ fastify-stable-quickjs 130 0 26
✅ hono-stable-node 130 0 26
✅ hono-stable-quickjs 130 0 26
✅ nest-stable-node 130 0 26
✅ nest-stable-quickjs 130 0 26
✅ nextjs-turbopack-canary-node 137 0 19
✅ nextjs-turbopack-canary-quickjs 137 0 19
✅ nextjs-turbopack-stable-node 156 0 0
✅ nextjs-turbopack-stable-quickjs 156 0 0
✅ nextjs-webpack-canary-node 137 0 19
✅ nextjs-webpack-canary-quickjs 137 0 19
✅ nextjs-webpack-stable-node 156 0 0
✅ nextjs-webpack-stable-quickjs 156 0 0
✅ nitro-stable-node 130 0 26
✅ nitro-stable-quickjs 130 0 26
✅ nuxt-stable-node 130 0 26
✅ nuxt-stable-quickjs 130 0 26
✅ sveltekit-stable-node 149 0 7
✅ sveltekit-stable-quickjs 149 0 7
✅ tanstack-start-node 130 0 26
✅ tanstack-start-quickjs 130 0 26
✅ vite-stable-node 130 0 26
✅ vite-stable-quickjs 130 0 26

✅ 🪟 Windows

App Passed Failed Skipped
✅ nextjs-turbopack-node 156 0 0
✅ nextjs-turbopack-quickjs 156 0 0

✅ 🌐 Cross-language Conformance

App Passed Failed Skipped
✅ python 8 0 129

✅ vercel-multi-region

App Passed Failed Skipped
✅ nextjs-turbopack 27 0 0

📋 View full workflow run

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit 672209f · Tue, 11 Aug 2026 20:55:08 GMT · run logs

Backend: vercel · app: nextjs-turbopack

Metric Scenario Best (ms) P75 (ms) P90 (ms) P99 (ms) Samples
TTFS step 1304 (+304%) 🔻 1355 🔴 (+28%) 🔻 1364 🔴 (+22%) 🔻 1481 🔴 (+5.9%) 30
TTFS stream 1294 (+714%) 🔻 1354 🔴 (+26%) 🔻 1366 🔴 (+25%) 🔻 1479 🔴 (+19%) 🔻 30
TTFS hook + stream 1277 (-4.4%) 1641 🔴 (+13%) 1680 🔴 (+12%) 2043 🔴 (+30%) 🔻 30
STSO 1020 steps (inline) 126 (-0.8%) 171 (-9.5%) 194 (-10%) 319 (-25%) 💚 1019
WO 1020 steps 170442 (-7.5%) 170442 (-7.5%) 170442 (-7.5%) 170442 (-7.5%) 1
SL stream latency 85 (-2.3%) 125 🔴 (-1.6%) 130 🔴 (-5.1%) 209 🔴 (-57%) 💚 30
SO stream overhead (text) 101 (-6.5%) 157 (-22%) 💚 188 (-40%) 💚 274 (-42%) 💚 30
SO stream overhead (structured) 99 (-7.5%) 183 (+3.4%) 251 (+4.6%) 335 (-24%) 💚 30
📈 STSO distribution vs main (inline / queue-hop histograms)

1020 steps (inline)

Cumulative STSO time: main 183209ms → this run 169135ms (Δ -14074ms, -8%)

100-150 ms  ██████░░░░┃               main 168  this 320  +152
150-200 ms  █████████████████████┃██  main 675  this 618   -57
200-250 ms  █┃███                     main 129  this  53   -76
250-300 ms  ┃                         main  23  this  15    -8
300-350 ms  ┃                         main   8  this   6    -2
350-400 ms  ┃                         main   3  this   1    -2
400-450 ms  ┃                         main   5  this   0    -5
450-500 ms  ┃                         main   3  this   3    +0
500-550 ms  ┃                         main   1  this   2    +1
650-700 ms  ┃                         main   1  this   0    -1
700-750 ms  ┃                         main   0  this   1    +1
800-850 ms  ┃                         main   1  this   0    -1
850-900 ms  ┃                         main   1  this   0    -1
900-950 ms  ┃                         main   1  this   0    -1
📜 Previous results (4)

bc7b027

Tue, 11 Aug 2026 18:57:24 GMT · run logs

vercel / nextjs-turbopack

Metric Scenario Best (ms) P75 (ms) P90 (ms) P99 (ms) Samples
TTFS step 1407 (+59%) 🔻 1466 🔴 (+19%) 🔻 1515 🔴 (+16%) 🔻 1602 🔴 (-11%) 30
TTFS stream 1400 (+34%) 🔻 1471 🔴 (+30%) 🔻 1487 🔴 (+27%) 🔻 1658 🔴 (+33%) 🔻 30
TTFS hook + stream 1671 (+19%) 🔻 1797 🔴 (+15%) 🔻 1847 🔴 (+17%) 🔻 2112 🔴 (+32%) 🔻 30
STSO 1020 steps (inline) 132 (-16%) 💚 175 (-29%) 💚 201 (-36%) 💚 389 (-45%) 💚 1019
WO 1020 steps 179645 (-26%) 💚 179645 (-26%) 💚 179645 (-26%) 💚 179645 (-26%) 💚 1
SL stream latency 89 (-29%) 💚 109 🔴 (-41%) 💚 130 🔴 (-45%) 💚 227 🔴 (-28%) 💚 30
SO stream overhead (text) 96 (-35%) 💚 162 (-35%) 💚 199 (-43%) 💚 2051 🔴 (+245%) 🔻 30
SO stream overhead (structured) 101 (-38%) 💚 166 (-45%) 💚 179 (-49%) 💚 404 (-62%) 💚 30

8a82563

Tue, 11 Aug 2026 18:31:26 GMT · run logs

vercel / nextjs-turbopack

Metric Scenario Best (ms) P75 (ms) P90 (ms) P99 (ms) Samples
TTFS step 1298 1454 🔴 1479 🔴 1703 🔴 30
TTFS stream 1371 1459 🔴 1471 🔴 1483 🔴 30
TTFS hook + stream 1387 1691 🔴 1700 🔴 1803 🔴 30
STSO 1020 steps (inline) 121 167 180 282 1019
WO 1020 steps 166859 166859 166859 166859 1
SL stream latency 84 103 🔴 105 🔴 110 30
SO stream overhead (text) 104 160 182 332 30
SO stream overhead (structured) 110 164 193 201 30

e3ee275

Tue, 11 Aug 2026 17:44:14 GMT · run logs

vercel / nextjs-turbopack

Metric Scenario Best (ms) P75 (ms) P90 (ms) P99 (ms) Samples
TTFS step 415 (-53%) 💚 1424 🔴 (+16%) 🔻 1447 🔴 (+11%) 1782 🔴 (-1.4%) 30
TTFS stream 1343 (+28%) 🔻 1393 🔴 (+23%) 🔻 1417 🔴 (+21%) 🔻 1425 🔴 (+15%) 30
TTFS hook + stream 1580 (+12%) 1675 🔴 (+7.6%) 1694 🔴 (+7.1%) 1847 🔴 (+16%) 🔻 30
STSO 1020 steps (inline) 119 (-24%) 💚 161 (-35%) 💚 182 (-42%) 💚 267 (-62%) 💚 1019
WO 1020 steps 160342 (-34%) 💚 160342 (-34%) 💚 160342 (-34%) 💚 160342 (-34%) 💚 1
SL stream latency 85 (-32%) 💚 118 🔴 (-36%) 💚 141 🔴 (-40%) 💚 221 🔴 (-30%) 💚 30
SO stream overhead (text) 114 (-23%) 💚 152 (-39%) 💚 168 (-52%) 💚 207 (-65%) 💚 30
SO stream overhead (structured) 99 (-39%) 💚 150 (-50%) 💚 167 (-53%) 💚 688 (-35%) 💚 30

a164e82

Tue, 11 Aug 2026 01:39:35 GMT · run logs

vercel / nextjs-turbopack

Metric Scenario Best (ms) P75 (ms) P90 (ms) P99 (ms) Samples
TTFS step 250 (-76%) 💚 1353 🔴 (+15%) 1388 🔴 (+15%) 🔻 1777 🔴 (+4.0%) 30
TTFS stream 265 (-75%) 💚 1379 🔴 (+21%) 🔻 1400 🔴 (+20%) 🔻 1686 🔴 (+39%) 🔻 30
TTFS hook + stream 429 (-66%) 💚 1608 🔴 (+18%) 🔻 1645 🔴 (+18%) 🔻 1727 🔴 (+15%) 30
STSO 1020 steps (inline) 103 (+7.3%) 155 (-5.5%) 177 (-13%) 337 (-57%) 💚 1019
WO 1020 steps 155798 (-9.2%) 155798 (-9.2%) 155798 (-9.2%) 155798 (-9.2%) 1
SL stream latency 93 (+2.2%) 143 🔴 (-7.1%) 161 🔴 (-6.4%) 1026 🔴 (+84%) 🔻 30
SO stream overhead (text) 128 (-3.0%) 242 (-12%) 359 (+8.8%) 570 (-27%) 💚 30
SO stream overhead (structured) 125 (+2.5%) 224 (-8.6%) 265 (-15%) 💚 398 (-12%) 30
ℹ️ Metric definitions & methodology

The collapsed STSO distribution section above buckets every step gap of the sequential-steps run (not a sampled window), split by whether the step ending the gap ran inline — in the same warm process as the step before it, so the gap is pure framework overhead — or after a queue-hop — the first step of a fresh process, which pays queue dispatch, client reinit and event-log replay. Bars overlay the two runs: is main, marks where this run lands, bridges the gap when this run has more samples in a bucket.

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, deployment clocks) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · SL: stream latency (in-deployment write → read propagation, readAt - writtenAt) · SO: stream overhead (end-to-end write+consume time beyond the modelled generation window)

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 · stream latency: parallel reader/writer steps on a dedicated stream; SL is the in-deployment write->read propagation (readAt - writtenAt) · stream overhead (text): writer streams 300 variable-length text token deltas paced at 100/s for 3s (a haiku-size LLM's token throughput) while a parallel reader drains the whole stream; SO is the end-to-end write+consume time beyond the 3s generation window (overhead/backpressure) · stream overhead (structured): same workload as stream overhead (text), but each delta is an AI-SDK-style structured object ({ type: 'text-delta', id, text }) instead of a raw string, so the SO gap vs the text scenario is the added serialization cost

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600 · SL 50/60/125 · SO 250/500/1000

All metrics are measured from deployment-side timestamps only. Runs are triggered by an in-deployment route that stamps the anchor (clientStart) right before start(), so the CI runner’s request and its path through api.vercel.com sit outside every measured window. TTFS = in-deployment start() → first step body (turbo uses the in-process fast path, non-turbo the dispatch path), and includes the VQS dispatch hop plus any /flow cold start. STSO/WO are measured between step bodies on the deployment. SL is measured inside the workflow (parallel reader/writer steps), so it no longer includes the api.vercel.com read path.

Cold starts are kept in the numbers on purpose — they are part of real bursty-workload latency. The workbench deployment cold-starts the /flow invocation for a large fraction of runs, inflating P75+; the Best column shows the fastest (warm-start) sample for comparison.

@socket-security

socket-security Bot commented Aug 6, 2026

Copy link
Copy Markdown

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

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addedpypi/​vercel@​0.9.097100100100100
Addedpypi/​uvicorn@​0.52.198100100100100
Addedpypi/​vercel-queue@​0.7.3100100100100100

View full report

@vercel
vercel Bot temporarily deployed to Preview – workflow-docs August 6, 2026 03:00 Inactive
Comment thread workbench/python/uv.lock Outdated
@github-actions

github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Sim World

Simulated world deterministic testing for races. Traces

🟠 Mint-ordered log — 6 fail of 41 total

log=mint-ordered · 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
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 17 1.0m MISMATCH 1
stale-read-equal-step-counts completed 14 1.0m MISMATCH 1
step-vs-step-fork completed 12 0ms MISMATCH 1
step-vs-step-fork-fenced completed 12 0ms MISMATCH 1
fence-catches-benign-direction completed 12 5ms ok 0
in-flight-before-decision completed 17 1.0m MISMATCH 1
in-flight-before-decision-counted completed 20 1.0m ok 0
in-flight-after-decision failed 14 2.0m MISMATCH 1
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-mint.txt

🟢 Append-only log — 0 fail of 41 total

log=append-only · 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
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-append-only.txt

Turns `packages/core/e2e/e2e.test.ts` into a cross-language conformance
suite and adds `workbench/python` as its first non-JavaScript subject.

Tests whose subject is the JavaScript implementation are marked
`testJsOnly` / `describeJsOnly`; everything else is gated on a per-app
`e2e-conformance.json` declaring which `workflows/99_e2e` fixtures the
app implements, plus any individual tests its runtime cannot pass yet.
Apps without that file — every existing one — are unaffected, so this
is a no-op for the JS matrix.

The Python app is built on vercel-py, pinned by git rev rather than a
release so the suite reports on what is actually being built. It runs
against both `world-local` and a real Vercel deployment, the latter
through the CBOR queue transport rather than HTTP. Baseline is 8 of 137
passing locally and 7 of 156 on Vercel; the rest skip, and the point of
the lane is that they keep skipping for the declared reason.

`workbench/python/README.md` records what is and is not ported, and the
four gaps found on the way: the CBOR queue transport (vercel-py#265,
#266), the Trusted Sources bypass header (vercel-py#278), `encr`
payload decryption (vercel-py#279), and reading the slot-numbered
`specVersion: 6` this repo's world-vercel now stamps (#3389). All four
are fixed in the pinned rev.

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

fantix commented Aug 12, 2026

Copy link
Copy Markdown
Member Author

@vercel/workflow this PR is ready.

One test is flaky due to the missing implementation of resilient start in Python, which is being added in vercel/vercel-py#284. This PR should be slightly updated after that fix, but I think the majority of this PR is ready for review.

@VaguelySerious VaguelySerious left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nice!

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