{"record":{"id":"9ba84a4588494a7b","repo":"vercel/next.js","slug":"invalid-interception-route-path-cannot-use","errorCode":null,"errorMessage":"Invalid interception route: ${path}. Cannot use (..) marker at the root level, use (.) instead.","messagePattern":"Invalid interception route: (.+?)\\. Cannot use \\(\\.\\.\\) marker at the root level, use \\(\\.\\) instead\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/next/src/shared/lib/router/utils/interception-routes.ts","lineNumber":74,"sourceCode":"      `Invalid interception route: ${path}. Must be in the format /<intercepting route>/(..|...|..)(..)/<intercepted route>`\n    )\n  }\n\n  interceptingRoute = normalizeAppPath(interceptingRoute) // normalize the path, e.g. /(blog)/feed -> /feed\n\n  switch (marker) {\n    case '(.)':\n      // (.) indicates that we should match with sibling routes, so we just need to append the intercepted route to the intercepting route\n      if (interceptingRoute === '/') {\n        interceptedRoute = `/${interceptedRoute}`\n      } else {\n        interceptedRoute = interceptingRoute + '/' + interceptedRoute\n      }\n      break\n    case '(..)':\n      // (..) indicates that we should match at one level up, so we need to remove the last segment of the intercepting route\n      if (interceptingRoute === '/') {\n        throw new Error(\n          `Invalid interception route: ${path}. Cannot use (..) marker at the root level, use (.) instead.`\n        )\n      }\n      interceptedRoute = interceptingRoute\n        .split('/')\n        .slice(0, -1)\n        .concat(interceptedRoute)\n        .join('/')\n      break\n    case '(...)':\n      // (...) will match the route segment in the root directory, so we need to use the root directory to prepend the intercepted route\n      interceptedRoute = '/' + interceptedRoute\n      break\n    case '(..)(..)':\n      // (..)(..) indicates that we should match at two levels up, so we need to remove the last two segments of the intercepting route\n\n      const splitInterceptingRoute = interceptingRoute.split('/')\n      if (splitInterceptingRoute.length <= 2) {","sourceCodeStart":56,"sourceCodeEnd":92,"githubUrl":"https://github.com/vercel/next.js/blob/0eb377541648e63402a47b38fee00a8d0ce8f8f1/packages/next/src/shared/lib/router/utils/interception-routes.ts#L56-L92","documentation":"extractInterceptionRouteInformation rejects interception route strings that use the (..) marker when the intercepting route is at the root level. (..) means 'match one directory up', but the root has no parent, so the marker can never resolve; Next.js requires (.) (sibling match) at root. Fires during route parsing/validation of app-router interception routes.","triggerScenarios":"The (..) interception marker is used at the root level.","commonSituations":"Using (..) at the top of the route tree where (.) should be used instead.","solutions":["Use the (.) marker instead of (..) at the root level."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"0eb377541648e63402a47b38fee00a8d0ce8f8f1","analyzedAt":"2026-08-19T02:10:13.922Z","contentChangedAt":"2026-08-19T02:10:13.922Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}