Conductor output for the highest-priority convoy in the launch sequence. Closes P0 ship-blocker #8 from .convoys/ship-readiness.md. Vercel is currently refusing to deploy any branch (including main) due to a CVE in next@15.4.3 ("Vulnerable version of Next.js detected"). Last successful main deploy: 2025-08-01. Until this convoy lands, every downstream preview-smoke / visual-diff gate is non-functional. Classification: feature Skip: ia, ux, flag Next role: role-architect Routing straight to architect (IA + UX skipped — no information architecture or UX change). Architect reads the Next 15 → 16 migration guide and produces 1–3 briefs covering the bump itself, any required code migrations (likely next.config.js images.domains → images.remotePatterns), and Vercel preview verification. Audit cohort (post-PR draft, /multitask group): reviewer + design-system-auditor + a11y-auditor Out of scope here (own convoys): - React 18 → 19 bump → bump-react (if/when desired) - App Router migration → out of horizon - @playwright/test install → adopt-playwright-smoke - ESLint baseline cleanup → fix-lint-baseline Convoy file: .convoys/bump-next-js.md Analytics: emitted via scripts/log-convoy-event.sh Co-authored-by: Cursor <cursoragent@cursor.com>
8.3 KiB
| name | classification | success_metric | skip | status | created | |||
|---|---|---|---|---|---|---|---|---|
| bump-next-js | feature | npm install next@16.2.6 ships, Vercel deploys complete, no runtime regressions in dev or build. |
|
open | 2026-05-22 |
Convoy: bump-next-js
Closes P0 ship-blocker #8 from .convoys/ship-readiness.md. Highest-priority convoy in the launch sequence — promoted to slot 0 because Vercel is currently refusing to deploy any branch (including main) until Next.js is bumped, which makes every downstream preview-smoke / visual-diff gate non-functional.
Why
Vercel's platform-level security gate is blocking every deployment with "Vulnerable version of Next.js detected, please update immediately". The lockfile currently resolves next@15.4.3; latest is 16.2.6. The build itself completes (Vercel CLI confirms Build Completed in /vercel/output [29s]), but the deployment is rejected before going live.
Concrete impact, as of 2026-05-22:
- The last successful deploy on
mainwas 2025-08-01. Production is stale. - Preview deployments are unavailable on every PR.
preview-smoke.ymlandvisual-diff.ymlhave nothing to point at, so they fail-quiet on every PR. - PR #1 (the bootstrap PR) cannot validate its own L3 visual gates because of this.
This convoy unblocks the entire launch sequence. Until it ships, the other 13 convoys are running half-blind. Success looks like:
package.jsondeclares"next": "^16.2.6"(or whatever the architect picks — see scope).package-lock.jsonregenerated.npm run devboots without warnings about deprecated APIs.npm run buildexits 0 with no breaking-change errors.- A PR opened from a feature branch produces a successful Vercel preview deploy.
preview-smokeandvisual-diffworkflows have a live URL to hit (they'll still fail on missing@playwright/testuntiladopt-vitestlands, but the Vercel half is no longer broken).- CI green: lint passes (wrapper is in place from bootstrap), aggregate gate passes.
Scope
In:
- Bump
nextfrom15.4.3to16.2.6inpackage.json+package-lock.json. - Bump
eslint-config-nextfrom15.4.2to a matching16.xrelease to keep the lint config aligned with the framework. - Audit Next.js 15 → 16 migration guide (blog, upgrade guide) and identify which surfaces in
tcg-vaultare affected. Educated guess at affected paths (validate during architect):next.config.js— theimages.domainsfield has been deprecated for several major versions; if Next 16 drops it, migrate toimages.remotePatterns.next/imageusage acrosspages/cards.js,pages/card/[id].js,components/CollectionSelectionModal.js,components/ManaSymbols.js,components/UploadImageModal.js— verify props are still supported.- Pages Router specifics — Pages Router is intentionally more stable than App Router across major bumps, but
getServerSideProps/getStaticPropssemantics may have edge-case changes. - API routes —
req/resAPI stays stable in Pages Router; should be a no-op surface. - Middleware —
tcg-vaulthas nomiddleware.jscurrently; nothing to migrate.
- Update
AGENTS.md"Tech stack quick reference" to bump the Next.js version string. - Validate via local
npm run build, then push to confirm Vercel preview deploys successfully.
Out (deferred to their own convoys):
- React 18 → 19 upgrade.
next@16peer-deps acceptreact@^18.2.0 || ^19.0.0. Currentreact@18.3.1is in range. A React 19 bump is its own convoy (bump-react) because of compiler / Suspense /use()API changes. - App Router migration.
tcg-vaultis on Pages Router. Migrating to App Router is a multi-month effort and outside this convoy. - Test runner adoption (
adopt-vitest/adopt-playwright-smoke) — those convoys remain queued. .eslintrc.jsonrule tuning — the bootstrap added a stub extendingnext/core-web-vitals. Ifeslint-config-next@16ships new rules that surface additional errors, defer the cleanup tofix-lint-baseline.
Hard "do not touch" in this convoy:
- No auth code (
lib/permission-middleware.js,pages/api/auth/,pages/api/auth-utils.js) — that'sfix-auth-bypass. - No DB code.
- No new features or UI changes beyond what's strictly required to keep existing pages rendering after the bump.
- No CODEOWNERS / workflow / convoy file edits.
- No feature flags. The bump ships unflagged.
Roles invoked
Per feature classification with custom skips (ia, ux, flag):
- role-architect — produces a slice plan. Reads the Next 16 migration guide, lists every breaking change that touches
tcg-vault, decides which need code changes vs. configuration changes vs. no-ops. Output: 1–3 briefs under.convoys/bump-next-js/brief-N-*.md. Likely shape:- Brief 1: the bump itself (package.json + lockfile + any required
next.config.jsmigration). - Brief 2 (if needed): code changes for any deprecated APIs (e.g.
<Image>prop rename). - Brief 3 (if needed): visual-diff baseline refresh if rendering changed.
- Brief 1: the bump itself (package.json + lockfile + any required
- role-implementer — single-writer flow. The bump itself is one file change + lockfile; can't be meaningfully parallelized.
- Audit fan-out (
/multitask, group idaudit-bump-next-js-<pr>) — runs in parallel after the PR is drafted:- role-reviewer — correctness, regression risk
- role-design-system-auditor — verify CSS / theming / token usage still renders correctly
- role-a11y-auditor — verify accessibility didn't regress (Next.js 16 may change focus-management defaults)
- role-doc-writer — last. Updates
AGENTS.md"Tech stack" section. Adds an entry to a CHANGELOG if one is started here (it'll be backfilled separately inlaunch-polish).
Todos
High-level checklist for the architect to refine into briefs:
- Brief 1 — Migration audit. Read the Next.js 16 release notes and upgrade guide. Produce a short table: deprecated API → file(s) that use it → migration step. Specifically check:
images.domainsdeprecation,next/fontchanges,next/imageprop changes, any default-runtime changes (edge vs node). - Brief 2 — Bump + lockfile.
npm install next@16.2.6 eslint-config-next@^16. Commitpackage.json+package-lock.json. Verifynpm ls nextshows the new version. - Brief 3 — Verify build + dev locally.
npm run buildmust exit 0 with no breaking-change errors.npm run devmust boot without deprecation warnings on the routes we ship today. If errors surface, this is where they get fixed. - Brief 4 — Vercel preview deploy. Push the branch and confirm the Vercel deploy completes successfully (status moves from
pending→success, notError). Capture the preview URL in the PR description. - Brief 5 — Visual diff baseline. If
preview-smoke.yml/visual-diff.ymlaren't installed yet (they need@playwright/test), this brief is informational — flag any obvious visual changes to the reviewer + design-system-auditor. Onceadopt-playwright-smokelands, this becomes a real verification step. - Doc-writer pass. Update
AGENTS.mdtech-stack line. Note the bump in the bootstrap PR's "Notes for reviewer" or, if PR #1 has merged by then, open a small standalone docs PR.
Hand-off
Next role: role-architect (IA + UX are skipped; routing straight to Architect).
To run it in a new chat, paste:
"Run role-architect on convoy
bump-next-js. Read.convoys/bump-next-js.mdfor scope and todos, then read the Next.js 15 → 16 upgrade guide and produce a slice plan. Output briefs to.convoys/bump-next-js/brief-N-*.md. Mark any briefs that are parallel-safe (probably none — this is mostly a single-writer flow except the audit fan-out). Be conservative about scope creep: if the migration guide flags an API not used intcg-vault, note it in the brief but don't add a 'while we're here' fix."
After architect publishes the brief(s), the user runs role-implementer serially. Once the PR is drafted, the user uses Cursor 3.2 /multitask to dispatch the audit cohort (reviewer + design-system-auditor + a11y-auditor) in parallel under group id audit-bump-next-js-<pr>.
Conductor exits here.