$ the-wire · showcase
Cached Navigations stop leaking stale timestamps, Next.js drops dead CI
By RepoJournal · Filed · About Vercel · Composed from the cited sources · methodology
Next.js fixed a production renderer gap where Cached Navigations reused the previous request's uncached timestamps as static page content, while Vercel's workflow runtime tackled fan-out queue serialization and broken step stream writes.
Next.js patched a correctness bug in Cached Navigations where a repeat visit returned the *previous* response's `Date.now()` value while the new response was still pending, affecting both dynamic RSC responses and the RSC payload embedded in the initial HTML [1]. The cause: the production renderer left synchronous IO untracked on the assumption the build had already caught it, and a private cache exposed the gap when the static prerender suspended at the cache call. Separately, `useDrag` in devtools listened for `pointermove` and `pointerup` but not `pointercancel`, so a browser-cancelled gesture never invoked `cancel()` and the state machine stayed stuck at `{ state: 'drag' }` [2]. Two CI cleanups also landed: the Turbopack test manifest pipeline is gone because the manifest is no longer used for skipping tests and had stopped updating automatically [3], and the `Test examples` workflow was removed because its pinned Playwright image (v1.35.1) cannot launch against the version the repo now requires (v1.61.0) [4].
In vercel/workflow, the team addressed a latency tax on fan-out dispatch: a `Promise.all` fan-out previously paid roughly N/8 serialized round trips on time-to-first-step because publishes rode the shared undici agent (8 connections, HTTP/1.1, `pipelining: 1`) and `handleSuspension` was awaited in full before the first inline step body ran [5]. Step executor writes also stopped sending a slot snapshot, since the executor has no log to merge the returned event page into and previously discarded everything but the highest position [6]. A separate fix drains released step stream writers before completion, closing a race where `step_completed` ran the overall stream operation against a 500ms budget and a slow PUT could continue under `waitUntil` while the next step read a stale tail [7].
On vercel/eve, child task progress no longer wakes the parent through a separate model-facing `task_update` tool; clients now follow the child session stream, and the tool, its injected instructions, and its local and remote delivery paths were removed [8]. Tracing improved on three fronts: OpenTelemetry GenAI client spans now cover `search_memory` and `upsert_memory` [9], model input tracing no longer records messages twice (the legacy `ai.prompt.messages` path recursively enumerated binary attachments before enforcing the 32 KB limit, producing the memory growth in #3272) [10], and authored workflow tools now specialize to `invoke_workflow <tool>` spans after a nested `ctx.agent()` call proves GenAI composition [11].
On vercel/ai, `@ai-sdk/otel` fixed two attribution gaps: fallback generations were attributed to the failed primary provider because `gen_ai.provider.name` was initialized on start but never updated from the end event [12], and error spans dropped provider HTTP status codes because the span error recorder never inspected `APICallError.statusCode` or `RetryError.lastError` [13]. The Anthropic provider also accepted `prefixMismatchBehavior: 'error'` for Fable 5.1 thinking binding controls and began exposing input transformations in Anthropic metadata for generated, streamed, and batch responses [14].
Action items
- → Upgrade @ai-sdk/otel if you use fallback providers, so spans attribute to the provider that actually served the request vercel/ai [plan]
- → Upgrade vercel/workflow to pick up the fan-out batching and drained step stream writer fixes vercel/workflow [plan]
- → Watch for the Next.js release carrying the Cached Navigations synchronous IO fix before relying on cached timestamps in production vercel/next.js [monitor]
References
- [1] Prevent synchronous IO from entering Cached Navigations ↗ vercel/next.js
- [2] fix(devtools): handle pointercancel when dragging the indicator (#98506) ↗ vercel/next.js
- [3] [ci] Remove Turbopack test manifest pipeline (#98507) ↗ vercel/next.js
- [4] [ci] Remove the broken Test examples workflow and its test suite (#98517) ↗ vercel/next.js
- [5] perf(world-vercel): batch a fan-out's step-execution queue publishes (#3838) ↗ vercel/workflow
- [6] [core] Stop sending a slot snapshot on step executor writes (#4096) ↗ vercel/workflow
- [7] Drain released step stream writers before completion ↗ vercel/workflow
- [8] refactor(eve): remove child task_update progress callbacks ↗ vercel/eve
- [9] feat(eve): trace memory operations ↗ vercel/eve
- [10] fix(eve): use GenAI input messages for traces ↗ vercel/eve
- [11] feat(eve): trace workflow tool invocations ↗ vercel/eve
- [12] fix: OpenTelemetry fallback spans retain the failed primary provider attribution (#20648) ↗ vercel/ai
- [13] fix: preserve provider HTTP status codes in OpenTelemetry error spans (#20645) ↗ vercel/ai
- [14] feat(anthropic): expand preserved thinking support to cover `prefix_mismatch_behavior: 'error'` (#20624) ↗ vercel/ai