cloudflare/vinext

App Router/Pages Router: `unstable_catchError` / `unstable_retry` boundary not implemented

Closed

#1,448 opened on May 22, 2026

 (0 comments) (0 reactions) (0 assignees)TypeScript (371 forks)github user discovery
adapter-api-e2ehelp wanted

Repository metrics

Stars
 (8,563 stars)
PR merge metrics
 (Avg merge 1d 1h) (462 merged PRs in 30d)

Description

This issue was created by an agent analysing CI failures from the Next.js Deploy Suite (vinext main vs Next.js v16.2.6, 2026-05-22).

Problem

The experimental unstable_catchError boundary and unstable_retry API from Next.js are not wired up in vinext. Tests time out waiting for #error-boundary-message/#pages-error-message to become visible because either the boundary does not catch the suspended error or unstable_retry does not re-render the subtree after the user requests a reset. Affects App Router (with and without React Compiler) and the Pages Router equivalent.

waiting for locator('#error-boundary-message') to be visible
waiting for locator('#pages-error-message') to be visible

Estimated Impact

~6 test failures across the deploy suite.

Affected Test Suites

  • test/e2e/app-dir/catch-error/catch-error-react-compiler.test.ts (3 failures)
  • test/e2e/app-dir/catch-error/catch-error.test.ts (3 failures)

Recommendation

  1. Reproduce first in vinext's own test suite. Add a test with a unstable_catchError boundary around a server component that throws, plus a button that calls unstable_retry. Confirm the boundary text appears and the retry re-runs the subtree.

  2. Study the Next.js implementation. Search .nextjs-ref/packages/next/src/client/components/ for unstable_catchError/unstable_retry to understand the boundary semantics and the retry API contract.

  3. Implement the boundary in App Router and Pages Router. Wire up the boundary component that catches suspended errors and exposes a retry() callback that re-renders the contained subtree.

  4. Mirror behaviour in both routers. The Pages Router variant uses #pages-error-message; the App Router variant uses #error-boundary-message. Both should be covered by the same primitive.


Part of #1328.

Contributor guide