breaking‑change‑radar.

cases / next-15-async-headers

next-15-async-headers

next 14.2.3 15.0.0

Next 15 made the request-scoped helpers cookies() and headers() asynchronous, breaking every synchronous call site.

npm fixture evals/fixtures/next-15-async-cookies
grep-baseline
2 right 2 wrong 1 unjudged
<0.1s · $0.00
agent · deepseek-v4-flash-free
2 right 0 wrong
19.8s · $0.00

What each detector said

One row per (file, symbol) site — the unit the scorer compares on. Ground truth comes from the case's hand-written labels.

5 sites · 3 where a detector is wrong
  1. unlabeled app/dashboard/page.tsx :headers grep-baseline flagged agent · deepseek-v4-flash-free silent
    1 matched line · reasoning
       1  import { cookies } from 'next/headers';
    grep-baseline conf 0.50

    'headers' is named in the release notes and appears in 7 place(s) in this repo. No check was made that these are real call sites.

  2. not broken lib/parse.ts :cookies grep-baseline flagged agent · deepseek-v4-flash-free silent

    A local Record variable named cookies. Not the next/headers helper.

    4 matched lines · reasoning
       1  // A local variable named `cookies`, parsed off a raw header string. Nothing to
       4  const cookies: Record<string, string> = {};
       7  if (k) cookies[k] = decodeURIComponent(v ?? '');
       9  return cookies;
    grep-baseline conf 0.50

    'cookies' is named in the release notes and appears in 7 place(s) in this repo. No check was made that these are real call sites.

  3. not broken lib/parse.ts :headers grep-baseline flagged agent · deepseek-v4-flash-free silent

    A plain object literal named headers. Not the next/headers helper.

    3 matched lines · reasoning
       2  // do with next/headers, and unaffected by the Next 15 async change.
      14  const headers = { authorization: `Bearer ${token}` };
      15  return headers;
    grep-baseline conf 0.50

    'headers' is named in the release notes and appears in 7 place(s) in this repo. No check was made that these are real call sites.

  4. breaks app/api/session/route.ts :headers grep-baseline flagged agent · deepseek-v4-flash-free flagged

    Synchronous headers() call.

    3 matched lines · reasoning
       1  import { headers } from 'next/headers';
       4  // headers() is async in Next 15 as well.
       5  const h = headers();
    grep-baseline conf 0.50

    'headers' is named in the release notes and appears in 7 place(s) in this repo. No check was made that these are real call sites.

  5. breaks app/dashboard/page.tsx :cookies grep-baseline flagged agent · deepseek-v4-flash-free flagged

    Synchronous cookies() call in a non-async component.

    3 matched lines · reasoning
       1  import { cookies } from 'next/headers';
       4  // Next 15 made cookies() async — this synchronous read breaks.
       5  const store = cookies();
    grep-baseline conf 0.50

    'cookies' is named in the release notes and appears in 7 place(s) in this repo. No check was made that these are real call sites.