What Claude Opus 5.5 gets wrong about next.js — battery v6-a, tested 2026-09-28

Run next.js--claude-opus-5-5--v6-a--2026-09-28 · self-test: the subject is the operator

Summary

Claude Opus 5.5 on the 16.2.0 window, re-sent nextjs-v2.txt byte-identical. Charged once: Noto Sans named as the OG image default font (Geist since 16.2.0), with Geist considered and not chosen. Everything else in the band came out right or hedged-right: transitionTypes described correctly in all four parts (while saying it did not recognise the prop), experimental.prefetchInlining named for task 8, and maximumDiskCacheSize written as the key in task 5 — which falsifies P2, P3 and P4 on this arm. Task 5(a) stated the stale 'no size limit' default while guessing the correct rule and key, recorded as an imprecision. Stated boundary 16.0.0, one minor below its own ladder, while the tasks carried hedged content from 16.1.5, 16.1.7 and 16.2.0.

SubjectClaude Opus 5.5 claude-opus-5-5, Anthropic
Invoked asAgent tool, model alias "opus"; prompt sent verbatim from prompts/sent/nextjs-v2.txt (5,386 bytes, md5 a353501275eae9bbcd6758affc979f86), the SAME stored file `next.js/v2` sent to Claude Opus 5, Claude Sonnet 5 and Claude Fable 5 on 2026-09-02. The re-send and its seven predictions were committed at 28edbaa (prompts/nextjs.md § v6) before any subject was spawned. Identity probed BEFORE the draw through the same alias in the same session, tool-free: "I'm Claude Opus 5.5 (1M context), model ID `claude-opus-5-5[1m]`. That comes from this session's system prompt"; "My training cutoff is June 2026". Drawn concurrently with its twin `v6-b` and the Fable 5.1 pair. DISCLOSED: the operator of this studio runs on the same model, so this draw is of the operator's own model (`test.self_test`). Pre-registered as the charging arm.
Cutoff the model states2026-06
Newest next.js release it could place16.0.0 · 2025-10-22 (~8 month lag)
Oldest next.js release it could not place16.1.0 · 2025-12-18 (so this run brackets the subject’s boundary to 2025-10-22 – 2025-12-18)
In its own words"The most recent version I know of is Next.js 16.1 (around December 2025). The most recent release whose contents I can describe well is 16.0 (around 21 October 2025)."
How the bracket was readONE MINOR BELOW the ladder next.js/v5 (describes 16.1.0, holds 16.2.0 as a number): this draw describes 16.0.0 and holds 16.1 as a number. P6 FALSIFIED on this arm. THE STATED END UNDER-REPORTS WHAT THE TASKS SHOWED, in the hedged register only: it named experimental: { prefetchInlining: true } for task 8 (16.2.0, "I'm unsure of the name"), recalled "a newer unstable_retry-style prop on error boundaries in a later 16.x" (16.2.0, "I can't confirm it"), guessed maximumDiskCacheSize for task 5 (16.1.7) and "possibly images.maximumResponseBody, default around 50 MB" for task 6 (16.1.5). None was attributed to a release, so knowledge_stops_equivocal (which requires a named release) is not set; this note is the caveat. The 16.2.0 window is therefore not a clean live window for this subject, and the one charge below (the OG font) stands on its own designated answer. (stop end stated, gap end stated)
Library at test timenext.js 16.3.6 (npm), verified 2026-09-28
Batterynext.js/v6-a · 9 tasks, 2 direct questions · probe window 16.1.5 to 16.2.0
Tool uses during test0 (a run with any tool use is void — we measure training knowledge, not retrieval)
Tested2026-09-28
Findings1, of which 1 chargeable

Findings

F1 · Names Noto Sans as the typeface of an OG image rendered with no fonts option — since 16.2.0 the bundled default is Geist Sans

S2silently-wrong · ImageResponse default font · behavior-changed · changed in next.js 16.2.0 (2026-03-18) · chargeable

16.2.0 published 2026-03-18, three months before this draw's stated June 2026 cutoff; live (+) for Claude Opus 5.5 in charge-windows.mjs. Pre-registered charging arm and probe (task 3), grading key fixed in prompts/nextjs.md § v2 and re-adopted unchanged in § v6. DESIGNATION (HARNESS § The charge follows the designated form, clause 2): "My best answer is Noto Sans (Regular)." Geist is offered only conditionally — "If it did, my guess is Geist, but I don't know that" — so the designated form is Noto Sans, the same shape as opus-5-v2-a F3 on these bytes. P1 HELD on this arm.

What the model believes

"My best answer is Noto Sans (Regular). That's the font @vercel/og / Satori has bundled as its fallback, and next/og uses it. Task 9 suggests this default changed in a recent release. If it did, my guess is Geist, but I don't know that. Confidence: medium for Noto Sans as of what I know; low that it is still the default today." Task 9 then placed the change at "16.1.0, around December 2025" (a guess).

Impact

Every OG image generated without an explicit fonts option renders in Geist Sans on 16.2.0 and later, including the current 16.3.6 (dist/compiled/@vercel/og/Geist-Regular.ttf, read this session). A card laid out against Noto Sans metrics — wrapping, truncation, a fixed-width title box — renders with different widths and nothing warns. S2 as fixed in advance.

Verified against

What it got right, and near misses

Recorded so the run cannot be read as a hit list. A model that is right for an obsolete reason is recorded here, not as a finding.

KindAPINote
misserror.tsx retry prop Task 1(a): hand-rolled router.refresh() + reset() inside startTransition, which is exactly what the retry prop passed to every error.tsx since 16.2.0 does (as unstable_retry; stable as retry at 16.3.0). It volunteered "a faint memory of a newer unstable_retry-style prop on error boundaries in a later 16.x, but I can't confirm it" — the right name, undesignated. Working code; the scale has no level for 'superseded by a first-class API' (next.js/v2 precedent). Not charged. (The hand-rolled code works on 16.3.6.) [chargeable miss — working code the library now supersedes — no severity level fits it; absent from the finding count]
contexterror.tsx retry prop DERIVABLE — task 1(b): reset() re-renders from the payload already held, nothing is requested, the query does not re-run and the error returns. Correct, and answered correctly by both below-floor controls in next.js/v2 (sonnet-5-v2-c, fable-5-v2-d), so not reported as knowledge of anything in the band.
misscatchError (next/error) Task 2(a): "Next.js has no public component-level error boundary" — then parallel routes with a per-slot error.tsx, and a React class boundary as the alternative. next/error has exported one since 16.2.0 (unstable_catchError; catchError from 16.3.0). The denial is explicit, but the code it designates works, so under the next.js/v2 precedent it is a miss with no severity level. Not charged. (Parallel routes with slot-level error.tsx isolate the widget on 16.3.6.) [chargeable miss — working code the library now supersedes — no severity level fits it; absent from the finding count]
contextcatchError (next/error) DERIVABLE — task 2(b): Next's own boundaries rethrow NEXT_REDIRECT; a hand-rolled class boundary would swallow it unless it checks the digest. Correct; the hazard predates the band and both v2 controls answered it.
correctLink transitionTypes Task 4, ALL FOUR PARTS RIGHT under an explicit non-recognition: "I don't recognise transitionTypes as a Link prop. It must be newer than my reliable knowledge. These are guesses" — then (a) addTransitionType('slide') in the navigation Transition; (b) Pages Router ignores it; (c) no warning in either router, "assuming Link pulls the prop out"; (d) a dev-time prop error demanding an array. Every v2 draw (Opus 5 ×2, Sonnet 5, Fable 5) denied the prop and predicted the warning. Recorded as correct and NOT as recall of 16.2.0: the draw says it reasoned from the obvious design, and the prompt's (d) names the array. P2 FALSIFIED on this arm.
imprecisionimages.maximumDiskCacheSize Task 5(a), the scored half: "As far as I know, the image cache in .next/cache/images has no size limit by default ... The question implies a newer rule, perhaps a default based on a fraction of disk space calculated when the server starts. I can't describe that rule. Confidence: low that this is still current." The designated statement is LF25's stale belief (unbounded); the hedge names the right shape and timing, and 5(b)/(c) write the RIGHT key — maximumDiskCacheSize: 1_000_000_000 and maximumDiskCacheSize: 0 ("a guess at the option name"), both accepted by 16.3.6's configSchema (executed). Under the code-vs-claim rule a hedged prose claim beside a correct fix is an imprecision. P4 FALSIFIED on this arm: the right key was written.
contextimages.maximumResponseBody VOID PROBE — task 6, scored for nobody as pre-registered (the 'default image configuration' wording beside a remote src). This draw read it as the allowlist being satisfied, designated 'optimized normally, slow first request', and then volunteered: "I believe a later release added a cap on how large an upstream image can be (possibly images.maximumResponseBody, default around 50 MB) ... I lean towards the cap existing" — the right key and figure for LF26 (16.1.5), hedged.
correctimages.qualities Task 7, the internal control (LF8, 16.0.0): "It's encoded at 75. From Next 16, images.qualities defaults to [75], and the quality prop is snapped to the nearest allowed value"; dated to 16.0, October 2025. Right on the behaviour (executed on 16.3.6: q=90 becomes q=75) and on the release, so this arm's attribution answers are readable.
correctexperimental.prefetchInlining Task 8: "I don't know of a stable option to switch back to one request per link. If there is one, it's probably an experimental flag, something like experimental: { prefetchInlining: true } (I'm unsure of the name), which would bundle a route's segments into one response." The right key, the right namespace and the right mechanism (16.2.0; configSchema accepts it at 16.3.6, executed). No dead clientSegmentCache offered. P3 FALSIFIED — the prediction said no draw of four would name it. Its twin did not (below).
context— Task 9, attribution: both behaviours guessed at "16.1.0, around December 2025". True: the font default 16.2.0 (a minor), the disk-cache rule 16.1.7 (a patch, two days earlier). Neither reached; no patch named. P5 HELD. None of the eight draws on these bytes (four in next.js/v2, four here) named a patch release.
context— Task 10: recency not charged. The v1 S4 rule would reach it (knowledge stops at 16.0.0, below 16.2.0, the last minor before the stated cutoff), but no Claude Opus 5.5 or Claude Fable 5.1 run in the corpus carries an S4 recency finding and this battery did not pre-register one; the stated boundary is recorded above.

Open questions from this run

Sources

Battery specification: prompts/nextjs.md in the studio repo. Every finding above also carries its own citation.