diff --git a/evals/README.md b/evals/README.md
index dbbb4057650a..81ea6baf210e 100644
--- a/evals/README.md
+++ b/evals/README.md
@@ -67,6 +67,20 @@ This runs two variants in parallel and prints pass/fail for each:
`agents-md` drops an AGENTS.md into the sandbox telling the agent to check `node_modules/next/dist/docs/` first. `baseline` doesn't. That's the whole difference — same prompt, same model, one extra file. If `agents-md` passes and `baseline` doesn't, the bundled docs are doing their job.
+### Evaluating a local skill
+
+Docs can link to a canonical skill, but an unmerged skill revision isn't part of the `next` package tarball. To compare the current checkout's skill with the baseline and bundled-docs variants, add `eval.config.json` to the fixture:
+
+```json filename="eval.config.json"
+{
+ "skills": ["next-partial-prefetching-adoption"],
+ "playwright": true,
+ "timeout": 1800
+}
+```
+
+The runner then adds a third `skills` variant for that fixture. It installs the listed directories from the local `skills/` folder before the coding agent starts, while keeping the prompt, app, and assertions identical. Set `playwright` when the workflow must execute browser tests so the sandbox has the required system libraries. The optional timeout lets end-to-end workflows run longer than the 12-minute default. Existing fixtures without `eval.config.json` continue to run only `baseline` and `agents-md`.
+
A run takes ~2–5 min. To validate a fixture without executing:
```bash
diff --git a/evals/evals/agent-050-optimize-static-shell/EVAL.ts b/evals/evals/agent-050-optimize-static-shell/EVAL.ts
new file mode 100644
index 000000000000..978adc22d2db
--- /dev/null
+++ b/evals/evals/agent-050-optimize-static-shell/EVAL.ts
@@ -0,0 +1,79 @@
+/**
+ * Optimize a static shell
+ *
+ * This is intentionally not the team-settings example from the guide. The
+ * agent must apply the same framework reasoning to a release route with a
+ * request-specific layout control, reusable file-backed data, URL-dependent
+ * live data, and both hard and soft navigation contracts.
+ */
+
+import { expect, test } from 'vitest'
+import { existsSync, readFileSync, readdirSync, statSync } from 'fs'
+import { join } from 'path'
+import { environment, transcript } from '@vercel/agent-eval/eval'
+
+const IGNORE_DIRS = new Set([
+ '.git',
+ '.next',
+ 'node_modules',
+ 'dist',
+ 'build',
+ 'coverage',
+])
+
+function readSourceFiles(dir: string): string[] {
+ if (!existsSync(dir)) return []
+
+ return readdirSync(dir).flatMap((entry) => {
+ if (IGNORE_DIRS.has(entry)) return []
+ const path = join(dir, entry)
+ if (statSync(path).isDirectory()) return readSourceFiles(path)
+ if (entry === 'EVAL.ts' || !/\.(ts|tsx|js|jsx)$/.test(entry)) return []
+ return readFileSync(path, 'utf-8')
+ })
+}
+
+const source = readSourceFiles(process.cwd()).join('\n')
+
+test('removes the route opt-out while keeping Cache Components enabled', () => {
+ const config = readFileSync(join(process.cwd(), 'next.config.ts'), 'utf-8')
+
+ expect(config).toMatch(/cacheComponents\s*:\s*true/)
+ expect(source).not.toMatch(/export\s+(?:const|var|let)\s+instant\s*=\s*false/)
+})
+
+test('retains production instant navigation regression coverage', () => {
+ expect(source).toMatch(/from\s+['"]@next\/playwright['"]/)
+ expect(source).toMatch(/\binstant\s*\(/)
+ expect(source).toMatch(/\.click\s*\(/)
+ expect(source).toMatch(/\.goto\s*\(/)
+})
+
+test('keeps the reusable checklist cache explicit', () => {
+ expect(source).toMatch(/['"]use cache['"]/)
+ expect(source).toMatch(/\bcacheLife\s*\(/)
+})
+
+test('produces a useful shell without caching request data', async () => {
+ await expect(environment).toSatisfyCriterion(
+ `The final /releases/aurora implementation keeps the release frame/navigation and Release operations heading outside request-time work. The existing viewer and rollout loading states are reused in focused Suspense boundaries. The viewer cookie and live rollout remain request-time and are not placed in a public cache. The page or a high-level boundary is not replaced with an empty or duplicate full-page fallback.`
+ )
+})
+
+test('caches only the reusable launch checklist', async () => {
+ await expect(environment).toSatisfyCriterion(
+ `The file-backed launch checklist is made reusable with a targeted use-cache boundary, so the real checklist can be included in the static shell. The cache does not include cookies, viewer identity, connection(), or live rollout state. The URL-dependent rollout stays fresh and streams behind its existing LiveRolloutSkeleton.`
+ )
+})
+
+test('ships trustworthy hard and soft instant guards', async () => {
+ await expect(environment).toSatisfyCriterion(
+ `The project retains @next/playwright instant() regression tests for both a Link click from / to /releases/aurora and an initial page.goto('/releases/aurora'). Each test asserts a real visible marker from the meaningful release shell while the lock is active. The tests run against a production build with exposeTestingApiInProductionBuild enabled only for the test build. At least one guard is self-validating by proving live rollout content is absent under the lock, so a missing testing API cannot pass vacuously. The tests do not use arbitrary short timing races, hover warming, or next dev.`
+ )
+})
+
+test('completed a verified RED-to-GREEN optimization loop', async () => {
+ await expect(transcript).toSatisfyCriterion(
+ `The agent used a production-like build, first confirmed the chosen release-shell marker renders without instant(), then ran the locked instant() coverage against the unfixed route and observed a trustworthy RED. It fixed the route, removed the temporary instant=false opt-out, and actually reran the hard and soft guards to GREEN. It finished with a successful production build. Merely writing tests or printing commands for the user does not satisfy this criterion.`
+ )
+})
diff --git a/evals/evals/agent-050-optimize-static-shell/PROMPT.md b/evals/evals/agent-050-optimize-static-shell/PROMPT.md
new file mode 100644
index 000000000000..b2fe275aaf33
--- /dev/null
+++ b/evals/evals/agent-050-optimize-static-shell/PROMPT.md
@@ -0,0 +1 @@
+Optimize the `/releases/aurora` route for both direct visits and client navigation from the home page. The release frame, heading, and reusable launch checklist should be ready immediately. The current viewer controls and live rollout details must remain request-time, using the loading states already in the app. Preserve the result with regression coverage and finish the production verification.
diff --git a/evals/evals/agent-050-optimize-static-shell/app/layout.tsx b/evals/evals/agent-050-optimize-static-shell/app/layout.tsx
new file mode 100644
index 000000000000..07e2db241f59
--- /dev/null
+++ b/evals/evals/agent-050-optimize-static-shell/app/layout.tsx
@@ -0,0 +1,9 @@
+import type { ReactNode } from 'react'
+
+export default function RootLayout({ children }: { children: ReactNode }) {
+ return (
+
+
{children}
+
+ )
+}
diff --git a/evals/evals/agent-050-optimize-static-shell/app/page.tsx b/evals/evals/agent-050-optimize-static-shell/app/page.tsx
new file mode 100644
index 000000000000..4ed987d17aa9
--- /dev/null
+++ b/evals/evals/agent-050-optimize-static-shell/app/page.tsx
@@ -0,0 +1,11 @@
+import Link from 'next/link'
+
+export default function HomePage() {
+ return (
+
+