') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); docs: March docs audit and alignment by johnlindquist · Pull Request #1466 · vercel/workflow · GitHub
Skip to content

docs: March docs audit and alignment - #1466

Merged
pranaygp merged 18 commits into
mainfrom
march-docs-audit
Apr 7, 2026
Merged

docs: March docs audit and alignment#1466
pranaygp merged 18 commits into
mainfrom
march-docs-audit

Conversation

@johnlindquist

@johnlindquistjohnlindquist commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Align documentation across observability, NestJS setup, start() troubleshooting, framework integrations, encryption, event sourcing, server-based testing, and durable agent API reference
  • Tighten NestJS CommonJS guidance and Next.js monorepo setup docs
  • Update docs-typecheck README to reflect actual tool behavior

Test plan

  • Verify docs site builds cleanly
  • Spot-check updated docs pages render correctly

@johnlindquist
johnlindquist requested review from a team and ijjk as code ownersMarch 20, 2026 14:56
@changeset-bot

changeset-botBot commented Mar 20, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 1e5c88b

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

@github-actions

github-actionsBot commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
❌ ▲ Vercel Production878167946
✅ 💻 Local Development85401781032
✅ 📦 Local Production85401781032
✅ 🐘 Local Postgres85401781032
✅ 🪟 Windows780886
❌ 🌍 Community Worlds1346424222
✅ 📋 Other216042258
Total3868656754608

❌ Failed Tests

▲ Vercel Production (1 failed)

nitro (1 failed):

🌍 Community Worlds (64 failed)

mongodb (4 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNJHA5MR936GVWZT03D77DBE
  • webhookWorkflow | wrun_01KNJHAEFWD00QS03EYARHEQ5E
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNJHJ2A1CKKW47TRWFZ3XHQT
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNJHR8M125A0GE6CWPZDSPMN

redis (3 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNJHA5MR936GVWZT03D77DBE
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNJHJ2A1CKKW47TRWFZ3XHQT
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNJHR8M125A0GE6CWPZDSPMN

turso (57 failed):

  • addTenWorkflow | wrun_01KNJH913E1Z7MQQVYCXK5ZQ2B
  • addTenWorkflow | wrun_01KNJH913E1Z7MQQVYCXK5ZQ2B
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_01KNJHB00QA3YG3XV3JRHQ3TFG
  • should work with react rendering in step
  • promiseAllWorkflow | wrun_01KNJH97M5VZK1JZEM0PFRK8W4
  • promiseRaceWorkflow | wrun_01KNJH9D300WT1FW0VMV1A82KD
  • promiseAnyWorkflow | wrun_01KNJH9FAF6FPEYJ4TRZS53MHK
  • importedStepOnlyWorkflow | wrun_01KNJHB9C9PRMVDVZ1CQ700FRF
  • hookWorkflow | wrun_01KNJH9VCNCSW5E92Q4Z0TJ8T3
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNJHA5MR936GVWZT03D77DBE
  • webhookWorkflow | wrun_01KNJHAEFWD00QS03EYARHEQ5E
  • sleepingWorkflow | wrun_01KNJHAMSMNS93ZEHZ5KC3GGXT
  • parallelSleepWorkflow | wrun_01KNJHB09Z1HNJ9CXNT2DTP26E
  • nullByteWorkflow | wrun_01KNJHB3G1BSDTVFBTBGX4BK3H
  • workflowAndStepMetadataWorkflow | wrun_01KNJHB5HMD8S442XW7CRCA5KW
  • fetchWorkflow | wrun_01KNJHDZ3DE4M1H45PWW2PDZBD
  • promiseRaceStressTestWorkflow | wrun_01KNJHE3K758SCFDCDXB7EB2N5
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_01KNJHHEYT26B7S7VRP4NRPM18
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNJHJ2A1CKKW47TRWFZ3XHQT
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_01KNJHJR544BTBNSS790CQ02HS
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_01KNJHKBTYBJ6HW1BN71J5XA7E
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_01KNJHKMDF7QW3QRF7TMD477FA
  • closureVariableWorkflow - nested step functions with closure variables | wrun_01KNJHKTKVFNRM6MGS08HMGH93
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_01KNJHKXR66990R5CEWNW0Q1VN
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_01KNJHMCBYFXYZHHX7WQ45Y7JG
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_01KNJHMJ2MT0FGMSYK5YP27KBC
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_01KNJHMRDWFCQTTQ8MFT70BGY9
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_01KNJHMXYTSDQEZ60D289WY328
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_01KNJHN4CXA6F1YW8ANYXK9PRQ
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KNJHNAY1PT77P9KTEZ4G7B4Y
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_01KNJHNHCCYSK99DY8CTHK2N42
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_01KNJHNW4H8BZV6PKNC84PBQMK
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_01KNJHP3Q4Z8RE0J94V01G02JS
  • cancelRun - cancelling a running workflow | wrun_01KNJHPAV82SCJS7WF84X8S06E
  • cancelRun via CLI - cancelling a running workflow | wrun_01KNJHPKVYDV3QBRT1HS57SRES
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_01KNJHPZKAJ8R6E3VGG2NZ4BWF
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_01KNJHQM4BMMYR6C0ZHP9D0THV
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KNJHQY67NZSHRP1C9TJEH4T0
  • importMetaUrlWorkflow - import.meta.url is available in step bundles | wrun_01KNJHR4KJ60WXTEWBSSP57DAJ
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) | wrun_01KNJHR6MA1Z504SAEFW0MPV80
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNJHR8M125A0GE6CWPZDSPMN

Details by Category

❌ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro7907
✅ example7907
✅ express7907
✅ fastify7907
✅ hono7907
✅ nextjs-turbopack8402
✅ nextjs-webpack8402
❌ nitro7817
✅ nuxt7907
✅ sveltekit7907
✅ vite7907
✅ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable72014
✅ express-stable72014
✅ fastify-stable72014
✅ hono-stable72014
✅ nextjs-turbopack-canary61025
✅ nextjs-turbopack-stable7808
✅ nextjs-webpack-canary61025
✅ nextjs-webpack-stable7808
✅ nitro-stable72014
✅ nuxt-stable72014
✅ sveltekit-stable72014
✅ vite-stable72014
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable72014
✅ express-stable72014
✅ fastify-stable72014
✅ hono-stable72014
✅ nextjs-turbopack-canary61025
✅ nextjs-turbopack-stable7808
✅ nextjs-webpack-canary61025
✅ nextjs-webpack-stable7808
✅ nitro-stable72014
✅ nuxt-stable72014
✅ sveltekit-stable72014
✅ vite-stable72014
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable72014
✅ express-stable72014
✅ fastify-stable72014
✅ hono-stable72014
✅ nextjs-turbopack-canary61025
✅ nextjs-turbopack-stable7808
✅ nextjs-webpack-canary61025
✅ nextjs-webpack-stable7808
✅ nitro-stable72014
✅ nuxt-stable72014
✅ sveltekit-stable72014
✅ vite-stable72014
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack7808
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev500
❌ mongodb5748
✅ redis-dev500
❌ redis5838
✅ turso-dev500
❌ turso4578
✅ 📋 Other
AppPassedFailedSkipped
✅ e2e-local-dev-nest-stable72014
✅ e2e-local-postgres-nest-stable72014
✅ e2e-local-prod-nest-stable72014

📋 View full workflow run


Some E2E test jobs failed:

  • Vercel Prod: failure
  • Local Dev: success
  • Local Prod: success
  • Local Postgres: success
  • Windows: success

Check the workflow run for details.

@github-actions

github-actionsBot commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express0.039s (-9.6% 🟢)1.006s (~)0.967s101.00x
💻 LocalNitro0.045s (+4.7%)1.006s (~)0.961s101.16x
🐘 PostgresNitro0.055s (-7.0% 🟢)1.010s (~)0.956s101.41x
🐘 PostgresExpress0.058s (-4.5%)1.010s (~)0.952s101.49x
💻 LocalNext.js (Turbopack)⚠️missing----
🐘 PostgresNext.js (Turbopack)⚠️missing----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)0.206s (-58.1% 🟢)2.014s (-21.9% 🟢)1.809s101.00x
▲ VercelNitro0.223s (-6.2% 🟢)1.896s (-16.9% 🟢)1.673s101.08x
▲ VercelExpress0.228s (+8.7% 🔺)2.108s (-6.1% 🟢)1.880s101.11x

🔍 Observability: Next.js (Turbopack) | Nitro | Express

workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express1.117s (-0.9%)2.006s (~)0.888s101.00x
💻 LocalNitro1.130s (~)2.007s (~)0.877s101.01x
🐘 PostgresExpress1.145s (-0.6%)2.009s (~)0.865s101.02x
🐘 PostgresNitro1.147s (+0.8%)2.010s (~)0.862s101.03x
💻 LocalNext.js (Turbopack)⚠️missing----
🐘 PostgresNext.js (Turbopack)⚠️missing----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro1.976s (-28.1% 🟢)3.559s (-22.8% 🟢)1.584s101.00x
▲ VercelExpress2.019s (+7.1% 🔺)3.707s (~)1.687s101.02x
▲ VercelNext.js (Turbopack)2.348s (+26.7% 🔺)4.174s (+11.8% 🔺)1.826s101.19x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro10.856s (~)11.020s (~)0.164s31.00x
💻 LocalExpress10.891s (-0.8%)11.023s (~)0.132s31.00x
🐘 PostgresExpress10.893s (~)11.023s (~)0.130s31.00x
💻 LocalNitro10.950s (~)11.023s (~)0.073s31.01x
💻 LocalNext.js (Turbopack)⚠️missing----
🐘 PostgresNext.js (Turbopack)⚠️missing----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro17.952s (-1.2%)19.534s (-1.4%)1.582s21.00x
▲ VercelExpress18.171s (+4.3%)21.643s (+10.1% 🔺)3.472s21.01x
▲ VercelNext.js (Turbopack)20.329s (-4.1%)22.531s (-3.2%)2.202s21.13x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 25 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro14.546s (~)15.022s (~)0.476s41.00x
🐘 PostgresExpress14.701s (+0.8%)15.026s (~)0.325s41.01x
💻 LocalExpress14.848s (-0.9%)15.029s (~)0.181s41.02x
💻 LocalNitro15.066s (+1.0%)15.782s (+5.0% 🔺)0.716s41.04x
💻 LocalNext.js (Turbopack)⚠️missing----
🐘 PostgresNext.js (Turbopack)⚠️missing----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express32.376s (+0.8%)34.405s (~)2.029s21.00x
▲ VercelNitro33.423s (+7.5% 🔺)35.011s (+6.4% 🔺)1.588s21.03x
▲ VercelNext.js (Turbopack)37.785s (+12.8% 🔺)39.676s (+11.5% 🔺)1.891s21.17x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

workflow with 50 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro13.976s (~)14.450s (+2.0%)0.474s71.00x
🐘 PostgresExpress14.065s (-0.9%)14.589s (-2.0%)0.524s71.01x
💻 LocalExpress16.416s (-2.2%)17.029s (~)0.614s61.17x
💻 LocalNitro16.854s (+1.7%)17.032s (~)0.178s61.21x
💻 LocalNext.js (Turbopack)⚠️missing----
🐘 PostgresNext.js (Turbopack)⚠️missing----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)54.844s (-1.2%)56.753s (-1.1%)1.908s21.00x
▲ VercelNitro54.971s (+1.9%)56.002s (~)1.032s21.00x
▲ VercelExpress55.386s (+2.3%)57.173s (+2.5%)1.786s21.01x

🔍 Observability: Next.js (Turbopack) | Nitro | Express

Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.257s (~)2.009s (~)0.752s151.00x
🐘 PostgresExpress1.281s (~)2.010s (~)0.730s151.02x
💻 LocalExpress1.502s (-2.1%)2.005s (~)0.503s151.20x
💻 LocalNitro1.545s (-0.6%)2.007s (~)0.462s151.23x
💻 LocalNext.js (Turbopack)⚠️missing----
🐘 PostgresNext.js (Turbopack)⚠️missing----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.321s (-9.2% 🟢)3.606s (-14.1% 🟢)1.285s91.00x
▲ VercelExpress2.471s (+6.6% 🔺)4.509s (+14.0% 🔺)2.039s71.06x
▲ VercelNext.js (Turbopack)3.701s (+31.2% 🔺)5.087s (+13.3% 🔺)1.386s71.59x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro2.335s (~)3.010s (~)0.674s101.00x
🐘 PostgresExpress2.364s (+1.5%)3.009s (~)0.645s101.01x
💻 LocalExpress3.031s (-3.2%)3.454s (-11.1% 🟢)0.422s91.30x
💻 LocalNitro3.097s (-0.9%)3.676s (-5.4% 🟢)0.580s91.33x
💻 LocalNext.js (Turbopack)⚠️missing----
🐘 PostgresNext.js (Turbopack)⚠️missing----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro4.631s (+77.2% 🔺)6.049s (+42.9% 🔺)1.418s51.00x
▲ VercelNext.js (Turbopack)5.581s (+69.0% 🔺)7.938s (+46.7% 🔺)2.357s41.21x
▲ VercelExpress5.918s (+155.7% 🔺)7.465s (+95.6% 🔺)1.548s61.28x

🔍 Observability: Nitro | Next.js (Turbopack) | Express

Promise.all with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro3.456s (-0.9%)4.011s (~)0.556s81.00x
🐘 PostgresExpress3.488s (~)4.012s (~)0.524s81.01x
💻 LocalExpress7.909s (-5.1% 🟢)8.268s (-8.4% 🟢)0.359s42.29x
💻 LocalNitro8.371s (+2.6%)9.024s (+2.9%)0.653s42.42x
💻 LocalNext.js (Turbopack)⚠️missing----
🐘 PostgresNext.js (Turbopack)⚠️missing----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express2.932s (-22.3% 🟢)4.666s (-19.2% 🟢)1.734s71.00x
▲ VercelNitro3.348s (~)5.030s (~)1.682s61.14x
▲ VercelNext.js (Turbopack)3.702s (-17.4% 🟢)5.526s (-10.0% 🟢)1.824s61.26x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.243s (~)2.008s (~)0.764s151.00x
🐘 PostgresExpress1.260s (~)2.009s (~)0.749s151.01x
💻 LocalExpress1.489s (-3.0%)2.006s (~)0.517s151.20x
💻 LocalNitro1.554s (+0.9%)2.005s (~)0.451s151.25x
💻 LocalNext.js (Turbopack)⚠️missing----
🐘 PostgresNext.js (Turbopack)⚠️missing----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.272s (+7.4% 🔺)3.759s (-7.4% 🟢)1.487s81.00x
▲ VercelExpress2.363s (-18.9% 🟢)3.956s (-16.9% 🟢)1.593s81.04x
▲ VercelNitro2.722s (+14.0% 🔺)4.093s (+2.1%)1.372s81.20x

🔍 Observability: Next.js (Turbopack) | Express | Nitro

Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro2.316s (~)3.010s (~)0.694s101.00x
🐘 PostgresExpress2.359s (~)3.011s (~)0.652s101.02x
💻 LocalExpress2.973s (~)3.343s (-11.1% 🟢)0.370s91.28x
💻 LocalNitro3.110s (+4.7%)4.011s (+9.1% 🔺)0.901s81.34x
💻 LocalNext.js (Turbopack)⚠️missing----
🐘 PostgresNext.js (Turbopack)⚠️missing----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.644s (+0.7%)3.908s (-4.3%)1.264s81.00x
▲ VercelExpress2.748s (+4.6%)4.347s (-0.6%)1.599s71.04x
▲ VercelNext.js (Turbopack)2.769s (+3.2%)4.471s (+1.3%)1.702s71.05x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro3.473s (~)4.009s (~)0.536s81.00x
🐘 PostgresExpress3.489s (~)4.011s (~)0.522s81.00x
💻 LocalExpress8.587s (~)9.025s (~)0.438s42.47x
💻 LocalNitro9.178s (+3.9%)10.021s (+5.3% 🔺)0.843s32.64x
💻 LocalNext.js (Turbopack)⚠️missing----
🐘 PostgresNext.js (Turbopack)⚠️missing----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro3.224s (+17.1% 🔺)4.574s (-0.6%)1.350s71.00x
▲ VercelExpress3.486s (+20.4% 🔺)5.054s (+4.9%)1.568s61.08x
▲ VercelNext.js (Turbopack)3.534s (-31.0% 🟢)5.363s (-20.8% 🟢)1.829s61.10x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.830s (-0.6%)1.023s (+1.6%)0.193s591.00x
🐘 PostgresExpress0.843s (-2.2%)1.023s (~)0.181s591.02x
💻 LocalExpress0.956s (-1.9%)1.057s (-1.7%)0.101s571.15x
💻 LocalNitro1.002s (+3.0%)1.424s (+32.4% 🔺)0.422s431.21x
💻 LocalNext.js (Turbopack)⚠️missing----
🐘 PostgresNext.js (Turbopack)⚠️missing----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro8.585s (-2.3%)9.825s (-8.7% 🟢)1.241s71.00x
▲ VercelNext.js (Turbopack)9.313s (-1.2%)11.007s (-3.9%)1.693s61.08x
▲ VercelExpress9.411s (+8.6% 🔺)11.115s (+6.7% 🔺)1.705s61.10x

🔍 Observability: Nitro | Next.js (Turbopack) | Express

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.953s (-0.8%)2.150s (-4.8%)0.197s421.00x
🐘 PostgresExpress2.072s (-1.1%)2.945s (+1.1%)0.873s311.06x
💻 LocalExpress2.930s (-2.7%)3.111s (-12.3% 🟢)0.181s291.50x
💻 LocalNitro3.055s (-5.0%)3.923s (+4.4%)0.869s231.56x
💻 LocalNext.js (Turbopack)⚠️missing----
🐘 PostgresNext.js (Turbopack)⚠️missing----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express27.731s (+2.1%)29.575s (~)1.844s41.00x
▲ VercelNext.js (Turbopack)28.388s (~)30.206s (-1.4%)1.818s31.02x
▲ VercelNitro28.396s (+6.7% 🔺)30.130s (+5.8% 🔺)1.734s31.02x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro4.012s (~)4.626s (+6.8% 🔺)0.614s261.00x
🐘 PostgresExpress4.145s (-1.6%)5.011s (+0.8%)0.866s241.03x
💻 LocalExpress8.941s (-1.6%)9.247s (-3.2%)0.306s132.23x
💻 LocalNitro9.211s (+1.9%)10.019s (+4.8%)0.808s122.30x
💻 LocalNext.js (Turbopack)⚠️missing----
🐘 PostgresNext.js (Turbopack)⚠️missing----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro72.648s (-9.0% 🟢)74.885s (-8.2% 🟢)2.237s21.00x
▲ VercelExpress72.716s (-0.9%)74.726s (-1.8%)2.011s21.00x
▲ VercelNext.js (Turbopack)73.737s (~)75.610s (~)1.873s21.01x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.273s (-1.6%)1.007s (~)0.733s601.00x
🐘 PostgresExpress0.284s (-1.2%)1.007s (~)0.723s601.04x
💻 LocalExpress0.587s (+2.5%)1.022s (+1.7%)0.435s592.15x
💻 LocalNitro0.592s (-3.8%)1.005s (-1.6%)0.413s602.16x
💻 LocalNext.js (Turbopack)⚠️missing----
🐘 PostgresNext.js (Turbopack)⚠️missing----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro1.368s (-24.4% 🟢)2.671s (-19.0% 🟢)1.303s231.00x
▲ VercelExpress1.487s (+8.0% 🔺)3.007s (+9.8% 🔺)1.520s201.09x
▲ VercelNext.js (Turbopack)1.548s (+8.7% 🔺)3.119s (+9.5% 🔺)1.571s201.13x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.483s (-1.8%)1.006s (~)0.523s901.00x
🐘 PostgresExpress0.504s (+2.4%)1.007s (~)0.503s901.04x
💻 LocalNitro2.493s (-1.2%)3.008s (-1.1%)0.516s305.16x
💻 LocalExpress2.530s (~)3.075s (+2.2%)0.545s305.24x
💻 LocalNext.js (Turbopack)⚠️missing----
🐘 PostgresNext.js (Turbopack)⚠️missing----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.582s (-3.6%)4.055s (-10.6% 🟢)1.473s231.00x
▲ VercelExpress2.748s (+11.2% 🔺)4.337s (+3.6%)1.589s221.06x
▲ VercelNext.js (Turbopack)3.229s (+8.6% 🔺)4.764s (+2.6%)1.534s201.25x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.773s (~)1.016s (+0.8%)0.242s1191.00x
🐘 PostgresExpress0.807s (~)1.009s (~)0.202s1191.04x
💻 LocalNitro11.057s (+0.7%)11.574s (-0.8%)0.517s1114.30x
💻 LocalExpress11.135s (-1.4%)11.757s (-0.8%)0.622s1114.40x
💻 LocalNext.js (Turbopack)⚠️missing----
🐘 PostgresNext.js (Turbopack)⚠️missing----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro6.078s (-7.6% 🟢)7.423s (-9.1% 🟢)1.345s171.00x
▲ VercelNext.js (Turbopack)7.767s (+21.6% 🔺)9.729s (+21.2% 🔺)1.962s131.28x
▲ VercelExpress7.849s (+32.9% 🔺)9.580s (+27.7% 🔺)1.732s131.29x

🔍 Observability: Nitro | Next.js (Turbopack) | Express

Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express0.196s (-6.7% 🟢)1.004s (~)0.011s (-5.1% 🟢)1.017s (~)0.821s101.00x
🐘 PostgresExpress0.203s (-6.5% 🟢)0.997s (~)0.001s (~)1.011s (~)0.808s101.04x
💻 LocalNitro0.207s (-2.3%)1.004s (~)0.012s (+5.1% 🔺)1.018s (~)0.812s101.06x
🐘 PostgresNitro0.210s (+3.6%)0.997s (~)0.002s (+15.4% 🔺)1.009s (~)0.799s101.07x
💻 LocalNext.js (Turbopack)⚠️missing-----
🐘 PostgresNext.js (Turbopack)⚠️missing-----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express1.507s (-7.9% 🟢)2.587s (-10.7% 🟢)0.670s (+19.5% 🔺)3.674s (-5.6% 🟢)2.167s101.00x
▲ VercelNext.js (Turbopack)1.547s (-5.9% 🟢)3.035s (+4.7%)0.284s (-56.6% 🟢)3.780s (-6.6% 🟢)2.233s101.03x
▲ VercelNitro1.610s (-2.5%)2.974s (-4.3%)0.366s (-13.6% 🟢)3.708s (-6.3% 🟢)2.098s101.07x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

stream pipeline with 5 transform steps (1MB)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.615s (-0.8%)1.005s (~)0.006s (+124.5% 🔺)1.024s (~)0.409s591.00x
🐘 PostgresExpress0.620s (+2.3%)1.007s (~)0.004s (+4.1%)1.023s (~)0.403s591.01x
💻 LocalNitro0.726s (+1.6%)1.012s (~)0.009s (+3.6%)1.023s (~)0.297s591.18x
💻 LocalExpress0.823s (-12.6% 🟢)1.031s (+1.8%)0.009s (+3.4%)1.134s (-7.6% 🟢)0.311s541.34x
💻 LocalNext.js (Turbopack)⚠️missing-----
🐘 PostgresNext.js (Turbopack)⚠️missing-----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro3.847s (-4.5%)5.028s (-6.8% 🟢)0.224s (-39.4% 🟢)5.619s (-8.7% 🟢)1.772s111.00x
▲ VercelExpress3.990s (+2.2%)5.524s (~)0.269s (-16.8% 🟢)6.304s (~)2.313s101.04x
▲ VercelNext.js (Turbopack)4.380s (-5.6% 🟢)6.036s (-4.8%)0.234s (-5.5% 🟢)6.756s (-4.8%)2.376s91.14x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

10 parallel streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.960s (+1.1%)1.219s (+1.9%)0.000s (+2.0%)1.232s (+1.9%)0.271s491.00x
🐘 PostgresExpress0.961s (+0.8%)1.245s (+6.5% 🔺)0.000s (+325.0% 🔺)1.271s (+7.3% 🔺)0.311s481.00x
💻 LocalExpress1.206s (-15.9% 🟢)2.019s (~)0.001s (+98.3% 🔺)2.021s (-8.2% 🟢)0.815s301.26x
💻 LocalNitro1.248s (~)2.022s (~)0.000s (+71.4% 🔺)2.024s (~)0.777s301.30x
💻 LocalNext.js (Turbopack)⚠️missing-----
🐘 PostgresNext.js (Turbopack)⚠️missing-----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.691s (+4.3%)3.947s (+5.3% 🔺)0.001s (+Infinity% 🔺)4.288s (+2.8%)1.597s141.00x
▲ VercelExpress2.730s (+10.9% 🔺)4.110s (+13.2% 🔺)0.000s (+Infinity% 🔺)4.555s (+11.4% 🔺)1.825s141.01x
▲ VercelNext.js (Turbopack)2.975s (-7.1% 🟢)4.897s (+5.0% 🔺)0.001s (+800.0% 🔺)5.326s (+4.4%)2.351s121.11x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

fan-out fan-in 10 streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.719s (-3.0%)2.141s (+1.9%)0.000s (+Infinity% 🔺)2.154s (+0.6%)0.436s281.00x
🐘 PostgresExpress1.830s (+3.5%)2.137s (+3.0%)0.000s (-50.0% 🟢)2.148s (+1.9%)0.319s291.06x
💻 LocalExpress3.459s (-3.9%)3.967s (-3.2%)0.001s (+87.5% 🔺)3.972s (-3.1%)0.513s162.01x
💻 LocalNitro3.840s (-2.8%)4.037s (-3.4%)0.001s (-10.0% 🟢)4.398s (-3.1%)0.558s142.23x
💻 LocalNext.js (Turbopack)⚠️missing-----
🐘 PostgresNext.js (Turbopack)⚠️missing-----

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.512s (-27.1% 🟢)4.779s (-25.6% 🟢)0.000s (-25.0% 🟢)5.174s (-24.3% 🟢)1.662s121.00x
▲ VercelNitro4.057s (+11.5% 🔺)5.146s (+7.1% 🔺)0.000s (+9.1% 🔺)5.479s (+4.2%)1.422s111.16x
▲ VercelNext.js (Turbopack)5.643s (+39.5% 🔺)7.154s (+25.2% 🔺)0.000s (-100.0% 🟢)7.575s (+23.2% 🔺)1.932s81.61x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalExpress18/21
🐘 PostgresNitro19/21
▲ VercelNitro13/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express🐘 Postgres15/21
Next.js (Turbopack)▲ Vercel21/21
Nitro🐘 Postgres16/21
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run

@vercel

vercelBot commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

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

thank you so much! this is great. left manual comments of things we need to fix. excited to ship this after

johnlindquist added a commit that referenced this pull request Mar 24, 2026
…nd ijjk:
1. Remove the "Machine-Readable Surfaces" section from docs/content/docs/observability/index.mdx (reviewers say it's unnecessary and already in world docs)
2. Remove all @skip-typecheck annotations from durable-agent.mdx (8) and server-based.mdx (1) — types exist in built packages/ai/dist after pnpm build
3. In durable-agent.mdx, change "machine-readable tool activity" to "tool call details" in the stream() return description
4. In durable-agent.mdx "Aborting Long-Running Streams" section, add a warning callout that abortSignal is not yet supported (blocked by #1301), recommend timeout instead
5. In event-sourcing.mdx, update requestId description: "On Vercel, requestId is the platform request ID when available. Other worlds are not expected to provide a requestId."
6. In get-world.mdx, change "user-friendly names from the machine-readable workflowName field" to "human-readable names from the workflowName field"
7. In start-invalid-workflow-function.mdx, add "// Does NOT work" comment above the bad example line
8. In with-workflow.mdx: reframe outputFileTracingRoot as a workaround (Next.js auto-detects by default per ijjk); change options description from "control local development behavior" to "configure the Next.js integration"; scope the callout to "workflows.local options only affect local development"
9. Drop the withWorkflow() options callout from docs/content/docs/getting-started/next.mdx
10. Remove the Next.js-specific outputFileTracingRoot callout from framework-integrations.mdx
11. Add a Troubleshooting section with the start() invalid-workflow-function error to all 9 non-Next getting-started guides (astro, express, fastify, hono, nestjs, nitro, nuxt, sveltekit, vite), each with framework-appropriate config check in point 2
Prevent confusion when Next.js apps live below the repository root and workflow code imports sibling workspace packages.
This documents the output tracing root requirement at the point where users configure withWorkflow, so monorepo setups follow the same working patterns as the shipped Next.js integration instead of failing due to unresolved workspace imports.
Ploop-Iter: 1
Automated checkpoint commit.
Ploop-Iter: 2
Automated checkpoint commit.
Ploop-Iter: 3
Capture recent workflow documentation updates so the public docs and package guidance stay aligned with the implementation and current docs-typecheck behavior.
Ploop-Iter: 1
Document the current docs verification contract so contributors do not assume JavaScript examples are type-checked when only TypeScript snippets are enforced today.
Add regression coverage around the README language and framework integration guidance to keep those docs aligned with the implemented Next.js and docs-typecheck behavior as future changes land.
Ploop-Iter: 2
Document the most common causes of the invalid workflow function error so users can resolve start() failures from the API docs and Next.js setup flow without having to infer build-time requirements from runtime behavior.
Keep the new troubleshooting page aligned with the shipped runtime message and add regression coverage so future wording or cross-link changes do not silently break that guidance.
Ploop-Iter: 3
Document both supported NestJS module formats and add a regression check so the getting-started guide stays aligned with the package README as the integration evolves.
Ploop-Iter: 1
Keep the NestJS getting-started guide consistent across the ESM and CommonJS paths so readers do not mix module settings or import styles mid-setup.
Strengthen the docs regression coverage around the later guide sections so future edits are more likely to preserve the supported CommonJS path documented in the package README.
Ploop-Iter: 2
Document the recently added troubleshooting and observability patterns so the public docs stay aligned with the behavior users now encounter in practice.
This keeps the NestJS guide, workflow API reference, and docs regression coverage in sync with the runtime-facing guidance from recent changes.
Ploop-Iter: 3
Why: keep the docs aligned with recent API and runtime behavior changes so examples and reference pages don’t drift from the supported surface.
Ploop-Iter: 1
Add regression coverage for doc surfaces that are easy to drift from implementation so docs audits catch mismatches early and keep published guidance aligned with the supported API surface.
Ploop-Iter: 2
Keep new observability and server-testing guidance anchored to machine-readable interfaces so follow-up implementation changes do not silently drift away from the documented agent and automation patterns.
Ploop-Iter: 3
Keep the docs consistent so users get the same guidance when debugging hook token collisions and correlating workflow events with platform logs.
This prevents the event-sourcing reference from drifting away from the observability and error docs, and adds guard tests to catch regressions.
Ploop-Iter: 1
…itecture-d-2026-02-27T14-07-52-1.png from the repo root, workbench/fastify/public/index.html (a Nitro example mistakenly placed in the fastify workbench by a ploop checkpoint), all .claude/worktrees/* submodule references, and all 15 string-presence audit guard tests in packages/docs-typecheck/src/__tests__/ (they only assert keyword presence, not semantic correctness). None of these belong in the docs audit PR.
…nd ijjk:
1. Remove the "Machine-Readable Surfaces" section from docs/content/docs/observability/index.mdx (reviewers say it's unnecessary and already in world docs)
2. Remove all @skip-typecheck annotations from durable-agent.mdx (8) and server-based.mdx (1) — types exist in built packages/ai/dist after pnpm build
3. In durable-agent.mdx, change "machine-readable tool activity" to "tool call details" in the stream() return description
4. In durable-agent.mdx "Aborting Long-Running Streams" section, add a warning callout that abortSignal is not yet supported (blocked by #1301), recommend timeout instead
5. In event-sourcing.mdx, update requestId description: "On Vercel, requestId is the platform request ID when available. Other worlds are not expected to provide a requestId."
6. In get-world.mdx, change "user-friendly names from the machine-readable workflowName field" to "human-readable names from the workflowName field"
7. In start-invalid-workflow-function.mdx, add "// Does NOT work" comment above the bad example line
8. In with-workflow.mdx: reframe outputFileTracingRoot as a workaround (Next.js auto-detects by default per ijjk); change options description from "control local development behavior" to "configure the Next.js integration"; scope the callout to "workflows.local options only affect local development"
9. Drop the withWorkflow() options callout from docs/content/docs/getting-started/next.mdx
10. Remove the Next.js-specific outputFileTracingRoot callout from framework-integrations.mdx
11. Add a Troubleshooting section with the start() invalid-workflow-function error to all 9 non-Next getting-started guides (astro, express, fastify, hono, nestjs, nitro, nuxt, sveltekit, vite), each with framework-appropriate config check in point 2
Cherry-picked 6 still-needed fixes from #1200 that aren't covered by
this audit PR or #1516:
- Fix npx workflow description (observability)
- Remove fetch from restricted modules list (errors)
- Fix package name @workflow-worlds/postgres → @workflow/world-postgres (deploying)
- Fix stream wording (foundations/starting-workflows)
- Fix import path simple → simple-streaming (foundations/streaming)
- Add close(), getEncryptionKeyForRun(), writeToStreamMulti() to World interface,
update create() and streamer signatures (deploying/building-a-world)
- durable-agent.mdx: "structured tool activity" → "tool call information"
per VaguelySerious's suggestion
- next.mdx: drop monorepo callout from getting-started per pranaygp
(too much context too early; info is in withWorkflow API ref)
- encryption.mdx: add skip-typecheck for interface signature block
(getEncryptionKeyForRun overloads are not runnable code)
- nestjs.mdx: add skip-typecheck for WorkflowModule.forRoot config
snippet (fragment inside callout, full import shown above)
Verified: pnpm vitest run passes 300/300 in docs-typecheck.
Sign up for freeto 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.

4 participants

@johnlindquist@pranaygp@ijjk@VaguelySerious