Skip to content

[docs] Make v5 the default docs version#3100

Open
VaguelySerious wants to merge 9 commits into
mainfrom
peter/docs-5-ga
Open

[docs] Make v5 the default docs version#3100
VaguelySerious wants to merge 9 commits into
mainfrom
peter/docs-5-ga

Conversation

@VaguelySerious

@VaguelySerious VaguelySerious commented Jul 24, 2026

Copy link
Copy Markdown
Member

Makes v5 the default documentation version for the 5.0.0 GA. Companion to #3090 (exit changeset pre mode) and #3091 (pin 4.x publishes to previous).

content/docs/v5 and content/worlds/v5 now serve unprefixed — /docs, /worlds, /cookbook — and v4 moves under a /v4 prefix. The versioned source config already drives both route trees (the root tree always renders versionedSources.current), so this is a routePrefix move plus source re-binding, not a restructure. The only file moves are app/[lang]/v5/**app/[lang]/v4/**.

What changed

  • Version switcher: labels are now v5 (Latest) and v4 (Maintenance); current: 'v5'.
  • Banner: pre-release-banner.tsxmaintenance-banner.tsx. Instead of warning that v5 is a pre-release, v4 pages carry an amber notice — "Viewing Workflow 4.x documentation. This version only receives stability fixes." — linking to the current version. v5 pages have no banner. v4 pages keep robots: noindex, follow.
  • Redirects (docs/next.config.ts): /v5/* → unprefixed equivalent (permanent). Bare /v5 needs its own rule: :path* matches zero segments, but the expanded destination is then the empty string, which Next.js emits as an empty Location header. The world-docs and api-reference restructure rules are mirrored onto /v4/docs/*.
  • Version-switcher fallbacks inverted: the switcher adds or drops the route prefix without checking the target version has the page, so one-sided pages 404 on switch. Pages that exist only in v5 now get /v4/docs/... fallbacks (set-attributes, precondition-failed-error, world/analytics, three changelog entries, configuration, cancellation, react-router, …); the two v4-only pages (workflow-runtime/step-entrypoint, cookbook/advanced/distributed-abort-controller) fall back into the root tree. All temporary redirects — they get revisited on backport and can be dropped wholesale when v4 retires. Side effect: /docs/configuration and /docs/configuration/runtime-tuning are real pages again instead of being shadowed by the old fallback.
  • Link lint (docs/scripts/lint.ts): the two-space model swaps with the URL space. v5Space is the real HTTP space (unprefixed = v5, /v4-prefixed = v4); v4Space overlays the render-time href rewrite. Redirect destinations now resolve against the HTTP space, since redirects are matched server-side before any rendering — resolving them in the source space made the /v5/:path* expansion inherit v4 metadata.
  • Content sweep: dropped pre-release version gates from v5 content (requires workflow 5.0.0-beta.33 or later5.0.0, @beta dist-tag install instructions → a concrete pre-release version), and de-prefixed 5 self-referential /v5/... links in v5 pages.

Intentional oddity: v4 content links to /v5/...

rewriteHrefForVersion prefixes /docs and /worlds hrefs at render time, so an unprefixed /docs/... href on a v4 page is pulled into the /v4 view. A /v5/... href is therefore the only way for v4 content to point at the current version's page, and it resolves through the permanent redirect above. Three such links in content/docs/v4 and content/worlds/v4 are kept deliberately; the lint models this.

Verification

  • pnpm build: exit 0, 916 static pages. /[lang]/docs/[[...slug]] renders 165 v5 pages, /[lang]/v4/docs/[[...slug]] 141 v4 pages; cookbook 20 unprefixed / 21 under /v4 (the v4-only recipe appears only there).
  • bun ./scripts/lint.ts: 0 errored files, 0 errors.
  • 35-URL curl matrix against pnpm start: /docs → 308 /docs/getting-started; /v4/docs → 307 /v4/docs/getting-started; /v5/docs/getting-started → 308 unprefixed; /v5 → 308 /; markdown routes (/docs/deploying.md, /v4/docs/deploying.md, /v4/cookbook/advanced/child-workflows.md) 200; /sitemap.md 200 with 166 /v4/ entries; /llms.txt 200 with none (current sources only).

Empty changeset — docs only, no published package changes.

Docs Preview

Base: https://workflow-docs-git-peter-docs-5-ga.vercel.sh (Vercel SSO)


Follow-up commit: What's new page, sidebar drill-in, migration skill

/docs/whats-new

New top-level page, first in the v5 sidebar above Getting Started. Highlights (turbo/time-to-first-step, cancellation, attributes, start() in workflow context, getConflict()Run, typed error serialization, linked tracing + world.analytics, the configuration reference, React Router / NestJS / Python), then a breaking-change table, then a ## Migrating from V4 section pointing at the new skill.

The table was built from git diff origin/stable HEAD on the package surface, not from the changelogs — the changelogs carry the whole 4.x history and over-report. Two claims I had drafted and dropped after checking the code: createLocalWorld() already took a config object in 4.x (args?: Partial<Config> on both branches, only recoverActiveRuns's env fallback is new), and world.steps.get's first parameter went from string | undefined to string rather than being newly added. getStreamChunksstreams.getChunks was missing and is now listed.

/v4/docs/whats-new gets a temporary version-switcher fallback to /v4/docs, matching the other v5-only pages.

Sidebar: no drill-in on /docs/getting-started

/docs redirects to /docs/getting-started, so that page is where every bare docs link lands — and geistdocs' findActiveRootSection was drilling the sidebar into the section pane there, replacing the top-level menu with the framework list. Fix is in docs-layout.tsx, the one place both trees are already transformed: on that exact slug, empty the section's children. findActiveRootSection only matches folders with children, so the root menu stays visible with the row highlighted as current. Nothing is lost — the page body is a card grid of exactly those children — and every other page in the section still drills in normally.

Both docs layouts moved into their [[...slug]] segment so params.slug is available server-side; no client component, no hydration flash. defaultOpen: true on getting-started/meta.json was left alone after checking: it only feeds SidebarTree (mobile sheet + section pane), not the desktop root-pane drill-in, and it is a shared convention across root folders.

Also fixed in passing: editPath on the two current-version routes still pointed at docs/content/docs/v4/{path}.

skills/migrating-workflow-v4-to-v5

Agent skill for the upgrade. Mechanical rules (async getWorld()/createWorld()/getWorldHandlers(), removed runStep and stepEntrypoint, removed workflow/internal/private and @workflow/core/private, the world.streams.* rename and argument reorder, steps.get(runId, …), getConflict()Run, NestLocalBuilderworkflow/nest/builder), a separate section for behavior changes it must report rather than silently "fix" (linked tracing, precondition guard, turbo, typed errors, pre-upgrade world-postgres error: undefined rows, in-flight runs not migrating), a fixed output shape, and a fail-the-migration checklist. The stream reorder gets called out explicitly because a rename alone type-checks while passing a stream name where a run ID belongs.

Verification

  • bun ./scripts/lint.ts: 0 errored files, 0 errors — so every link on the new page resolves in both spaces.
  • pnpm build: exit 0, 919 static pages (916 + the new page and its og / markdown variants).
  • Sidebar change confirmed in prerendered output rather than by eye: the section pane injects an "Overview" row, so grep -c ">Overview" distinguishes the two states. en/docs/getting-started.html → 0, en/docs/foundations.html → 1, en/docs/getting-started/next.html → 1. Same on v4: en/v4/docs/getting-started.html → 0, en/v4/docs/foundations.html → 1.
  • Sidebar order verified by byte offset in foundations.html: docs/whats-new at 28378 precedes docs/getting-started at 28816.

Docs Preview

Page Link
What's new in v5? https://workflow-docs-git-peter-docs-5-ga.vercel.sh/docs/whats-new
Sidebar: no drill-in here https://workflow-docs-git-peter-docs-5-ga.vercel.sh/docs/getting-started
Sidebar: still drills in https://workflow-docs-git-peter-docs-5-ga.vercel.sh/docs/getting-started/next
v4 fallback for the new page https://workflow-docs-git-peter-docs-5-ga.vercel.sh/v4/docs/whats-new

Follow-up commit: highlights rewrite + full breaking-change sweep

Highlights rewritten around the headline items

The first pass listed changes in roughly the order I found them. This one leads with the story: faster and cheaper runs, broken into the three mechanisms that compound (single-pass invocations that only return to the queue at a wait/hook/timeout; persistence-layer work skipped where the runtime can determine it is safe; payload compression), then the measured outcome — time to first step roughly halved vs v4, and on Vercel Workflows up to 80% lower compute cost for many-small-step workflows and up to 70% lower storage cost.

Cost and performance are framed mechanically (fewer invocations, fewer queue messages, fewer storage round trips, fewer stored bytes) so they read as true on any World, with the percentages explicitly attributed to Vercel Workflows rather than implied as SDK-wide.

Then: regional run placement (World.createRunId() + region on queue dispatch, with world-vercel as the implementation), in-flight cancellation, attributes GA, and the redesigned trace viewer — which had been Vercel-Observability-only and now ships to open-source users via npx workflow inspect runs --web. The five published Vercel changelogs are linked from the relevant sections. Everything else that was a ### before (start() in a workflow, hook coordination, typed errors, tracing/analytics, the configuration reference, new frameworks) collapsed into a single "Also new in 5.0" bullet list.

Breaking changes: second pass against CHANGELOG-5.0.0-draft.md

The first table was built from the package diff against stable, which misses build-time and contract-level changes. Reading the draft changelog end to end surfaced ten more. The table is now split into Application code and Custom Worlds and build integrations, and gained:

  • deterministic seed derivation changed to runId:workflowName:deploymentId — so a pre-upgrade run must not be replayed post-upgrade, which is a stronger statement than "in-flight runs don't migrate"
  • duplicate step/workflow IDs across non-exported workspace files now fail the build
  • the per-run event limit (MAX_EVENTS_EXCEEDED)
  • stream leading-chunk flush window 10ms → 0
  • experimental_setAttributessetAttributes
  • generated bundles CJS → ESM
  • the removed client SWC transform mode
  • the suspension/dispatch contract change for World implementers (no more asymmetric { timeoutSeconds } wait return)
  • build-time static world injection + the createWorld() factory
  • the world-local chunk layout move to streams/chunks/<streamName>/

Plus a note that lazyDiscovery: true is now the withWorkflow default on Next.js ≥ 16.2.0-canary.48.

The skill got the same items (bumped to 0.2.0): two new intake greps, rewrite rules for setAttributes and mode: 'client', six new entries under "behavior changes that need a decision", the two World contract changes in step 4, and two new fail-the-migration checks.

Two undocumented env vars

The event-limit row needed something to link to, and neither variable was documented. Verified the numbers in code rather than from the changelog: DEFAULT_MAX_EVENTS_PER_RUN = 25_000 in world-local, and the Vercel backend's own default is also 25,000, both overridable.

  • WORKFLOW_MAX_EVENTS_OVERRIDE → Runtime Tuning, new "Limits" section (clamp-down only; never raises the World's limit)
  • WORKFLOW_MAX_EVENTS → Configuration › Worlds, under Local World

Verification

  • bun ./scripts/lint.ts: 0 errored files, 0 errors.
  • pnpm build: exit 0.
  • Anchor targets confirmed in prerendered HTML rather than assumed: id="workflow_max_events_override" in runtime-tuning.html, id="workflow_max_events" in worlds.html.
  • All five Vercel changelog URLs return 200 without the __vercel_draft param.

Docs Preview

Page Link
What's new in v5? https://workflow-docs-git-peter-docs-5-ga.vercel.sh/docs/whats-new
Runtime Tuning › Limits https://workflow-docs-git-peter-docs-5-ga.vercel.sh/docs/configuration/runtime-tuning#workflow_max_events_override
Worlds › Local World https://workflow-docs-git-peter-docs-5-ga.vercel.sh/docs/configuration/worlds#workflow_max_events

v5 goes stable, so the docs swap places: content/docs/v5 and
content/worlds/v5 now serve unprefixed (/docs, /worlds, /cookbook) and
v4 moves under a /v4 prefix. The versioned source config drives both
route trees, so the swap is a routePrefix + source re-binding plus the
app/[lang]/v5 -> app/[lang]/v4 tree rename.

- Switcher labels: "v5 (Latest)" / "v4 (Maintenance)".
- The v5 pre-release banner becomes an amber maintenance notice on v4
  pages, pointing at the current version.
- /v5/* redirects onto its unprefixed equivalent (bare /v5 needs its own
  rule, since the wildcard expands to an empty destination). v4 content
  keeps its /v5/... hrefs on purpose: render-time href rewriting would
  pull an unprefixed /docs link into the /v4 view.
- Version-switcher fallbacks are inverted: pages that exist only in v5
  now get /v4 fallbacks, and the two v4-only pages fall back to the
  root tree. /docs/configuration/* is a real page again.
- The link lint's two-space model swaps with the URL space: unprefixed
  is v5, /v4-prefixed is v4, and redirect destinations resolve against
  the HTTP space (they are matched before rendering).
- Content sweep: drop pre-release version gates and beta dist-tag
  references from v5 content, and de-prefix self-referential /v5 links.
@VaguelySerious
VaguelySerious requested review from a team and ijjk as code owners July 24, 2026 21:49
@changeset-bot

changeset-bot Bot commented Jul 24, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: b36c1a1

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 Jul 24, 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, Comment Jul 25, 2026 12:08am
example-nextjs-workflow-webpack Ready Ready Preview, Comment Jul 25, 2026 12:08am
example-workflow Ready Ready Preview, Comment Jul 25, 2026 12:08am
workbench-astro-workflow Ready Ready Preview, Comment Jul 25, 2026 12:08am
workbench-express-workflow Ready Ready Preview, Comment Jul 25, 2026 12:08am
workbench-fastify-workflow Ready Ready Preview, Comment Jul 25, 2026 12:08am
workbench-hono-workflow Ready Ready Preview, Comment Jul 25, 2026 12:08am
workbench-nestjs-workflow Ready Ready Preview, Comment Jul 25, 2026 12:08am
workbench-nitro-workflow Ready Ready Preview, Comment Jul 25, 2026 12:08am
workbench-nuxt-workflow Ready Ready Preview, Comment Jul 25, 2026 12:08am
workbench-sveltekit-workflow Ready Ready Preview, Comment Jul 25, 2026 12:08am
workbench-tanstack-start-workflow Ready Ready Preview, Comment Jul 25, 2026 12:08am
workbench-vite-workflow Ready Ready Preview, Comment Jul 25, 2026 12:08am
workflow-docs Ready Ready Preview, Comment, Open in v0 Jul 25, 2026 12:08am
workflow-swc-playground Ready Ready Preview, Comment Jul 25, 2026 12:08am
workflow-tarballs Ready Ready Preview, Comment Jul 25, 2026 12:08am
workflow-web Ready Ready Preview, Comment Jul 25, 2026 12:08am

- New top-level `/docs/whats-new` page above Getting Started: highlights,
  verified breaking-change table, and a "Migrating from V4" section.
- New `skills/migrating-workflow-v4-to-v5` agent skill covering the async
  `getWorld()`, removed `runStep`/`stepEntrypoint`/private subpaths, the
  `world.streams.*` argument reorder, `steps.get(runId, ...)`, the
  `getConflict()` -> `Run` shape, and the Nest builder subpath.
- Landing on `/docs/getting-started` (where bare `/docs` links redirect) no
  longer drills the sidebar into the framework list; the root menu stays
  visible. Both docs layouts moved into their `[[...slug]]` segment so the
  active slug is available server-side.
@github-actions

github-actions Bot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

All tests passed

E2E Test Summary

Summary
Passed Failed Skipped Total
✅ ▲ Vercel Production 1455 0 239 1694
✅ 💻 Local Development 1621 0 227 1848
✅ 📦 Local Production 1621 0 227 1848
✅ 🐘 Local Postgres 1621 0 227 1848
✅ 🪟 Windows 154 0 0 154
✅ 📋 Other 1020 0 212 1232
✅ vercel-multi-region 27 0 0 27
Total 7519 0 1132 8651
Details by Category

✅ ▲ Vercel Production

App Passed Failed Skipped
✅ astro 126 0 28
✅ example 126 0 28
✅ express 126 0 28
✅ fastify 126 0 28
✅ hono 126 0 28
✅ nextjs-turbopack 151 0 3
✅ nextjs-webpack 151 0 3
✅ nitro 126 0 28
✅ nuxt 126 0 28
✅ sveltekit 145 0 9
✅ vite 126 0 28

✅ 💻 Local Development

App Passed Failed Skipped
✅ astro-stable 128 0 26
✅ express-stable 128 0 26
✅ fastify-stable 128 0 26
✅ hono-stable 128 0 26
✅ nextjs-turbopack-canary 135 0 19
✅ nextjs-turbopack-stable 154 0 0
✅ nextjs-webpack-canary 135 0 19
✅ nextjs-webpack-stable 154 0 0
✅ nitro-stable 128 0 26
✅ nuxt-stable 128 0 26
✅ sveltekit-stable 147 0 7
✅ vite-stable 128 0 26

✅ 📦 Local Production

App Passed Failed Skipped
✅ astro-stable 128 0 26
✅ express-stable 128 0 26
✅ fastify-stable 128 0 26
✅ hono-stable 128 0 26
✅ nextjs-turbopack-canary 135 0 19
✅ nextjs-turbopack-stable 154 0 0
✅ nextjs-webpack-canary 135 0 19
✅ nextjs-webpack-stable 154 0 0
✅ nitro-stable 128 0 26
✅ nuxt-stable 128 0 26
✅ sveltekit-stable 147 0 7
✅ vite-stable 128 0 26

✅ 🐘 Local Postgres

App Passed Failed Skipped
✅ astro-stable 128 0 26
✅ express-stable 128 0 26
✅ fastify-stable 128 0 26
✅ hono-stable 128 0 26
✅ nextjs-turbopack-canary 135 0 19
✅ nextjs-turbopack-stable 154 0 0
✅ nextjs-webpack-canary 135 0 19
✅ nextjs-webpack-stable 154 0 0
✅ nitro-stable 128 0 26
✅ nuxt-stable 128 0 26
✅ sveltekit-stable 147 0 7
✅ vite-stable 128 0 26

✅ 🪟 Windows

App Passed Failed Skipped
✅ nextjs-turbopack 154 0 0

✅ 📋 Other

App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 128 0 26
✅ e2e-local-dev-tanstack-start- 128 0 26
✅ e2e-local-postgres-nest-stable 128 0 26
✅ e2e-local-postgres-tanstack-start- 128 0 26
✅ e2e-local-prod-nest-stable 128 0 26
✅ e2e-local-prod-tanstack-start- 128 0 26
✅ e2e-vercel-prod-nest 126 0 28
✅ e2e-vercel-prod-tanstack-start 126 0 28

✅ vercel-multi-region

App Passed Failed Skipped
✅ nextjs-turbopack 27 0 0

📋 View full workflow run

@github-actions

github-actions Bot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit b36c1a1 · Sat, 25 Jul 2026 00:25:52 GMT · run logs

Backend: vercel · app: nextjs-turbopack

Metric Scenario Best (ms) P75 (ms) P90 (ms) P99 (ms) Samples
TTFS step 214 (-70%) 💚 1342 🔴 (+29%) 🔻 1460 🔴 (+32%) 🔻 1507 🔴 (+31%) 🔻 30
TTFS stream 270 (-73%) 💚 1380 🔴 (+28%) 🔻 1416 🔴 (+22%) 🔻 1492 🔴 (+16%) 🔻 30
TTFS hook + stream 438 (-66%) 💚 1559 🔴 (+11%) 1635 🔴 (+13%) 1755 🔴 (+4.8%) 30
STSO 1020 steps (1-20) 132 (-34%) 💚 247 🔴 (-11%) 307 🔴 (-11%) 313 🔴 (-19%) 💚 19
STSO 1020 steps (101-120) 179 (-17%) 💚 258 🔴 (-7.9%) 352 🔴 (+18%) 🔻 382 🔴 (+1.3%) 19
STSO 1020 steps (1001-1020) 490 (±0%) 597 🔴 (+6.6%) 668 🔴 (+12%) 839 🔴 (+39%) 🔻 19
WO 1020 steps 400022 (-3.0%) 400022 (-3.0%) 400022 (-3.0%) 400022 (-3.0%) 1
SL stream latency 88 (-11%) 145 🔴 (+11%) 172 🔴 (+16%) 🔻 200 🔴 (-3.8%) 30
SO stream overhead (text) 124 (-4.6%) 178 (-18%) 💚 228 (-7.3%) 275 (+1.9%) 30
SO stream overhead (structured) 111 (-21%) 💚 260 🔴 (+18%) 🔻 326 (+31%) 🔻 597 (-14%) 30
📜 Previous results (1)

4a6fabd

Fri, 24 Jul 2026 23:38:35 GMT · run logs

vercel / nextjs-turbopack

Metric Scenario Best (ms) P75 (ms) P90 (ms) P99 (ms) Samples
TTFS step 1279 (+30%) 🔻 1401 🔴 (+29%) 🔻 1421 🔴 (+23%) 🔻 1511 🔴 (+25%) 🔻 30
TTFS stream 1204 (+421%) 🔻 1379 🔴 (+27%) 🔻 1432 🔴 (+27%) 🔻 1545 🔴 (+8.6%) 30
TTFS hook + stream 1505 (+53%) 🔻 1667 🔴 (+15%) 🔻 1711 🔴 (+13%) 1779 🔴 (+7.6%) 30
STSO 1020 steps (1-20) 177 (-13%) 259 🔴 (-6.8%) 348 🔴 (-7.9%) 466 🔴 (+2.6%) 19
STSO 1020 steps (101-120) 186 (-19%) 💚 283 🔴 (-15%) 370 🔴 (-8.6%) 1186 🔴 (±0%) 19
STSO 1020 steps (1001-1020) 465 (-8.1%) 588 🔴 (+0.9%) 710 🔴 (+13%) 824 🔴 (+20%) 🔻 19
WO 1020 steps 405651 (-4.4%) 405651 (-4.4%) 405651 (-4.4%) 405651 (-4.4%) 1
SL stream latency 96 (-11%) 159 🔴 (-1.2%) 194 🔴 (+4.3%) 253 🔴 (+1.2%) 30
SO stream overhead (text) 112 (-25%) 💚 181 (-25%) 💚 199 (-24%) 💚 233 (-37%) 💚 30
SO stream overhead (structured) 105 (-32%) 💚 175 (-23%) 💚 196 (-19%) 💚 314 (-1.3%) 30
ℹ️ Metric definitions & methodology

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 · STSO (1-20) 20/30/60 · STSO (101-120) 30/45/90 · STSO (1001-1020) 40/60/120

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.

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

Reviewed the version inversion end to end — source binding, routing, SEO metadata, and the agent-facing surfaces — and ran the verification suite locally (link lint, full docs build, all 21 smoke checks). Approving, with one pre-merge housekeeping step and one cross-PR gap worth closing before GA.

The AGENTS.md-critical sitemap behavior survives: both sitemap.md routes and the llms.mdx route are untouched, and the source lists stay symmetric — allSources still carries six bundles (current docs + cookbook + worlds, plus the prefixed set), with only the version identity swapped. Nothing falls out of search/llms.txt/sitemap coverage, which is the failure mode a version flip could easily introduce.

Routing and SEO checks:

  • The bare /v5 rule is a real edge, not defensive noise: :path* matches zero segments and the expanded destination collapses to an empty Location. Good catch, and worth the extra rule.
  • The noindex/canonical inversion is complete and correct — isMaintenance now drives robots: { index: false, follow: true } on v4 pages with the canonical pointing at the unprefixed URL, exactly mirroring what v5 pages had when they were the pre-release side.
  • The banner swap (pre-release → maintenance, with a one-click same-page link to latest via buildVersionUrl) is the right treatment for readers arriving on v4 from old links.
  • The switcher-fallback inversion is honest about its own limitation (the switcher adds/drops a prefix without checking the target has the page) and correctly uses temporary redirects so they can be dropped wholesale at v4 retirement rather than lingering as permanents.

Verified locally: link lint 0 errors, full docs build passes, 21/21 smoke checks including the new /v4/worlds/vercel assertion. The new migration skill is a new file, so version: '0.1.0' is correct (the AGENTS.md bump rule applies to modifications).

Pre-merge: merge main to clear the CI failure. Unit Tests (ubuntu-latest) fails on world-testing's inline-batches-debug timing out — which is precisely the shared-data-dir concurrency flake fixed by #3055 (merged to main at 22:46Z). This branch's head is from 22:56Z but branched before that merge, so it doesn't carry the fix. A docs-only change can't cause a world-testing timeout; a main merge should turn it green.

Cross-PR gap that should not ship with GA (flagged on #3091 too): once 5.0.0 takes latest, the v4 docs' install instructions become actively wrong. 15 v4 pages carry bare npm i workflow, and docs/v4/errors/corrupted-event-log.mdx + docs/v4/errors/runtime-decryption-failed.mdx both say npm install workflow@latest — a v4 troubleshooting page telling someone mid-incident to run a command that now performs a major upgrade to 5.x. This PR is the one that makes v4 the maintenance line, so it's the natural place to sweep those to workflow@previous (or a pinned workflow@4), but anywhere before GA is fine.

Comment thread docs/content/worlds/v5/postgres.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Co-authored-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
Comment thread docs/content/docs/v5/whats-new.mdx Outdated
VaguelySerious and others added 3 commits July 24, 2026 16:55
Co-authored-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
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