Officialprisma/prisma-next1 file

Prisma Next Migration Review

Review what Prisma Next migrations will run on merge or deploy, render the migration graph, resolve concurrent / diamond-convergence conflicts, and configure environment refs for CI. Use for "what migrations are going to run", "what runs on deploy", merge conflict, diamond convergence, concurrent migrations, migration status, ref management, staging, production, MIGRATION.DIVERGED, MIGRATION.NO_MARKER, MIGRATION.MARKER_NOT_IN_HISTORY, prisma migrate status, prisma migrate diff, prisma migrate resolve.

Specification
Skill ID
prisma/prisma-next/prisma-next-migration-review
Publisher
prisma
Repository
prisma-next
Installs
237
Files
1
Synced
Sep 24, 2026
How to use it

Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.

prisma/prisma-next/prisma-next-migration-reviewInstalls these files
  • SKILL.md

What this skill tells the agent

Prisma Next — Migration Review (Deployment + Concurrency)

Edit your data contract. Prisma handles the rest.

This skill is about reviewing migrations, not authoring them. It covers the questions that come up at deploy time and when multiple developers are landing migrations concurrently.

The skill teaches the system's mental model — what a ref is, what a marker is, what the migration graph is — and shows how to ask the system for its state. It does not prescribe rigid step-by-step procedures: most "review" questions are answered by understanding the model and querying the right thing. Rigid procedures are reserved for the rare case where there's literally one safe path.

When to Use

  • User asks "what migrations will run when I merge this?" or "what's about to run on deploy?".
  • User hit a concurrent-migration conflict (main advanced while their branch was open).
  • User wants to wire up a staging / production ref so CI can deploy against it.
  • User wants to run a migration against an environment that isn't the local dev DB.
  • User asks about CI integration for migrations.

When Not to Use

  • User wants to author a migration → prisma-next-migrations.
  • User wants to fix a hash-mismatch / drift in a single env → prisma-next-migrations (re-plan path) or prisma-next-debug (envelope-driven).
  • User wants to edit the contract → prisma-next-contract.

Key Concepts — the navigation model

*Every migration question is a navigation from an origin to a destination.* Once you have this model, the rest of the skill is just "which command asks the system about which navigation."

Origin

The origin is the database's current contract hash. The database carries a row in PN's marker table that records "this database is at hash X". When the CLI runs online (a --db <url> is provided, or db.connection is set in prisma-next.config.ts), PN reads the marker and that hash is the origin. Offline (no DB connection), the origin is unknown — many commands degrade to listing the on-disk migrations and skip the per-edge applied/pending status.

A live DB is therefore the authoritative source of origin. The "recorded marker" in any other artifact (refs, local cache, your assumptions) is a working copy that can drift; the live DB never does.

Destination

The destination is the contract hash you want the database to be at. Two ways to name a destination:

  • A `--to <name>` — a named pointer to a hash, stored under migrations/app/refs/<name>. Refs are named after environments by convention (staging, production) to communicate "this is where production is expected to be". The ref itself is just a hash + an optional set of required invariants; it has nothing to do with which database you connect to.
  • The current contract head — implicit when no --to is passed. This is the hash of the current contract.json on disk.

--to staging does not mean "connect to the staging database." It means "navigate the database I connected to (via --db or config) toward whatever hash this ref points at." Database selection is orthogonal: pass --db $STAGING_DATABASE_URL to actually point at staging.

The migration graph

The on-disk migrations form a directed graph: nodes are contract hashes; edges are migrations. Each migration declares a from hash and a to hash. A migration applies only when the database's current marker matches its from hash; running it advances the marker to its to hash.

migration status queries the graph for the path from origin to destination and reports per-edge status:

  • applied — on the path from EMPTY_CONTRACT_HASH to the marker (history).
  • pending — on the path from the marker to the destination (what would run).
  • unreachable — on the path from EMPTY_CONTRACT_HASH to the destination, but the marker is on a different branch and won't reach it without first re-routing.

Diagnostic codes

migration status emits structured diagnostics on the result envelope (diagnostics[].code) so the agent can branch on the code rather than parsing the prose summary. Each diagnostic also carries severity (warn or info), a human message, and hints — the same hints the CLI prints under the summary line.

CodeSeverityMeaning in the navigation modelNext move
MIGRATION.UP_TO_DATEinfoMarker = destination; no edges to walk.Nothing to do.
MIGRATION.DATABASE_BEHINDinfoMarker is an ancestor of the destination; N pending edges in between.migrate --to <name> --db $URL.
MIGRATION.MISSING_INVARIANTSinfoMarker reached destination structurally but missing required invariants the ref declares.migrate --to <name> --db $URL to take a path that covers them.
MIGRATION.NO_MARKERwarnOnline, but the database has no marker row — never initialised.migrate --db $URL (first apply writes the marker).
MIGRATION.MARKER_NOT_IN_HISTORYwarnOnline; marker hash is not a node in the graph. The database was changed outside the migration system.Decide which side is truth: db sign (accept DB as truth), db update (push contract to DB), contract infer (re-derive contract from DB), or db verify (inspect first). Not the same as MIGRATION.MARKER_MISMATCH: MARKER_NOT_IN_HISTORY is emitted during the runner's graph walk when the live marker is off the path being traversed; MARKER_MISMATCH fires earlier, at the CLI pre-DDL gate, when the marker hash is not a graph node at all.
MIGRATION.DIVERGEDwarnMultiple valid leaves; the destination is ambiguous.Pass --to <name>, or ref set <name> <hash> to create one.
CONTRACT.AHEADwarnContract head is not in the graph — the contract was edited without re-planning.migration plan to extend the graph.
CONTRACT.UNREADABLEwarncontract.json couldn't be read.contract emit to regenerate it.

Graph-tree output

migration status (and migration list) render the migration graph as a colored lane tree in the terminal. Two flags control the rendering:

  • --legend — prints the key for the tree glyphs and lane colors before the tree.
  • --ascii — replaces box-drawing glyphs with pipe-safe ASCII characters (useful in CI logs or environments that don't support Unicode).

Both flags are also available on migration list and migration graph. migration log supports --ascii only (it renders a flat chronological table, not a tree).

Plan- and apply-time diagnostics

These codes surface on migration plan, ref set, and migrate — not on migration status. See Migration System § Recovery affordances and ADR 218.

CodeWhenMeaningNext move
MIGRATION.HASH_NOT_IN_GRAPHmigration plan (non-empty graph) or ref setResolved hash is not a node in the on-disk migration graph — typical when the default db ref points past the graph tip after dev-only db update cycles.migration plan --from <reachable-ref> (e.g. --from production); or realign the ref with ref set db <graph-node-hash>.
MIGRATION.SNAPSHOT_MISSINGmigration planA named ref has no pointer file (<name>.json), and the hash being resolved isn't a node in the migration graph either.ref set <name> <hash> to create the ref, db update --advance-ref <name> to advance it, or pass a hash that is a graph node.

More from prisma

Use this skill in a project

Open any RiverX project, search the Skills panel for prisma/prisma-next/prisma-next-migration-review, and install it in one click.

Use this skill