Skip to content

tml-3059: deduplicate migration contracts into a content-addressed migrations/snapshots/ store - #1018

Merged
wmadden-electric merged 23 commits into
mainfrom
tml-3059-dedupe-migration-snapshots
Jul 22, 2026
Merged

tml-3059: deduplicate migration contracts into a content-addressed migrations/snapshots/ store#1018
wmadden-electric merged 23 commits into
mainfrom
tml-3059-dedupe-migration-snapshots

Conversation

@wmadden-electric

@wmadden-electric wmadden-electric commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

We now store each migration contract once, in a content-addressed store shared by the whole migrations tree — instead of copying it into every migration package that references it.

A migration's bookend contracts move out of its own directory into migrations/snapshots/<hex>/, and the emitted migration.ts imports them from there by hash:

  // migrations/app/20260513T0507_add_product_category_index/migration.ts
- import endContract from './end-contract.json' with { type: 'json' };
+ import endContract from '../../snapshots/93f0…c9e1/contract.json' with { type: 'json' };
migrations/
  snapshots/
    93f0…c9e1/                 ← one directory per distinct contract, named by its storage hash
      contract.json            ← the canonical contract JSON
      contract.d.ts            ← its emitted types
  app/
    20260513T0507_add_product_category_index/
      migration.ts             ← imports ../../snapshots/<hex>/contract.json
      migration.json           ← unchanged
      ops.json                 ← unchanged

A migration package directory is now just migration.ts + migration.json + ops.json.

Why

A contract that sits between two migrations was stored twice: once as the earlier migration's end-contract (its destination) and again as the next migration's start-contract (its source) — the same bytes, in two files. Across a chain of N migrations that is roughly 2N copies of N+1 distinct contracts. This repo committed 78 end-contract.json and 60 start-contract.json; the store holds each distinct contract exactly once.

The timing is not incidental: the migrations/ directory layout freezes as public surface at RC, so this is the window to change it.

How the store works

Keyed by storage hash. migration.json already records a migration's from and to as storage hashes, so the hash is the address — no link file is needed to find a migration's bookend contracts. (This mirrors the Postgres control plane, which already keeps one row per distinct contract in a content-addressed prisma_contract table.)

Write-if-absent, made sound by canonicalization. Writing a snapshot only checks whether snapshots/<hex>/ already exists; if it does, the write is skipped. That is safe only because every writer canonicalizes the contract first, so two producers writing the entry for the same hash always agree on the bytes. Each write lands in a temp directory and is renamed into place, so an interrupted write can't leave a half-written entry.

The import path is threaded, never guessed. The relative path from a package to the store differs by repo shape (../../snapshots for an app migration, ../snapshots for an extension's own repo). It's computed once per package and threaded through the planners into the renderer, so no reader ever walks up the directory tree to find the store.

Clean break. There is no fallback reader for the old sibling files. A committed tree that hasn't been converted fails to load with a structured MIGRATION.CONTRACT_SNAPSHOT_MISSING that names the missing hash and path — pointing you at the migrator (below) rather than failing silently.

What does not change

migration.json, ops.json, and every migrationHash are byte-identical. The contract snapshot was never part of migration identity (ADR 199), so moving it changes no migration's hash — the committed tree's history is untouched.

The apply path is likewise unaffected: migration apply reads only migration.json + ops.json per package and never touches snapshots/. You can delete migrations/snapshots/ entirely and still apply an app-space chain end to end — snapshots/ is authoring and typechecking surface, not a runtime input. New postgres and sqlite regression tests delete the store and assert apply still succeeds.

Converting the committed tree

The bulk of the diff is the one-time conversion of every committed migrations tree, done by a committed migrator (scripts/migrate-migrations-layout.mjs, referenced by the upgrade notes so downstream projects can run it). It plans every migrations root read-only first and only applies once all roots plan cleanly; per migration it asserts the contract's inner storage.storageHash against the hash it's filed under before writing, and re-verifies every migrationHash is unchanged after — any drift aborts the whole run before deleting anything.

Across 17 migrations roots that came to ~140 deleted sibling files, ~71 rewritten migration.ts import blocks, and the new store entries, with zero migration.json changes. The regeneration scripts produce byte-identical output, so fixtures:check stays green.

One deliberate deviation: no gzip

The RC plan item floated gzip tolerance (".json.gz accepted from day one"). It's dropped: TypeScript can't resolve a gzipped .d.ts, and the emitted migration.ts's ESM JSON import can't decompress at import time — so gzip would break every committed migration.ts while only ever helping tooling that reads store files directly. (Recorded on #986.)

Alternatives considered

  • Per-migration link files — keep the contract copies where they are and add a small file in each package naming a shared location by hash. Rejected: migration.json's from / to already are that link.
  • Keying by a full-content hash rather than reusing storage.storageHash. Rejected: readers already hold the storage hash; a second hash would be computed for no added safety.
  • gzip-compressed entries — rejected, above.

Full rationale and the accepted trade-offs (domain-surface drift under one hash; contract source deliberately left out of the store) are in ADR 240. Ships in 0.17.0; a follow-up (TML-3072) folds the ADR-218 ref-paired snapshots into this same store so migrations/ ends up with a single snapshot concept.

wmadden-electric and others added 9 commits July 20, 2026 18:15
Deduplicate migration contract snapshots into a content-addressed
migrations/snapshots/ store. Spec and plan carry the fully-settled design
(operator discussion 2026-07-20); zero design freedom for implementation.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
D1: contract-snapshot-layout.ts (framework-components/control) — storageHashHex
and the json/types specifier builders; single source of the snapshots dirname
and specifier shapes.

D2: contract-snapshot-store.ts (migration-tools) — write-if-absent store keyed
by storage hash, canonicalizing JSON to match the current snapshot writer, with
tolerant + strict readers and two structured errors
(MIGRATION.CONTRACT_SNAPSHOT_MISSING / _HASH_MISMATCH).

Tests-first for both modules (TC1-TC3).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
Renderer specifier switch (spec D3): the three renderers contractImports()
(postgres, sqlite, mongo) now build specifiers via
contractSnapshotJsonSpecifier/contractSnapshotTypesSpecifier from
@prisma-next/framework-components/control instead of hardcoding
./end-contract.json etc. RenderMigrationMeta gains a required
snapshotsImportPath: string.

Threading approach for #meta vs a separate param: the three
planner-produced classes (TypeScriptRenderablePostgresMigration,
TypeScriptRenderableSqliteMigration, PlannerProducedMongoMigration) each
hold #meta: MigrationMeta and expose it verbatim via describe().
migration-tools buildMigrationArtifacts validates that return value
against MigrationMetaSchema = type({ from, to }) and writes it straight
into migration.json (from/to only). Adding snapshotsImportPath to
MigrationMeta would have leaked a render-only concern into that
persisted metadata and the arktype-validated describe() contract. Each
class instead takes a dedicated snapshotsImportPath constructor
parameter and private field, passed separately into the render-meta
object alongside from/to. SqlMigrationPlannerPlanOptions (family-sql)
and the framework MigrationPlanner.plan()/MigrationScaffoldContext
(framework-components) gained the same required field so postgres,
sqlite, and mongo planners can read options.snapshotsImportPath and
context.snapshotsImportPath and forward it. The framework interface
change is required, not just the family-sql one: TypeScript method
implements check is contravariant on parameters even for method-shorthand
members once a genuinely new required property is added (verified by
running tsc, not assumed) — leaving the framework plan() signature
unchanged broke every concrete planners implements MigrationPlanner<...>
check. The one caller that goes through the loose framework interface
without a migration-package directory (plan-from-diff.ts db-init and
db-update reconciliation path, which wraps its result as a plain
MigrationPlan and never calls renderTypeScript()) passes a documented
empty-string placeholder.

D4: DataTransformCall.importRequirements() (postgres) no longer declares
an endContract default import. buildImports always prepends
contractImports(meta), which already emits it, and a DataTransformCall
only ever renders inside that scaffold. One comment at the deletion site
records the invariant.

E4 outcome: render-imports.ts needed a fix. When from === to,
contractSnapshotJsonSpecifier and contractSnapshotTypesSpecifier collapse
the end and start snapshot paths onto the same two module specifiers. The
named-import path already merged Contract as End plus Contract as Start
into one import type line (pre-existing distinct-alias handling). The
default-import path did not: mergeRequirementIntoGroup threw a
Conflicting default imports error for two different default symbols
(endContract, startContract) on the same specifier. Fixed by replacing
the single defaultSymbol/defaultTypeOnly fields with a Map from symbol to
typeOnly; a module with more than one distinct default symbol now renders
one import line per symbol (JS permits re-importing a module under
different default bindings), sorted alphabetically, with any named
bindings following as their own line. Pinned with a new
render-imports.test.ts case plus a dedicated from === to (E4) test in
each of the three renderer test files, verifying the merged block: two
import lines for endContract and startContract off the same contract.json
specifier, one import type line combining Contract as End and Contract as
Start off the same contract specifier.

Tests travel with the change: pinned specifier assertions across all
three renderer test suites now use real sha256 64-hex hashes (the new
storageHashHex validation rejects short placeholders) and a
snapshotsImportPath literal; every .plan / .emptyMigration / direct
planner-produced-class constructor call site across the target and
adapter test suites (postgres, sqlite, mongo) now supplies
snapshotsImportPath; the postgres op-factory-call tests assert
DataTransformCall.importRequirements() returns only the placeholder
facade entry and that a full rendered migration containing a data
transform imports endContract exactly once; the four render-typescript
roundtrip e2e tests (postgres, sqlite, mongo, which execute the rendered
migration.ts via tsx) now write their contract fixtures into a
snapshots/<hex>/contract.{json,ts} layout instead of sibling
{start,end}-contract.* files.

Gates green: framework-components, ts-render, migration-tools,
family-sql, target-postgres, adapter-postgres, target-sqlite,
adapter-sqlite, target-mongo, adapter-mongo (typecheck and test each);
pnpm lint:deps and node scripts/lint-casts.mjs (delta -1) both clean.
@prisma-next/cli typecheck is red with exactly the two expected
snapshotsImportPath-missing errors, in migration-new.ts and
migration-plan.ts — owned by T3.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
…to the snapshot store (T3)

Replaces sibling-file writes (end-contract.*/start-contract.*) with
writeContractSnapshot(migrationsDir, hash, {contractJson, contractDts})
calls keyed by storage hash, in migration-plan.ts (destination, baseline,
delta, and ref-paired start legs), migration-new.ts (destination), and
the contract-space seed phase (emit-contract-space-artefacts.ts, keyed
by headRef.hash). Deletes the predecessor sibling-copy block entirely:
the predecessor end contract is already in the store under its own
hash, so migration plan/new no longer re-copy it. Threads the new
required snapshotsImportPath field into every planner.plan()/
emptyMigration() call site via snapshotsImportPathFrom(packageDir,
migrationsDir), resolving the T2 CLI-red state.

Also reserves the snapshots/ directory name against phantom-space
enumeration (space-layout.ts RESERVED_SPACE_SUBDIR_NAMES,
verify-contract-spaces.ts listContractSpaceDirectories filter) and
threads snapshotsImportPath into pgvector/e2e/integration test call
sites the SqlMigrationPlannerPlanOptions/MongoMigrationPlanner type
change from T2 left red outside the CLI package, so that the
workspace-wide pnpm typecheck gate for this task is genuinely green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
… store (T4)

io.ts: readMigrationPackage/readMigrationsDir take a required
{ migrationsDir } option; endContractJson now comes from
readContractSnapshotJsonTolerant(migrationsDir, metadata.to) instead of
a sibling end-contract.json, with the tolerant missing/unparseable/null
semantics preserved exactly. readMigrationPackageRaw is unchanged (it
deliberately never populates endContractJson).

aggregate/aggregate.ts: readGraphNodeEndContract now reads
readContractSnapshotJson/readContractSnapshotDts keyed by the graph
nodes hash instead of a package directorys end-contract.* files.
createAggregateContractSpace takes a new migrationsDir field, threaded
through resolveContractAt/resolveGraphNodeContractAt. provenance:
graph-node and its sourceDir field are unchanged (plan-resolution.ts
still consumes sourceDir; T5 removes it alongside the CLI readers).

aggregate/loader.ts: loadExtensionSpaces contract resolution
(readRawContractDeferred) now reads readContractSnapshotJson(
migrationsDir, headRef.hash) instead of the deleted
read-contract-space-contract.ts. When headRef is null there is no hash
to resolve against, so the deferred read throws descriptively; this
still surfaces as the existing contractUnreadable integrity problem
when checkContracts runs, and headRefMissing continues to fire
independently. read-contract-space-contract.ts is deleted (it had no
other callers) along with its export from exports/spaces.ts.

compute-extension-space-apply-path.ts: threads migrationsDir into its
readMigrationsDir call (the param was already available as
projectMigrationsDir).

contract-snapshot-store.ts: readContractSnapshotJsonTolerant now also
tolerates a malformed storageHash (previously it called
contractSnapshotDir, which validates the hash format, outside its
try/catch, so a non-sha256:<64hex> hash threw instead of resolving to
undefined). This was needed for readMigrationPackage to preserve
runner-independence against the many existing test fixtures across the
repo that use short placeholder hashes as metadata.to  the write path
(writeContractSnapshot) keeps strict validation.

Every readMigrationPackage/readMigrationsDir/createAggregateContractSpace
call site in the repo (migration-tools and CLI package tests, the two
integration e2e tests) is threaded with an explicit migrationsDir/store
root; none of them derive it by walking up from a package directory.

Also fixed three CLI test fixtures (migrate-show.test.ts,
migrate-to-contract.test.ts, migration-read-commands-parity.test.ts)
that wrote extension contracts as sibling files instead of into the
snapshot store, and one fixture missing a head ref that the old
sibling-file model did not require.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
… sourceDir (T5)

Rewires db sign, db update, ref set, and migration check to read
migration end-contracts through the contract-snapshot store instead of
the per-package end-contract.json sibling that T3 stopped writing:

- db-sign.ts / db-update.ts / ref.ts: replace the sibling
  readFile(join(dirPath, "end-contract.json")) reads with
  readContractSnapshotJson(migrationsDir, hash). db-update.ts also
  repoints contractJsonPathForSnapshot at the store contract.json
  (verified: readContractIR only uses that path to derive the sibling
  .d.ts path by string replacement, which the store satisfies exactly).
- migration-check.ts: checkSnapshotConsistency now reads the store
  entry for pkg.metadata.to. Absent entry is not an issue (runner
  independence, ADR 199); present-but-mismatched keeps firing
  PN-MIG-CHECK-005; unparseable keeps firing PN-MIG-CHECK-006. The
  check is now async (store reads are async), so runMigrationCheck /
  checkSpace and their callers/tests are threaded with await.
  PN-MIG-CHECK-002s required-file list was already migration.json +
  ops.json only  no change needed there.
- contract-at-errors.ts: added an explicit
  MIGRATION.CONTRACT_SNAPSHOT_MISSING case (the code the store now
  throws for a missing contract) instead of relying on the
  MIGRATION.FILE_MISSING branch, which still names end-contract.json
  and is no longer reachable for a missing contract (io.ts only throws
  FILE_MISSING for migration.json/ops.json now).
- plan-resolution.ts: removed the graph-node arms sourceDir field
  (confirmed via repo-wide grep that migration-plan.ts, the only
  consumer, already stopped reading it in T3) and stopped reading
  at.sourceDir. Correspondingly removed sourceDir from
  ContractAtResult (aggregate/types.ts) and resolveGraphNodeContractAt
  (aggregate.ts), which T4 had deliberately kept for this task.

Updated CLI unit tests, the ref/migration-check/db-update e2e journeys,
and the aggregate contractAt tests to seed the store instead of sibling
files and to drop sourceDir assertions.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
…d storage hashes (T5)

The sqlite and postgres db-init-update.cli(.integration).test.ts fixtures
seeded an extension contract space via emitContractSpaceArtefacts with
a placeholder storage.storageHash (e.g. sha256:ext-contract-v1) that is
not a well-formed sha256:<64hex> value. That now correctly fails the
contract-snapshot stores storageHashHex validation instead of silently
truncating a bogus directory name, so both suites started failing
7 tests total once the store enforces the format.

Fix: give buildExtensionContract stable 64-hex-char storage hashes
(sha256:<hex digit repeated 64 times>, distinct per test file and per
contract version) instead of the placeholder string. headRef.hash was
already derived from the same contract.storage.storageHash value in
both files, so no further change was needed to keep the store entry
discoverable by the hash the aggregate loader reads back.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
… fixtures glob (T6)

D8 of the migration-snapshot dedup slice. The store now lives at
migrations/snapshots/<hex>/, so the per-package sibling files
(end-contract.*, start-contract.*) no longer exist to hygiene-check,
clean up, or diff.

- hygiene-gitattributes.ts: drop the four end-/start-contract entries
  from ARTEFACT_FILENAMES; add two migrations-root-anchored
  linguist-generated lines for the store
  (migrations/snapshots/**/contract.json, contract.d.ts), since the
  existing entries are schema-dir-relative and cannot reach the store.
- reinit-cleanup.ts: drop the same four entries from its own
  ARTEFACT_FILENAMES, keeping the schema-dir list in lockstep with
  hygiene-gitattributes.ts as documented. Reinit cleanup only ever
  touches the schema directory (findStaleArtefacts has one caller,
  passed schemaDir, never migrationsDir) — it never reaches into
  migrations/ today, so no snapshots/ cleanup was added; that is
  outside this command's current scope, not an oversight.
- package.json: drop the now-redundant start-contract.*/end-contract.*
  fixtures:check pathspecs; **/contract.* already matches
  snapshots/<hex>/contract.json and contract.d.ts.
- output.ts: fix a stale FR9.1 doc comment listing start-/end-contract
  among the files reinit can delete.

Also adds a unit test (TC12) confirming listContractSpaceDirectories
skips a snapshots/ directory, verifying the D7 reserved-name filter
that landed earlier.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
…apshot store layout (T7)

Journey-helper store-import fix: injectMigrationSqlDbSetup in
test/integration/test/utils/journey-test-helpers.ts previously
hard-coded ./end-contract.json, which no longer exists under the new
migrations/snapshots/<hex>/ layout. It now captures the CLI-emitted
scaffolds actual endContract specifier (a store path) via a regex
group and re-injects an import from that same path, throwing a clear
error if the scaffold shape ever changes instead of silently emitting
a broken file.

Hand-authored migration.ts templates in
invariant-routing.e2e.test.ts (Journeys S and T),
migration-round-trip.e2e.test.ts, and invariant-routing.mongo.e2e.test.ts
(Journey Q) hard-coded ./end-contract.json; each now computes the real
store path via storageHashHex(<hash>). The mongo Journey Q template
also relied on a synthetic, content-mismatched destination hash that
the old path-keyed sibling-file layout tolerated but the new
content-addressed store cannot (a store entry is keyed by the real
hash of its content); fixed by adding a genuinely distinct third mongo
contract fixture (contract-branch-b.ts) so branch B gets a real store
entry instead of a fabricated one.

mongo-migration.e2e.test.ts asserted byte-identical end-contract.json/
.d.ts siblings; updated to read the store entry via storageHashHex and
compare parsed JSON (the store canonicalizes to compact/sorted-key
JSON, while the emitted project artifact stays pretty-printed, so
byte comparison no longer applies).

postgres-issue-planner.test.ts used placeholder hashes (sha256:aaa /
sha256:bbb) that fail storageHashHex validation; replaced with valid
64-hex-char hashes.

New regression tests:

- Runner independence (AC6): new tests in
  packages/3-targets/6-adapters/postgres/test/migrations/runner-independence.integration.test.ts
  and .../sqlite/test/migrations/runner-independence.test.ts build a
  two-migration app-space chain via materialiseMigrationPackage +
  writeContractSnapshot, apply the first migration, delete
  migrations/snapshots/ entirely, then read and apply the second
  migration via the real readMigrationPackage reader and target
  runner — proving apply depends on migration.json + ops.json only,
  never on the snapshot store, and that a package directory legitimately
  contains only those two files.

- Extension-space store resolution (AC8): extended
  cli.migrate-external-space.e2e.test.ts to assert the seed phase
  (run via migration plan) populates migrations/snapshots/<hex>/contract.json
  for the external spaces head hash instead of a per-space sibling
  copy, and that the subsequent migrate command only succeeds by
  resolving that same store entry through the aggregate loader.

No src/ production files were changed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
@wmadden-electric
wmadden-electric requested a review from a team as a code owner July 21, 2026 10:27
@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 420 files, which is 320 over the limit of 100.

To get a review, narrow the scope:
• coderabbit review --committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

Run ID: 0af7a9c8-a96f-4c4d-b3bb-a7df786477d0

📥 Commits

Reviewing files that changed from the base of the PR and between fea0157 and 4b5d989.

⛔ Files ignored due to path filters (2)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • projects/migration-manifest-drop-inline-contracts/spec.md is excluded by !projects/**
📒 Files selected for processing (637)
  • .agents/rules/contract-space-package-layout.mdc
  • .agents/rules/never-hand-edit-contract-fixtures.mdc
  • .github/workflows/ci.yml
  • apps/telemetry-backend/migrations/app/20260520T1317_migration/end-contract.json
  • apps/telemetry-backend/migrations/app/20260601T1236_contract_hash_advance/end-contract.d.ts
  • apps/telemetry-backend/migrations/app/20260601T1236_contract_hash_advance/end-contract.json
  • apps/telemetry-backend/migrations/app/20260601T1347_contract_hash_advance/end-contract.json
  • apps/telemetry-backend/migrations/app/20260601T1347_contract_hash_advance/start-contract.d.ts
  • apps/telemetry-backend/migrations/app/20260601T1347_contract_hash_advance/start-contract.json
  • apps/telemetry-backend/migrations/snapshots/41700ef5fda97339b39ea345a56aae72a1ff4be11ddc3ffcab7130bfc71c109d/contract.d.ts
  • apps/telemetry-backend/migrations/snapshots/41700ef5fda97339b39ea345a56aae72a1ff4be11ddc3ffcab7130bfc71c109d/contract.json
  • apps/telemetry-backend/migrations/snapshots/50aadcf996213451cd2876e3caf50c2752b5b8c9ce1aa55dcae24918518b4ffb/contract.d.ts
  • apps/telemetry-backend/migrations/snapshots/50aadcf996213451cd2876e3caf50c2752b5b8c9ce1aa55dcae24918518b4ffb/contract.json
  • biome.jsonc
  • docs/architecture docs/ADR-INDEX.md
  • docs/architecture docs/adrs/ADR 212 - Contract spaces.md
  • docs/architecture docs/adrs/ADR 240 - Contract snapshots live in a content-addressed store.md
  • docs/architecture docs/subsystems/7. Migration System.md
  • docs/glossary.md
  • docs/onboarding/fixtures-emit-and-check.md
  • drive/calibration/failure-modes.md
  • examples/mongo-demo/migrations/app/20260409T1030_migration/end-contract.json
  • examples/mongo-demo/migrations/app/20260409T1030_migration/migration.ts
  • examples/mongo-demo/migrations/app/20260626T1605_add_user_role_enum/end-contract.json
  • examples/mongo-demo/migrations/app/20260626T1605_add_user_role_enum/migration.ts
  • examples/mongo-demo/migrations/app/20260626T1605_add_user_role_enum/start-contract.d.ts
  • examples/mongo-demo/migrations/app/20260626T1605_add_user_role_enum/start-contract.json
  • examples/mongo-demo/migrations/app/20260626T1916_add_posts_indexes/end-contract.json
  • examples/mongo-demo/migrations/app/20260626T1916_add_posts_indexes/migration.ts
  • examples/mongo-demo/migrations/app/20260626T1916_add_posts_indexes/start-contract.d.ts
  • examples/mongo-demo/migrations/app/20260626T1916_add_posts_indexes/start-contract.json
  • examples/mongo-demo/migrations/snapshots/2827cbad7293fe13a4fb2aab60a55d3cddd856a86d1f6ccea6e11519faacff92/contract.d.ts
  • examples/mongo-demo/migrations/snapshots/2827cbad7293fe13a4fb2aab60a55d3cddd856a86d1f6ccea6e11519faacff92/contract.json
  • examples/mongo-demo/migrations/snapshots/2b8eb72bd167d1a8c60e1527bdb14fb6c1901407a121d27d117b314dd934cd7d/contract.d.ts
  • examples/mongo-demo/migrations/snapshots/2b8eb72bd167d1a8c60e1527bdb14fb6c1901407a121d27d117b314dd934cd7d/contract.json
  • examples/mongo-demo/migrations/snapshots/79b46070809bf632b3742219ce1dd8924daf6350b2f478c4732962cf96288b6e/contract.d.ts
  • examples/mongo-demo/migrations/snapshots/79b46070809bf632b3742219ce1dd8924daf6350b2f478c4732962cf96288b6e/contract.json
  • examples/multi-extension-monorepo/packages/audit/migrations/20260601T0000_create_audit_event/end-contract.json
  • examples/multi-extension-monorepo/packages/audit/migrations/20260601T0000_create_audit_event/migration.ts
  • examples/multi-extension-monorepo/packages/audit/migrations/snapshots/b0d547223488b4a8cea642a0bb2cc8e8f6cd9b2a6e490f23832865146ac51468/contract.d.ts
  • examples/multi-extension-monorepo/packages/audit/migrations/snapshots/b0d547223488b4a8cea642a0bb2cc8e8f6cd9b2a6e490f23832865146ac51468/contract.json
  • examples/multi-extension-monorepo/packages/feature-flags/migrations/20260601T0000_create_feature_flag/end-contract.json
  • examples/multi-extension-monorepo/packages/feature-flags/migrations/20260601T0000_create_feature_flag/migration.ts
  • examples/multi-extension-monorepo/packages/feature-flags/migrations/snapshots/6759a7591f2bdf9b5c20fcbf2b02dbf56956c7762cef663c5e8e2b6779057cf4/contract.d.ts
  • examples/multi-extension-monorepo/packages/feature-flags/migrations/snapshots/6759a7591f2bdf9b5c20fcbf2b02dbf56956c7762cef663c5e8e2b6779057cf4/contract.json
  • examples/multi-extension-monorepo/test/e2e.integration.test.ts
  • examples/multi-extension-monorepo/vitest.config.ts
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260301T1000_init/end-contract.json
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260301T1000_init/migration.ts
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260302T1000_add_phone/end-contract.json
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260302T1000_add_phone/migration.ts
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260302T1000_add_phone/start-contract.json
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260302T1100_add_posts/end-contract.json
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260302T1100_add_posts/migration.ts
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260302T1100_add_posts/start-contract.json
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260302T1200_add_avatar/end-contract.json
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260302T1200_add_avatar/migration.ts
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260302T1200_add_avatar/start-contract.json
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260303T1000_merge_phone/end-contract.json
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260303T1000_merge_phone/migration.ts
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260303T1000_merge_phone/start-contract.json
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260303T1100_merge_posts/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260303T1100_merge_posts/end-contract.json
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260303T1100_merge_posts/migration.ts
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260303T1100_merge_posts/start-contract.json
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260303T1200_merge_avatar/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260303T1200_merge_avatar/end-contract.json
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260303T1200_merge_avatar/migration.ts
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/app/20260303T1200_merge_avatar/start-contract.json
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/snapshots/042e80cecce8271bb96dedcc7986dadb4c72b098ad5b5b43d8f3bf2d5d61806b/contract.d.ts
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/snapshots/042e80cecce8271bb96dedcc7986dadb4c72b098ad5b5b43d8f3bf2d5d61806b/contract.json
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/snapshots/789dd79ab5ab725be1b6ced088109b803a4d62f9874f932eb384a868d94360a4/contract.d.ts
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/snapshots/789dd79ab5ab725be1b6ced088109b803a4d62f9874f932eb384a868d94360a4/contract.json
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/snapshots/7e3fa7fbe98974385451444c229337c87ec90c547a9214f81700f86b5af3563d/contract.d.ts
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/snapshots/7e3fa7fbe98974385451444c229337c87ec90c547a9214f81700f86b5af3563d/contract.json
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/snapshots/93be6c200743261baf55f0586b1380a1c0ade3c48730c09a8fec71ba419c2464/contract.d.ts
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/snapshots/93be6c200743261baf55f0586b1380a1c0ade3c48730c09a8fec71ba419c2464/contract.json
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/snapshots/afdcd8ee600252054660e79266ede99d1f5227b586225985565eff24414696d0/contract.d.ts
  • examples/prisma-next-demo/fixtures/converging-branches/migrations/snapshots/afdcd8ee600252054660e79266ede99d1f5227b586225985565eff24414696d0/contract.json
  • examples/prisma-next-demo/fixtures/diamond/migrations/app/20260301T1000_init/end-contract.json
  • examples/prisma-next-demo/fixtures/diamond/migrations/app/20260301T1000_init/migration.ts
  • examples/prisma-next-demo/fixtures/diamond/migrations/app/20260302T1000_alice_add_phone/end-contract.json
  • examples/prisma-next-demo/fixtures/diamond/migrations/app/20260302T1000_alice_add_phone/migration.ts
  • examples/prisma-next-demo/fixtures/diamond/migrations/app/20260302T1000_alice_add_phone/start-contract.json
  • examples/prisma-next-demo/fixtures/diamond/migrations/app/20260302T1100_bob_add_avatar/end-contract.json
  • examples/prisma-next-demo/fixtures/diamond/migrations/app/20260302T1100_bob_add_avatar/migration.ts
  • examples/prisma-next-demo/fixtures/diamond/migrations/app/20260302T1100_bob_add_avatar/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/diamond/migrations/app/20260302T1100_bob_add_avatar/start-contract.json
  • examples/prisma-next-demo/fixtures/diamond/migrations/app/20260303T1000_merge_alice/end-contract.json
  • examples/prisma-next-demo/fixtures/diamond/migrations/app/20260303T1000_merge_alice/migration.ts
  • examples/prisma-next-demo/fixtures/diamond/migrations/app/20260303T1000_merge_alice/start-contract.json
  • examples/prisma-next-demo/fixtures/diamond/migrations/app/20260303T1100_merge_bob/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/diamond/migrations/app/20260303T1100_merge_bob/end-contract.json
  • examples/prisma-next-demo/fixtures/diamond/migrations/app/20260303T1100_merge_bob/migration.ts
  • examples/prisma-next-demo/fixtures/diamond/migrations/app/20260303T1100_merge_bob/start-contract.json
  • examples/prisma-next-demo/fixtures/diamond/migrations/snapshots/789dd79ab5ab725be1b6ced088109b803a4d62f9874f932eb384a868d94360a4/contract.d.ts
  • examples/prisma-next-demo/fixtures/diamond/migrations/snapshots/789dd79ab5ab725be1b6ced088109b803a4d62f9874f932eb384a868d94360a4/contract.json
  • examples/prisma-next-demo/fixtures/diamond/migrations/snapshots/7e3fa7fbe98974385451444c229337c87ec90c547a9214f81700f86b5af3563d/contract.d.ts
  • examples/prisma-next-demo/fixtures/diamond/migrations/snapshots/7e3fa7fbe98974385451444c229337c87ec90c547a9214f81700f86b5af3563d/contract.json
  • examples/prisma-next-demo/fixtures/diamond/migrations/snapshots/93be6c200743261baf55f0586b1380a1c0ade3c48730c09a8fec71ba419c2464/contract.d.ts
  • examples/prisma-next-demo/fixtures/diamond/migrations/snapshots/93be6c200743261baf55f0586b1380a1c0ade3c48730c09a8fec71ba419c2464/contract.json
  • examples/prisma-next-demo/fixtures/diamond/migrations/snapshots/f9a41d77df6eae57bcd25ab25df31e6e905aad034a5b813f408bf8e78e9f384a/contract.d.ts
  • examples/prisma-next-demo/fixtures/diamond/migrations/snapshots/f9a41d77df6eae57bcd25ab25df31e6e905aad034a5b813f408bf8e78e9f384a/contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260301T1000_init/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260301T1000_init/end-contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260301T1000_init/migration.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260302T1000_add_phone/end-contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260302T1000_add_phone/migration.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260302T1000_add_phone/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260302T1000_add_phone/start-contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260303T1000_add_bio/end-contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260303T1000_add_bio/migration.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260303T1000_add_bio/start-contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260304T1000_add_posts/end-contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260304T1000_add_posts/migration.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260304T1000_add_posts/start-contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260305T1000_add_avatar/end-contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260305T1000_add_avatar/migration.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260305T1000_add_avatar/start-contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260306T1000_add_comments/end-contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260306T1000_add_comments/migration.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260306T1000_add_comments/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260306T1000_add_comments/start-contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260307T1000_add_tags/end-contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260307T1000_add_tags/migration.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260307T1000_add_tags/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260307T1000_add_tags/start-contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260307T1100_late_branch/end-contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260307T1100_late_branch/migration.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260307T1100_late_branch/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260307T1100_late_branch/start-contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260308T1000_add_everything/end-contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260308T1000_add_everything/migration.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260308T1000_add_everything/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/app/20260308T1000_add_everything/start-contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/snapshots/2636edd722347d39a60458e4b0733f62e8d316d054fb7cca2b801e91cd619f74/contract.d.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/snapshots/2636edd722347d39a60458e4b0733f62e8d316d054fb7cca2b801e91cd619f74/contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/snapshots/47f4a4f58e99a479aaa3ba2ff9d00d1728b1c240359e03aa564ae163d63ba8d7/contract.d.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/snapshots/47f4a4f58e99a479aaa3ba2ff9d00d1728b1c240359e03aa564ae163d63ba8d7/contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/snapshots/6c66c897ec186bbc7b69feb6bfc5bb19b28a4c9ffe1a4fff5c96172cf5716ea5/contract.d.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/snapshots/6c66c897ec186bbc7b69feb6bfc5bb19b28a4c9ffe1a4fff5c96172cf5716ea5/contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/snapshots/789dd79ab5ab725be1b6ced088109b803a4d62f9874f932eb384a868d94360a4/contract.d.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/snapshots/789dd79ab5ab725be1b6ced088109b803a4d62f9874f932eb384a868d94360a4/contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/snapshots/7e951c7a95f42ca0420d9c4aae3602e32911606399982347621943fce34076d8/contract.d.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/snapshots/7e951c7a95f42ca0420d9c4aae3602e32911606399982347621943fce34076d8/contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/snapshots/827997ce6f33b7193b0a9eda969affe757e0d54209fde344afcd4d41321c5078/contract.d.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/snapshots/827997ce6f33b7193b0a9eda969affe757e0d54209fde344afcd4d41321c5078/contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/snapshots/93be6c200743261baf55f0586b1380a1c0ade3c48730c09a8fec71ba419c2464/contract.d.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/snapshots/93be6c200743261baf55f0586b1380a1c0ade3c48730c09a8fec71ba419c2464/contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/snapshots/99de8c2642999fd9b4c99ea77e53e8e31cb65d66575027eb287e8b0d849e8b84/contract.d.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/snapshots/99de8c2642999fd9b4c99ea77e53e8e31cb65d66575027eb287e8b0d849e8b84/contract.json
  • examples/prisma-next-demo/fixtures/long-spine/migrations/snapshots/b34dc9149b6856eacb47e3e6f2157860d8690f5fb382e71ae6b27f943007b778/contract.d.ts
  • examples/prisma-next-demo/fixtures/long-spine/migrations/snapshots/b34dc9149b6856eacb47e3e6f2157860d8690f5fb382e71ae6b27f943007b778/contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260301T1000_init/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260301T1000_init/end-contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260301T1000_init/migration.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260302T1000_add_phone/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260302T1000_add_phone/end-contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260302T1000_add_phone/migration.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260302T1000_add_phone/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260302T1000_add_phone/start-contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260302T1100_add_posts/end-contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260302T1100_add_posts/migration.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260302T1100_add_posts/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260302T1100_add_posts/start-contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260302T1200_add_avatar/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260302T1200_add_avatar/end-contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260302T1200_add_avatar/migration.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260302T1200_add_avatar/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260302T1200_add_avatar/start-contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260303T1000_add_bio/end-contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260303T1000_add_bio/migration.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260303T1000_add_bio/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260303T1000_add_bio/start-contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_a/end-contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_a/migration.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_a/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_a/start-contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_b/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_b/end-contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_b/migration.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_b/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_b/start-contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_c/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_c/end-contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_c/migration.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_c/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_c/start-contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_d/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_d/end-contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_d/migration.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_d/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/app/20260304T1000_parallel_d/start-contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/snapshots/789dd79ab5ab725be1b6ced088109b803a4d62f9874f932eb384a868d94360a4/contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/snapshots/789dd79ab5ab725be1b6ced088109b803a4d62f9874f932eb384a868d94360a4/contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/snapshots/7e3fa7fbe98974385451444c229337c87ec90c547a9214f81700f86b5af3563d/contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/snapshots/7e3fa7fbe98974385451444c229337c87ec90c547a9214f81700f86b5af3563d/contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/snapshots/827997ce6f33b7193b0a9eda969affe757e0d54209fde344afcd4d41321c5078/contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/snapshots/827997ce6f33b7193b0a9eda969affe757e0d54209fde344afcd4d41321c5078/contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/snapshots/93be6c200743261baf55f0586b1380a1c0ade3c48730c09a8fec71ba419c2464/contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/snapshots/93be6c200743261baf55f0586b1380a1c0ade3c48730c09a8fec71ba419c2464/contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/snapshots/afdcd8ee600252054660e79266ede99d1f5227b586225985565eff24414696d0/contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/snapshots/afdcd8ee600252054660e79266ede99d1f5227b586225985565eff24414696d0/contract.json
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/snapshots/d11106e57024ff51282c4a92f549538eb9b8c77b30c719d5e25e726e9cdb40de/contract.d.ts
  • examples/prisma-next-demo/fixtures/multi-branch/migrations/snapshots/d11106e57024ff51282c4a92f549538eb9b8c77b30c719d5e25e726e9cdb40de/contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0719_init/end-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0719_init/migration.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0725_add_name/end-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0725_add_name/migration.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0725_add_name/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0725_add_name/start-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0725_alice_phone/end-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0725_alice_phone/migration.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0725_alice_phone/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0725_alice_phone/start-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0725_bob_avatar/end-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0725_bob_avatar/migration.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0725_bob_avatar/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0725_bob_avatar/start-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_add_bio/end-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_add_bio/migration.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_add_bio/start-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_add_locale/end-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_add_locale/migration.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_add_locale/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_add_locale/start-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_fast_forward/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_fast_forward/end-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_fast_forward/migration.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_fast_forward/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_fast_forward/start-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_merge_alice/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_merge_alice/end-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_merge_alice/migration.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_merge_alice/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_merge_alice/start-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_merge_bob/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_merge_bob/end-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_merge_bob/migration.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_merge_bob/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0726_merge_bob/start-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_hotfix/end-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_hotfix/migration.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_hotfix/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_hotfix/start-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_rollback_alice/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_rollback_alice/end-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_rollback_alice/migration.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_rollback_alice/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_rollback_alice/start-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_rollback_locale/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_rollback_locale/end-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_rollback_locale/migration.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_rollback_locale/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_rollback_locale/start-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_rollback_users/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_rollback_users/end-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_rollback_users/migration.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_rollback_users/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0727_rollback_users/start-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0728_promote_bob/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0728_promote_bob/end-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0728_promote_bob/migration.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0728_promote_bob/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0728_promote_bob/start-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0729_reapply_noop/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0729_reapply_noop/start-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0730_experiment/end-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0730_experiment/migration.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0730_experiment/start-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0730_revert_experiment/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0730_revert_experiment/end-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0730_revert_experiment/migration.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0730_revert_experiment/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260601T0730_revert_experiment/start-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260602T1624_rollback_to_users_from_tip/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260602T1624_rollback_to_users_from_tip/end-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260602T1624_rollback_to_users_from_tip/migration.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260602T1624_rollback_to_users_from_tip/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260602T1624_rollback_to_users_from_tip/start-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260602T1626_rollback_to_users_from_bio/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260602T1626_rollback_to_users_from_bio/end-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260602T1626_rollback_to_users_from_bio/migration.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260602T1626_rollback_to_users_from_bio/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/app/20260602T1626_rollback_to_users_from_bio/start-contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/34dd5176d953c101467355b72fd2adf3e49c97bf13d8198dcc0dafec4d6341ce/contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/34dd5176d953c101467355b72fd2adf3e49c97bf13d8198dcc0dafec4d6341ce/contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/3705eb1cd04a52180d1206181446bb87e18bb32afcc3d1dacbec685ca2d449d1/contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/3705eb1cd04a52180d1206181446bb87e18bb32afcc3d1dacbec685ca2d449d1/contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/3bfce91c81146b347dc05f423a71907a82d8b2e78ab5714b2bfab673f673d021/contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/3bfce91c81146b347dc05f423a71907a82d8b2e78ab5714b2bfab673f673d021/contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/419c09911c25cf9b97e60ee157c61a126accfa5f26f5cdb7954667c704f53753/contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/419c09911c25cf9b97e60ee157c61a126accfa5f26f5cdb7954667c704f53753/contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/83a1ded0b0045642794c268ef48d21d54bb65a481c13c8b243a7f5821b78d9a0/contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/83a1ded0b0045642794c268ef48d21d54bb65a481c13c8b243a7f5821b78d9a0/contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/935a02360e01dda00d62f98429f4347bf765abf9118bca03941383cef87591c5/contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/935a02360e01dda00d62f98429f4347bf765abf9118bca03941383cef87591c5/contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/bf158ef32daace0a629bfdac5d569b0d43cd81e257e2463aef2545638e2c7585/contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/bf158ef32daace0a629bfdac5d569b0d43cd81e257e2463aef2545638e2c7585/contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/f1e8cde6ed1bd4ed5851d1308cd58431169236230778c42382189cdc0557a7fb/contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/f1e8cde6ed1bd4ed5851d1308cd58431169236230778c42382189cdc0557a7fb/contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/f5aa17d46d7be94ca3ddf4d14d90e0444291d9c063c52d0e05455726e52e0026/contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/f5aa17d46d7be94ca3ddf4d14d90e0444291d9c063c52d0e05455726e52e0026/contract.json
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/f66098408da51786d8c6701a2b10db2e90f4b7e138eb5e95f84dc61e156d242b/contract.d.ts
  • examples/prisma-next-demo/fixtures/showcase/migrations/snapshots/f66098408da51786d8c6701a2b10db2e90f4b7e138eb5e95f84dc61e156d242b/contract.json
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260301T1000_init/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260301T1000_init/end-contract.json
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260301T1000_init/migration.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260302T1000_add_phone/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260302T1000_add_phone/end-contract.json
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260302T1000_add_phone/migration.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260302T1000_add_phone/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260302T1000_add_phone/start-contract.json
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260303T1000_add_bio/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260303T1000_add_bio/end-contract.json
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260303T1000_add_bio/migration.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260303T1000_add_bio/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260303T1000_add_bio/start-contract.json
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260304T1000_add_posts/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260304T1000_add_posts/end-contract.json
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260304T1000_add_posts/migration.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260304T1000_add_posts/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260304T1000_add_posts/start-contract.json
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260305T1000_rollback_to_phone/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260305T1000_rollback_to_phone/end-contract.json
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260305T1000_rollback_to_phone/migration.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260305T1000_rollback_to_phone/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260305T1000_rollback_to_phone/start-contract.json
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260306T1000_rollback_to_init/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260306T1000_rollback_to_init/end-contract.json
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260306T1000_rollback_to_init/migration.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260306T1000_rollback_to_init/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/app/20260306T1000_rollback_to_init/start-contract.json
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/snapshots/789dd79ab5ab725be1b6ced088109b803a4d62f9874f932eb384a868d94360a4/contract.d.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/snapshots/789dd79ab5ab725be1b6ced088109b803a4d62f9874f932eb384a868d94360a4/contract.json
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/snapshots/7e951c7a95f42ca0420d9c4aae3602e32911606399982347621943fce34076d8/contract.d.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/snapshots/7e951c7a95f42ca0420d9c4aae3602e32911606399982347621943fce34076d8/contract.json
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/snapshots/827997ce6f33b7193b0a9eda969affe757e0d54209fde344afcd4d41321c5078/contract.d.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/snapshots/827997ce6f33b7193b0a9eda969affe757e0d54209fde344afcd4d41321c5078/contract.json
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/snapshots/93be6c200743261baf55f0586b1380a1c0ade3c48730c09a8fec71ba419c2464/contract.d.ts
  • examples/prisma-next-demo/fixtures/skip-rollback/migrations/snapshots/93be6c200743261baf55f0586b1380a1c0ade3c48730c09a8fec71ba419c2464/contract.json
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260301T1000_init/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260301T1000_init/end-contract.json
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260301T1000_init/migration.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1000_add_phone/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1000_add_phone/end-contract.json
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1000_add_phone/migration.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1000_add_phone/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1000_add_phone/start-contract.json
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1100_add_posts/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1100_add_posts/end-contract.json
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1100_add_posts/migration.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1100_add_posts/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1100_add_posts/start-contract.json
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1200_add_avatar/end-contract.d.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1200_add_avatar/end-contract.json
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1200_add_avatar/migration.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1200_add_avatar/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1200_add_avatar/start-contract.json
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1300_add_category/end-contract.json
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1300_add_category/migration.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1300_add_category/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1300_add_category/start-contract.json
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1400_add_settings/end-contract.json
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1400_add_settings/migration.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1400_add_settings/start-contract.d.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/app/20260302T1400_add_settings/start-contract.json
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/snapshots/2796854eb60b7ce66a0cd34d550680931f82fc2d2dca048726f971d1cc3aef10/contract.d.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/snapshots/2796854eb60b7ce66a0cd34d550680931f82fc2d2dca048726f971d1cc3aef10/contract.json
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/snapshots/789dd79ab5ab725be1b6ced088109b803a4d62f9874f932eb384a868d94360a4/contract.d.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/snapshots/789dd79ab5ab725be1b6ced088109b803a4d62f9874f932eb384a868d94360a4/contract.json
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/snapshots/7e3fa7fbe98974385451444c229337c87ec90c547a9214f81700f86b5af3563d/contract.d.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/snapshots/7e3fa7fbe98974385451444c229337c87ec90c547a9214f81700f86b5af3563d/contract.json
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/snapshots/93be6c200743261baf55f0586b1380a1c0ade3c48730c09a8fec71ba419c2464/contract.d.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/snapshots/93be6c200743261baf55f0586b1380a1c0ade3c48730c09a8fec71ba419c2464/contract.json
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/snapshots/afdcd8ee600252054660e79266ede99d1f5227b586225985565eff24414696d0/contract.d.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/snapshots/afdcd8ee600252054660e79266ede99d1f5227b586225985565eff24414696d0/contract.json
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/snapshots/f224748df616e79a307d7d1d964b2cca74f858a8f00c95ed131d7675a3e74554/contract.d.ts
  • examples/prisma-next-demo/fixtures/wide-fan/migrations/snapshots/f224748df616e79a307d7d1d964b2cca74f858a8f00c95ed131d7675a3e74554/contract.json
  • examples/prisma-next-demo/migrations/app/20260422T0720_initial/end-contract.json
  • examples/prisma-next-demo/migrations/app/20260422T0720_initial/migration.ts
  • examples/prisma-next-demo/migrations/snapshots/6c96d4165531a6e68599368aa8d4de3d90d1c7e592c7143cd167d69feee89dc0/contract.d.ts
  • examples/prisma-next-demo/migrations/snapshots/6c96d4165531a6e68599368aa8d4de3d90d1c7e592c7143cd167d69feee89dc0/contract.json
  • examples/prisma-next-demo/migrations/snapshots/8ac1bfb344d599a74f9b5f6870cdddb912706594dc90228038ef218fd9a45965/contract.d.ts
  • examples/prisma-next-demo/migrations/snapshots/8ac1bfb344d599a74f9b5f6870cdddb912706594dc90228038ef218fd9a45965/contract.json
  • examples/prisma-next-demo/test/utils/control-client.ts
  • examples/prisma-next-postgis-demo/migrations/app/20260512T1309_migration/end-contract.json
  • examples/prisma-next-postgis-demo/migrations/app/20260512T1309_migration/migration.ts
  • examples/prisma-next-postgis-demo/migrations/postgis/contract.json
  • examples/prisma-next-postgis-demo/migrations/snapshots/01622b3970e0ee2a582cc4c857bca7f6ed970f21b23f44e3f2781eea0be7d5eb/contract.d.ts
  • examples/prisma-next-postgis-demo/migrations/snapshots/01622b3970e0ee2a582cc4c857bca7f6ed970f21b23f44e3f2781eea0be7d5eb/contract.json
  • examples/prisma-next-postgis-demo/migrations/snapshots/6c2de2dd04e4425aa3a8ba8e05df0c812204ef610bb975ae1b2b7d19c74fbdb2/contract.d.ts
  • examples/prisma-next-postgis-demo/migrations/snapshots/6c2de2dd04e4425aa3a8ba8e05df0c812204ef610bb975ae1b2b7d19c74fbdb2/contract.json
  • examples/retail-store/migrations/app/20260513T0505_initial/migration.ts
  • examples/retail-store/migrations/app/20260513T0507_add_product_category_index/end-contract.json
  • examples/retail-store/migrations/app/20260513T0507_add_product_category_index/migration.ts
  • examples/retail-store/migrations/app/20260513T0507_add_product_category_index/start-contract.json
  • examples/retail-store/migrations/app/20260513T0508_backfill_product_status/end-contract.json
  • examples/retail-store/migrations/app/20260513T0508_backfill_product_status/migration.ts
  • examples/retail-store/migrations/app/20260513T0508_backfill_product_status/start-contract.d.ts
  • examples/retail-store/migrations/app/20260513T0508_backfill_product_status/start-contract.json
  • examples/retail-store/migrations/app/20260628T0931_add_product_status_order_type_enums/end-contract.json
  • examples/retail-store/migrations/app/20260628T0931_add_product_status_order_type_enums/migration.ts
  • examples/retail-store/migrations/app/20260628T0931_add_product_status_order_type_enums/start-contract.d.ts
  • examples/retail-store/migrations/app/20260628T0931_add_product_status_order_type_enums/start-contract.json
  • examples/retail-store/migrations/snapshots/059f3f35403c5a7a90851c23f1028e16d5250630f8a82fba33053e9a50534589/contract.d.ts
  • examples/retail-store/migrations/snapshots/059f3f35403c5a7a90851c23f1028e16d5250630f8a82fba33053e9a50534589/contract.json
  • examples/retail-store/migrations/snapshots/71f1cc5c3f4de1ea7c9c8426fde682cd78c7c005f6688f58c2d9d6ddd8b2284c/contract.d.ts
  • examples/retail-store/migrations/snapshots/71f1cc5c3f4de1ea7c9c8426fde682cd78c7c005f6688f58c2d9d6ddd8b2284c/contract.json
  • examples/retail-store/migrations/snapshots/8ee1e7ce30ed334572583d826d9c41388c46f7db82ae2352c3a3fccf1de7cbab/contract.d.ts
  • examples/retail-store/migrations/snapshots/8ee1e7ce30ed334572583d826d9c41388c46f7db82ae2352c3a3fccf1de7cbab/contract.json
  • examples/retail-store/migrations/snapshots/950513819883fab7f2e961cfbea6ba069bec18ff2df023f9d0c9d6836c51feec/contract.d.ts
  • examples/retail-store/migrations/snapshots/950513819883fab7f2e961cfbea6ba069bec18ff2df023f9d0c9d6836c51feec/contract.json
  • examples/retail-store/test/migration-chain.test.ts
  • examples/supabase/test/real-supabase.acceptance.test.ts
  • gotchas.md
  • package.json
  • packages/1-framework/1-core/framework-components/src/control/contract-snapshot-layout.ts
  • packages/1-framework/1-core/framework-components/src/control/control-migration-types.ts
  • packages/1-framework/1-core/framework-components/src/control/control-spaces.ts
  • packages/1-framework/1-core/framework-components/src/exports/control.ts
  • packages/1-framework/1-core/framework-components/test/contract-snapshot-layout.test.ts
  • packages/1-framework/1-core/ts-render/src/json-to-ts-source.ts
  • packages/1-framework/1-core/ts-render/src/render-imports.ts
  • packages/1-framework/1-core/ts-render/test/json-to-ts-source.test.ts
  • packages/1-framework/1-core/ts-render/test/render-imports.test.ts
  • packages/1-framework/3-tooling/cli/README.md
  • packages/1-framework/3-tooling/cli/src/commands/db-sign.ts
  • packages/1-framework/3-tooling/cli/src/commands/db-update.ts
  • packages/1-framework/3-tooling/cli/src/commands/init/hygiene-gitattributes.ts
  • packages/1-framework/3-tooling/cli/src/commands/init/init.ts
  • packages/1-framework/3-tooling/cli/src/commands/init/output.ts
  • packages/1-framework/3-tooling/cli/src/commands/init/reinit-cleanup.ts
  • packages/1-framework/3-tooling/cli/src/commands/migration-check.ts
  • packages/1-framework/3-tooling/cli/src/commands/migration-list.ts
  • packages/1-framework/3-tooling/cli/src/commands/migration-new.ts
  • packages/1-framework/3-tooling/cli/src/commands/migration-plan.ts
  • packages/1-framework/3-tooling/cli/src/commands/ref.ts
  • packages/1-framework/3-tooling/cli/src/utils/contract-at-errors.ts
  • packages/1-framework/3-tooling/cli/src/utils/contract-space-seed-phase.ts
  • packages/1-framework/3-tooling/cli/src/utils/plan-resolution.ts
  • packages/1-framework/3-tooling/cli/test/commands/db-update-read-aggregate-json-golden.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/init/hygiene.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/init/init.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/init/reinit-cleanup.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/migrate-show.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/migrate-to-contract.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/migration-apply.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/migration-check-multi-space.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/migration-check-snapshot-consistency.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/migration-e2e.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/migration-plan-command.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/migration-plan.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/migration-read-commands-parity.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/migration-ref.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/migration-tamper.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/read-commands-json-golden.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/ref.test.ts
  • packages/1-framework/3-tooling/cli/test/control-api/db-verify.per-space-verifier.test.ts
  • packages/1-framework/3-tooling/cli/test/control-api/migrate-plan-space-path.test.ts
  • packages/1-framework/3-tooling/cli/test/utils/contract-space-seed-phase.mongo.test.ts
  • packages/1-framework/3-tooling/cli/test/utils/contract-space-seed-phase.test.ts
  • packages/1-framework/3-tooling/cli/test/utils/plan-resolution.test.ts
  • packages/1-framework/3-tooling/migration/package.json
  • packages/1-framework/3-tooling/migration/src/aggregate/aggregate.ts
  • packages/1-framework/3-tooling/migration/src/aggregate/loader.ts
  • packages/1-framework/3-tooling/migration/src/aggregate/planner-types.ts
  • packages/1-framework/3-tooling/migration/src/aggregate/strategies/plan-from-diff.ts
  • packages/1-framework/3-tooling/migration/src/aggregate/types.ts
  • packages/1-framework/3-tooling/migration/src/compute-extension-space-apply-path.ts
  • packages/1-framework/3-tooling/migration/src/contract-snapshot-store.ts
  • packages/1-framework/3-tooling/migration/src/emit-contract-space-artifacts.ts
  • packages/1-framework/3-tooling/migration/src/errors.ts
  • packages/1-framework/3-tooling/migration/src/exports/contract-snapshot-store.ts
  • packages/1-framework/3-tooling/migration/src/exports/errors.ts
  • packages/1-framework/3-tooling/migration/src/exports/spaces.ts
  • packages/1-framework/3-tooling/migration/src/io.ts
  • packages/1-framework/3-tooling/migration/src/migration-base.ts
  • packages/1-framework/3-tooling/migration/src/read-contract-space-contract.ts
  • packages/1-framework/3-tooling/migration/src/space-layout.ts
  • packages/1-framework/3-tooling/migration/src/verify-contract-spaces.ts
  • packages/1-framework/3-tooling/migration/test/aggregate/check-integrity.test.ts
  • packages/1-framework/3-tooling/migration/test/aggregate/contract-at.test.ts
  • packages/1-framework/3-tooling/migration/test/aggregate/loader.test.ts
  • packages/1-framework/3-tooling/migration/test/contract-snapshot-store-failure.test.ts
  • packages/1-framework/3-tooling/migration/test/contract-snapshot-store.test.ts
  • packages/1-framework/3-tooling/migration/test/deletable-node-modules.test.ts
  • packages/1-framework/3-tooling/migration/test/emit-contract-space-artefacts.test.ts
  • packages/1-framework/3-tooling/migration/test/emit-contract-space-artifacts.test.ts
  • packages/1-framework/3-tooling/migration/test/fixtures.ts
  • packages/1-framework/3-tooling/migration/test/gather-disk-contract-space-state.test.ts
  • packages/1-framework/3-tooling/migration/test/io.test.ts
  • packages/1-framework/3-tooling/migration/test/read-contract-space-head-ref.test.ts
  • packages/1-framework/3-tooling/migration/test/verify-contract-spaces.test.ts
  • packages/1-framework/3-tooling/migration/tsdown.config.ts
  • packages/2-mongo-family/9-family/src/core/mongo-migration.ts
  • packages/2-mongo-family/9-family/test/fixtures/migration-contract.d.ts
  • packages/2-mongo-family/9-family/test/fixtures/migration-contract.json
  • packages/2-mongo-family/9-family/test/fixtures/migration-end-contract.d.ts
  • packages/2-mongo-family/9-family/test/fixtures/migration-end-contract.json
  • packages/2-mongo-family/9-family/test/mongo-migration.test.ts
  • packages/2-sql/9-family/src/core/migrations/types.ts
  • packages/3-extensions/paradedb/README.md
  • packages/3-extensions/paradedb/migrations/20260601T0000_install_pg_search_extension/end-contract.json
  • packages/3-extensions/paradedb/migrations/snapshots/efd408cf8924b4d1805bf5acced8898114aa03cd46b465720179c82a4431d51e/contract.d.ts
  • packages/3-extensions/paradedb/migrations/snapshots/efd408cf8924b4d1805bf5acced8898114aa03cd46b465720179c82a4431d51e/contract.json
  • packages/3-extensions/pgvector/README.md
  • packages/3-extensions/pgvector/migrations/20260601T0000_install_vector_extension/end-contract.json
  • packages/3-extensions/pgvector/migrations/snapshots/c7bb9818eb8d86182fff73219e9c27c4f42ff7918bdcabf003324a7c6c814e20/contract.d.ts
  • packages/3-extensions/pgvector/migrations/snapshots/c7bb9818eb8d86182fff73219e9c27c4f42ff7918bdcabf003324a7c6c814e20/contract.json
  • packages/3-extensions/pgvector/test/migrations/planner.behavior.test.ts
  • packages/3-extensions/pgvector/test/migrations/planner.contract-to-schema-ir.test.ts
  • packages/3-extensions/pgvector/test/migrations/planner.storage-types.test.ts
  • packages/3-extensions/postgis/migrations/20260601T0000_install_postgis_extension/end-contract.json
  • packages/3-extensions/postgis/migrations/snapshots/eae593f92640a599b88d4901b70c572442661a4f0f7460ea1b6295da661d8653/contract.d.ts
  • packages/3-extensions/postgis/migrations/snapshots/eae593f92640a599b88d4901b70c572442661a4f0f7460ea1b6295da661d8653/contract.json
  • packages/3-extensions/supabase/test/classification.e2e.test.ts
  • packages/3-extensions/supabase/test/cross-contract-fk.integration.test.ts
  • packages/3-extensions/supabase/test/explicit-namespace-query.integration.test.ts
  • packages/3-extensions/supabase/test/reference-fixture-verify.integration.test.ts
  • packages/3-extensions/supabase/test/rls-role-binding.integration.test.ts
  • packages/3-extensions/supabase/test/roles-verify.integration.test.ts
  • packages/3-extensions/supabase/test/skeleton.integration.test.ts
  • packages/3-mongo-target/1-mongo-target/src/core/mongo-planner.ts
  • packages/3-mongo-target/1-mongo-target/src/core/planner-produced-migration.ts
  • packages/3-mongo-target/1-mongo-target/src/core/render-typescript.ts
  • packages/3-mongo-target/1-mongo-target/test/migration-e2e.test.ts
  • packages/3-mongo-target/1-mongo-target/test/mongo-planner.test.ts
  • packages/3-mongo-target/1-mongo-target/test/mongo-runner-integration.test.ts
  • packages/3-mongo-target/1-mongo-target/test/mongo-runner.polymorphism.integration.test.ts
  • packages/3-mongo-target/1-mongo-target/test/mongo-runner.schema-verify.integration.test.ts
  • packages/3-mongo-target/1-mongo-target/test/mongo-runner.validator-closed.integration.test.ts
  • packages/3-mongo-target/1-mongo-target/test/mongo-runner.validator-widen.integration.test.ts
  • packages/3-mongo-target/1-mongo-target/test/planner-produced-migration.test.ts
  • packages/3-mongo-target/1-mongo-target/test/render-ops.test.ts
  • packages/3-mongo-target/1-mongo-target/test/render-typescript.test.ts
  • packages/3-targets/3-targets/postgres/src/core/migrations/op-factory-call.ts
  • packages/3-targets/3-targets/postgres/src/core/migrations/operations/data-transform.ts
  • packages/3-targets/3-targets/postgres/src/core/migrations/planner-produced-postgres-migration.ts
  • packages/3-targets/3-targets/postgres/src/core/migrations/planner.ts
  • packages/3-targets/3-targets/postgres/src/core/migrations/render-typescript.ts
  • packages/3-targets/3-targets/postgres/test/migrations/native-enum-planner.test.ts
  • packages/3-targets/3-targets/postgres/test/migrations/op-factory-call.lowering.test.ts
  • packages/3-targets/3-targets/postgres/test/migrations/planner.sibling-scoping.test.ts
  • packages/3-targets/3-targets/postgres/test/migrations/render-typescript.test.ts
  • packages/3-targets/3-targets/postgres/test/migrations/rls-enablement-planner.test.ts
  • packages/3-targets/3-targets/postgres/test/migrations/rls-planner.test.ts
  • packages/3-targets/3-targets/postgres/test/migrations/rls-rename-planner.test.ts
  • packages/3-targets/3-targets/sqlite/src/core/migrations/planner-produced-sqlite-migration.ts
  • packages/3-targets/3-targets/sqlite/src/core/migrations/planner.ts
  • packages/3-targets/3-targets/sqlite/src/core/migrations/render-typescript.ts
  • packages/3-targets/3-targets/sqlite/src/core/migrations/sqlite-migration.ts
  • packages/3-targets/3-targets/sqlite/test/migrations/nullability-backfill.test.ts
  • packages/3-targets/3-targets/sqlite/test/migrations/planner.authoring-surface.test.ts
  • packages/3-targets/3-targets/sqlite/test/migrations/planner.sibling-scoping.test.ts
  • packages/3-targets/3-targets/sqlite/test/migrations/render-typescript.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/cross-namespace-fk.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/db-init-update.cli.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/enum-check-constraint.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/native-array-columns.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/native-enum-add-value.real-postgres.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/native-enum-lifecycle-e2e.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/op-factory-call.lowering.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/op-factory-call.rendering.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/order-by-enum.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/planner.authoring-surface.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/planner.codec-field-event.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/planner.cross-space-fk-ddl.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/planner.fk-config.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/planner.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/planner.reconciliation.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/planner.reconciliation.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/planner.referential-actions.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/planner.unique-index-structural.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/planner.uuid.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/render-typescript.roundtrip.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/rls-lifecycle-e2e.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/rls-migration-plan.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/rls-role-verify.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/rls-verify-extension-issues.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/rls-walking-skeleton-psl.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/rls-walking-skeleton.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/runner-independence.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/runner.basic.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/runner.idempotency.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/runner.ledger.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/runner.unbound-namespace.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/schema-verify.after-runner.integration.test.ts
  • packages/3-targets/6-adapters/sqlite/test/migrations/db-init-update.cli.test.ts
  • packages/3-targets/6-adapters/sqlite/test/migrations/planner-introspection.integration.test.ts
  • packages/3-targets/6-adapters/sqlite/test/migrations/planner.codec-field-event.test.ts
  • packages/3-targets/6-adapters/sqlite/test/migrations/planner.test.ts
  • packages/3-targets/6-adapters/sqlite/test/migrations/render-typescript.roundtrip.test.ts
  • packages/3-targets/6-adapters/sqlite/test/migrations/runner-independence.test.ts
  • packages/3-targets/6-adapters/sqlite/test/migrations/runner.basic.test.ts
  • packages/3-targets/6-adapters/sqlite/test/migrations/runner.ledger.test.ts
  • packages/3-targets/7-drivers/postgres/src/exports/control.ts
  • packages/3-targets/7-drivers/postgres/test/control.test.ts
  • scripts/lint-framework-vocabulary.config.json
  • scripts/migrate-migrations-layout.mjs
  • scripts/migrate-migrations-layout.test.mjs
  • scripts/regen-example-migrations.mjs
  • scripts/regen-extension-migrations.mjs
  • scripts/regen-mongo-end-contract-dts.mjs
  • skills/extension-author/prisma-next-extension-upgrade/upgrades/0.16-to-0.17/instructions.md
  • skills/prisma-next-migrations/SKILL.md
  • skills/prisma-next-quickstart/SKILL.md
  • skills/upgrade/prisma-next-upgrade/upgrades/0.16-to-0.17/instructions.md
  • test/e2e/framework/test/sqlite/migrations/harness.ts
  • test/e2e/framework/test/utils.ts
  • test/integration/test/authoring/psl.pgvector-dbinit.test.ts
  • test/integration/test/cli-journeys/invariant-routing.e2e.test.ts
  • test/integration/test/cli-journeys/invariant-routing.mongo.e2e.test.ts
  • test/integration/test/cli-journeys/migration-check.e2e.test.ts
  • test/integration/test/cli-journeys/migration-plan-details.e2e.test.ts
  • test/integration/test/cli-journeys/migration-round-trip.e2e.test.ts
  • test/integration/test/cli-journeys/mongo-migration.e2e.test.ts
  • test/integration/test/cli.db-verify.aggregate-schema.test.ts
  • test/integration/test/cli.migrate-external-space.e2e.test.ts
  • test/integration/test/cli.migrate-ref-advancement.e2e.test.ts
  • test/integration/test/cli.migration-apply.e2e.test.ts
  • test/integration/test/cli.ref-snapshot-integration.e2e.test.ts
  • test/integration/test/cross-package/postgres-control-policy-planner.test.ts
  • test/integration/test/cross-package/postgres-issue-planner.test.ts
  • test/integration/test/extension-pgvector-scenario-a.e2e.integration.test.ts
  • test/integration/test/fixtures/cli/cli-e2e-test-app/fixtures/mongo-cli-journeys/contract-branch-b.ts
  • test/integration/test/mongo/aggregate-e2e.test.ts
  • test/integration/test/mongo/codec-rehydration-guardrail.test.ts
  • test/integration/test/mongo/migration-e2e.test.ts
  • test/integration/test/mongo/migration-m2-vocabulary.test.ts
  • test/integration/test/mongo/migration-psl-authoring.test.ts
  • test/integration/test/mongo/runner.test.ts
  • test/integration/test/referential-actions.integration.test.ts
  • test/integration/test/rls-ts-walking-skeleton.integration.test.ts
  • test/integration/test/scalar-lists/orm-list-read.integration.test.ts
  • test/integration/test/scalar-lists/psl-list-roundtrip.integration.test.ts
  • test/integration/test/utils/journey-test-helpers.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch tml-3059-dedupe-migration-snapshots

@pkg-pr-new

pkg-pr-new Bot commented Jul 21, 2026

Copy link
Copy Markdown

Open in StackBlitz

@prisma-next/extension-author-tools

npm i https://pkg.pr.new/@prisma-next/extension-author-tools@1018

@prisma-next/mongo-runtime

npm i https://pkg.pr.new/@prisma-next/mongo-runtime@1018

@prisma-next/family-mongo

npm i https://pkg.pr.new/@prisma-next/family-mongo@1018

@prisma-next/sql-runtime

npm i https://pkg.pr.new/@prisma-next/sql-runtime@1018

@prisma-next/family-sql

npm i https://pkg.pr.new/@prisma-next/family-sql@1018

@prisma-next/extension-arktype-json

npm i https://pkg.pr.new/@prisma-next/extension-arktype-json@1018

@prisma-next/middleware-cache

npm i https://pkg.pr.new/@prisma-next/middleware-cache@1018

@prisma-next/mongo

npm i https://pkg.pr.new/@prisma-next/mongo@1018

@prisma-next/extension-paradedb

npm i https://pkg.pr.new/@prisma-next/extension-paradedb@1018

@prisma-next/extension-pgvector

npm i https://pkg.pr.new/@prisma-next/extension-pgvector@1018

@prisma-next/extension-postgis

npm i https://pkg.pr.new/@prisma-next/extension-postgis@1018

@prisma-next/postgres

npm i https://pkg.pr.new/@prisma-next/postgres@1018

@prisma-next/sql-orm-client

npm i https://pkg.pr.new/@prisma-next/sql-orm-client@1018

@prisma-next/sqlite

npm i https://pkg.pr.new/@prisma-next/sqlite@1018

@prisma-next/extension-supabase

npm i https://pkg.pr.new/@prisma-next/extension-supabase@1018

@prisma-next/target-mongo

npm i https://pkg.pr.new/@prisma-next/target-mongo@1018

@prisma-next/adapter-mongo

npm i https://pkg.pr.new/@prisma-next/adapter-mongo@1018

@prisma-next/driver-mongo

npm i https://pkg.pr.new/@prisma-next/driver-mongo@1018

@prisma-next/contract

npm i https://pkg.pr.new/@prisma-next/contract@1018

@prisma-next/utils

npm i https://pkg.pr.new/@prisma-next/utils@1018

@prisma-next/config

npm i https://pkg.pr.new/@prisma-next/config@1018

@prisma-next/errors

npm i https://pkg.pr.new/@prisma-next/errors@1018

@prisma-next/framework-components

npm i https://pkg.pr.new/@prisma-next/framework-components@1018

@prisma-next/operations

npm i https://pkg.pr.new/@prisma-next/operations@1018

@prisma-next/ts-render

npm i https://pkg.pr.new/@prisma-next/ts-render@1018

@prisma-next/contract-authoring

npm i https://pkg.pr.new/@prisma-next/contract-authoring@1018

@prisma-next/ids

npm i https://pkg.pr.new/@prisma-next/ids@1018

@prisma-next/psl-parser

npm i https://pkg.pr.new/@prisma-next/psl-parser@1018

@prisma-next/psl-printer

npm i https://pkg.pr.new/@prisma-next/psl-printer@1018

@prisma-next/cli

npm i https://pkg.pr.new/@prisma-next/cli@1018

@prisma-next/cli-telemetry

npm i https://pkg.pr.new/@prisma-next/cli-telemetry@1018

@prisma-next/config-loader

npm i https://pkg.pr.new/@prisma-next/config-loader@1018

@prisma-next/emitter

npm i https://pkg.pr.new/@prisma-next/emitter@1018

@prisma-next/language-server

npm i https://pkg.pr.new/@prisma-next/language-server@1018

@prisma-next/migration-tools

npm i https://pkg.pr.new/@prisma-next/migration-tools@1018

prisma-next

npm i https://pkg.pr.new/prisma-next@1018

@prisma-next/vite-plugin-contract-emit

npm i https://pkg.pr.new/@prisma-next/vite-plugin-contract-emit@1018

@prisma-next/mongo-codec

npm i https://pkg.pr.new/@prisma-next/mongo-codec@1018

@prisma-next/mongo-contract

npm i https://pkg.pr.new/@prisma-next/mongo-contract@1018

@prisma-next/mongo-value

npm i https://pkg.pr.new/@prisma-next/mongo-value@1018

@prisma-next/mongo-contract-psl

npm i https://pkg.pr.new/@prisma-next/mongo-contract-psl@1018

@prisma-next/mongo-contract-ts

npm i https://pkg.pr.new/@prisma-next/mongo-contract-ts@1018

@prisma-next/mongo-emitter

npm i https://pkg.pr.new/@prisma-next/mongo-emitter@1018

@prisma-next/mongo-schema-ir

npm i https://pkg.pr.new/@prisma-next/mongo-schema-ir@1018

@prisma-next/mongo-query-ast

npm i https://pkg.pr.new/@prisma-next/mongo-query-ast@1018

@prisma-next/mongo-orm

npm i https://pkg.pr.new/@prisma-next/mongo-orm@1018

@prisma-next/mongo-query-builder

npm i https://pkg.pr.new/@prisma-next/mongo-query-builder@1018

@prisma-next/mongo-lowering

npm i https://pkg.pr.new/@prisma-next/mongo-lowering@1018

@prisma-next/mongo-wire

npm i https://pkg.pr.new/@prisma-next/mongo-wire@1018

@prisma-next/sql-contract

npm i https://pkg.pr.new/@prisma-next/sql-contract@1018

@prisma-next/sql-errors

npm i https://pkg.pr.new/@prisma-next/sql-errors@1018

@prisma-next/sql-operations

npm i https://pkg.pr.new/@prisma-next/sql-operations@1018

@prisma-next/sql-schema-ir

npm i https://pkg.pr.new/@prisma-next/sql-schema-ir@1018

@prisma-next/sql-contract-psl

npm i https://pkg.pr.new/@prisma-next/sql-contract-psl@1018

@prisma-next/sql-contract-ts

npm i https://pkg.pr.new/@prisma-next/sql-contract-ts@1018

@prisma-next/sql-contract-emitter

npm i https://pkg.pr.new/@prisma-next/sql-contract-emitter@1018

@prisma-next/sql-lane-query-builder

npm i https://pkg.pr.new/@prisma-next/sql-lane-query-builder@1018

@prisma-next/sql-relational-core

npm i https://pkg.pr.new/@prisma-next/sql-relational-core@1018

@prisma-next/sql-builder

npm i https://pkg.pr.new/@prisma-next/sql-builder@1018

@prisma-next/target-postgres

npm i https://pkg.pr.new/@prisma-next/target-postgres@1018

@prisma-next/target-sqlite

npm i https://pkg.pr.new/@prisma-next/target-sqlite@1018

@prisma-next/adapter-postgres

npm i https://pkg.pr.new/@prisma-next/adapter-postgres@1018

@prisma-next/adapter-sqlite

npm i https://pkg.pr.new/@prisma-next/adapter-sqlite@1018

@prisma-next/driver-postgres

npm i https://pkg.pr.new/@prisma-next/driver-postgres@1018

@prisma-next/driver-sqlite

npm i https://pkg.pr.new/@prisma-next/driver-sqlite@1018

commit: 4b5d989

@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown

size-limit report 📦

Path Size
postgres / no-emit 161.81 KB (+0.02% 🔺)
postgres / emit 145.14 KB (+0.02% 🔺)
mongo / no-emit 99.67 KB (0%)
mongo / emit 89.86 KB (0%)
cf-worker / no-emit 186.83 KB (+0.01% 🔺)
cf-worker / emit 168.17 KB (-0.01% 🔽)

@wmadden-electric wmadden-electric changed the title tml 3059 dedupe migration snapshots tml-3059: deduplicate migration contract snapshots into migrations/snapshots/ Jul 21, 2026
wmadden-electric and others added 7 commits July 21, 2026 13:36
…llow-up slice

Operator decision (2026-07-21): deduplicate ref-paired snapshots
(refs/<name>.contract.*) into the same content-addressed store as a follow-up
slice sequenced before the RC layout freeze. The ref keeps only its hash
pointer; the contract resolves through migrations/snapshots/. Recorded in the
spec (out-of-scope note) and plan (Follow-up slice: 1 reader + 4 writers +
migrator + ADR-218 amendment, invariant, and the F05/ADR-239 wins).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
F01: delete the dead MIGRATION.FILE_MISSING branch in contract-at-errors.ts.
contractAt never raises this code under the store-based layout (it resolves
through CONTRACT_SNAPSHOT_MISSING or SNAPSHOT_MISSING instead), so the branch
was unreachable and pointed users at a removed end-contract.json sibling
file. It now falls through to the existing mapMigrationToolsError default.

F02: checkSnapshotConsistency in migration-check.ts computed the store path
once via contractSnapshotDir before the read, instead of recomputing it
inside the CHECK-006 catch block. A malformed pkg.metadata.to threw a plain
Error out of storageHashHex on the first call; the catch then called
contractSnapshotDir again while building its message, throwing the same
error a second time, uncaught, which crashed migration check into a generic
PRECONDITION exit. The path is now computed once, guarded, and reused in
both the read and the message; a malformed to now yields a clean
PN-MIG-CHECK-006 failure.

F04: removed the redundant `!RESERVED_SPACE_SUBDIR_NAMES.has(name)` filters
in loader.ts, migration-check.ts, and migration-list.ts. Their input
(listContractSpaceDirectories) already filters reserved names internally,
so the reserved-name check now lives in exactly one place.

F05: writeContractSnapshot now writes both contract.json and contract.d.ts
into a fresh temp directory under snapshots/ and atomically renames it into
place, instead of mkdir-ing the final directory and writing the two files
into it directly. A crash between the two writes can no longer leave a
partial snapshots/<hex>/ entry. If the rename loses a race to a concurrent
writer (EEXIST/ENOTEMPTY), it's treated as write-if-absent success and the
temp dir is cleaned up.

F06: readContractSnapshotJsonTolerant swallowed every read failure to
undefined, including non-ENOENT fs errors like EACCES. It now only swallows
ENOENT, a JSON parse error, the JSON literal null, and a malformed
storageHash; any other fs error propagates instead of silently loading a
contract-less package.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
Standardizes the British "artefact" spelling to American "artifact"
across everything this PR (deduplicate-migration-snapshots) introduced
or touched, per code-review finding F07 (operator-requested BLOCKER).

- File renames (git mv): emit-contract-space-artefacts.ts ->
  emit-contract-space-artifacts.ts, and its test file, plus every
  import specifier that referenced the old path.
- Identifier renames, repo-wide (these are exported/shared symbols so
  every reference had to move in lockstep): emitContractSpaceArtefacts,
  ContractSpaceArtefactInputs, ContractSpaceArtefactSetup,
  writeExtensionContractSpaceArtefacts, findStaleArtefacts,
  ARTEFACT_FILENAMES.
- Prose (comments, doc strings, test descriptions) in this PR's
  touched files, plus projects/deduplicate-migration-snapshots/{spec.md,plan.md}.

Left one CLI-printed message ("Files deleted (stale contract
artefacts):" in cli/src/commands/init/output.ts) unchanged — it is
shown to users and the dispatch asked to stop and report rather than
change user-facing string literals.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
Adds scripts/migrate-migrations-layout.mjs, the one-shot migrator spec D9
describes: for a migrations root, it moves each migration package's
start-contract.*/end-contract.* pair and each space's per-space
contract.json/contract.d.ts into the migrations-root-wide
migrations/snapshots/<hex>/ store, rewrites migration.ts's quoted import
specifiers to the store paths, and deletes the sibling files. It calls the
production writeContractSnapshot / snapshotsImportPathFrom
(migration-tools) and contractSnapshotJsonSpecifier /
contractSnapshotTypesSpecifier (framework-components) so its output is
byte-identical to what migration plan / the regen scripts produce.

Safety: the migrator plans every root read-only first, asserting each
contract's inner storage.storageHash against the hash it is filed under
(migration.json's from/to, or refs/head.json's hash) before any write or
delete happens anywhere; a mismatch aborts the whole run with nothing
touched. After mutating each package it re-reads migration.json/ops.json
byte-for-byte and recomputes migrationHash via computeMigrationHash,
aborting on any drift — the migrator never edits those files. Verified
directly against real fixture chains (retail-store's 4-migration chain,
prisma-next-postgis-demo's app + postgis space) copied into a scratch
tmpdir; the real committed tree was never touched (git status stays clean
for examples/ and packages/3-extensions/ throughout).

Resolution problem: scripts/*.mjs cannot resolve @prisma-next/* packages
(pnpm links per-consumer, not at the workspace root). Adds
@prisma-next/migration-tools and @prisma-next/framework-components as root
devDependencies (workspace:0.15.0, via pnpm add -Dw + pnpm install — no
hand-edited lockfile) so the migrator and the regen scripts can import the
production functions. Root package.json is private and excluded from
check-publish-deps' tarball scan, and devDependencies are outside its
@prisma-next/* pin check, so this does not trip that gate; both it and
lint:deps stay green.

Repoints scripts/regen-example-migrations.mjs and
scripts/regen-extension-migrations.mjs to emit into a scratch directory
(or read the extension's src/contract.json) and writeContractSnapshot the
result into the store, deleting the old rename-to-end-contract.* and
predecessor-copy-to-start-contract steps. Both scripts gain a
rewriteContractSnapshotSpecifiers helper that retargets the endContract /
startContract (and Contract as End/Start) import specifiers by binding
name rather than by literal old-path string, so a regen that produces a
new hash keeps migration.ts pointed at the right store entry -- the old
rewriteMigrationHashes/rewriteMigrationToHash (hash-literal rewrites) no
longer have any specifier work to do post-dedup, since the store encodes
the hash in the import path itself; they are kept as a defensive no-op for
any pre-dedup hash-literal shape. scripts/regen-mongo-end-contract-dts.mjs
needed no logic change -- it already takes a *.json path argument and
writes the sibling .d.ts beside it, so pointing it at a store entry's
contract.json works unchanged; only its docs were updated.

New scripts/migrate-migrations-layout.test.mjs (11 cases, node:test) covers
the store population + sibling deletion + specifier rewrite + byte-identical
migration.json/head.json happy path, second-run idempotence, and the
abort-before-any-write-or-delete behavior on a corrupted inner hash. Wired
into the package.json test:scripts list.

Per the dispatch's explicit CRITICAL CONSTRAINT, the real committed
migrations tree (examples/, packages/3-extensions/) is untouched -- running
the migrator against it is TML-3059 T9, a separate dispatch.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
Ran scripts/migrate-migrations-layout.mjs across all 17 migrations roots:
62 store writes (76 dedup hits), 276 sibling contract files deleted, 4 per-space
copies folded into the store, 71 migration.ts import blocks repointed at
../../snapshots/<hex>/contract(.json). Every migration.json is byte-identical
(79 migrationHash re-verifications passed); refs/head.json unchanged.
Workspace typecheck green — all rewritten store imports resolve.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
apps/telemetry-backend/migrations/app/20260601T1236_contract_hash_advance/
held only end-contract.{json,d.ts} — no migration.json, ops.json, or
migration.ts. It is an inert, unloadable leftover from a re-planned migration
(superseded by the complete 20260601T1347_contract_hash_advance/, a different
target hash); its contract hash appears nowhere else and nothing references the
dir. The one-shot migrator skips it (no manifest to key the store), so it is
removed here to satisfy AC1 (no end-contract.json anywhere).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
New ADR 239 records the decision: contract snapshots move from
per-package start-/end-contract.* siblings and per-space head copies
into a single content-addressed store at
migrations/snapshots/<hex>/contract.{json,d.ts} per migrations root,
keyed by storage hash, write-if-absent. Amends ADR 197 and ADR 232;
references ADR 199 and ADR 218. Indexed in ADR-INDEX.md under Migration
System.

Updates docs/architecture docs/subsystems/7. Migration System.md (File
Layout, the edge/marker model paragraph, Contract snapshot,
Runner-side independence, Pinned per-space artefacts, ref/PN-MIG-CHECK
mentions) to the store reality.

Repo-wide prose/comment/message sweep of stale start-contract/
end-contract references: docs/glossary.md, docs/onboarding/
fixtures-emit-and-check.md, gotchas.md, drive/calibration/
failure-modes.md, .agents/rules/contract-space-package-layout.mdc,
.agents/rules/never-hand-edit-contract-fixtures.mdc,
skills/prisma-next-migrations, skills/prisma-next-quickstart, the CLI
and extension READMEs, production JSDoc/comments/error messages across
framework-components, migration-tools, the SQL/Mongo/Postgres/SQLite
migration packages, and CLI commands, plus stale test titles/fixtures
in migration-plan-command, migrate-to-contract, plan-resolution,
contract-at, io, mongo-migration, and retail-store migration-chain
tests (the retail-store test read a pre-store on-disk path that no
longer exists after the tree migration landed; repointed to the
store). Removes the now-redundant start-/end-contract ignore globs from
biome.jsonc (the existing **/contract.json glob already covers store
entries).

Appends upgrade-note entries to the existing 0.15-to-0.16
instructions.md for both the prisma-next-upgrade and
prisma-next-extension-upgrade skills, documenting the layout change and
scripts/migrate-migrations-layout.mjs as the conversion path (the
extension-author note covers the shallow ../snapshots import depth).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
The design is recorded permanently in ADR 239; the ref-paired-snapshot
consolidation follow-up is tracked as its own ticket (TML-3072). Per
projects/README.md, the delivering PR deletes projects/<project>/ at close-out.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
wmadden-electric and others added 3 commits July 21, 2026 17:33
…tion-snapshots

# Conflicts:
#	package.json
#	packages/1-framework/3-tooling/cli/src/commands/migration-check.ts
#	skills/extension-author/prisma-next-extension-upgrade/upgrades/0.15-to-0.16/instructions.md
#	skills/upgrade/prisma-next-upgrade/upgrades/0.15-to-0.16/instructions.md
#	test/integration/test/cli-journeys/migration-check.e2e.test.ts
…tion-snapshots

# Conflicts:
#	skills/extension-author/prisma-next-extension-upgrade/upgrades/0.16-to-0.17/instructions.md
origin/main already carries two ADR 239 files ("Errors are structural envelopes
with dotted namespace codes" and "Option arguments and select templates for
authoring helpers"), so this ADR takes the next free number, 240. Updated the
title, the ADR-INDEX row, and the subsystem-doc cross-reference.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
@wmadden-electric wmadden-electric changed the title tml-3059: deduplicate migration contract snapshots into migrations/snapshots/ tml-3059: deduplicate migration contracts into a content-addressed migrations/snapshots/ store Jul 21, 2026
wmadden-electric and others added 2 commits July 21, 2026 18:34
The Lint job runs pnpm test:scripts without building, and the new
migrate-migrations-layout test imports workspace packages that resolve to
built dist. Add the same cache-restore build step the typecheck job uses.

The multi-extension-monorepo e2e intermittently dies on CI with the known
PGlite WASM abort ("Connection terminated unexpectedly"). Add the CI retry
layer, and absorb the async pg client error event in the control driver
(same defect class as cc4b5af in withClient): without a listener the
connection-level event surfaces as an unhandled error that fails the run
even after the retried test passes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
…ments, close frontmatter

storageHashHex threw a bare Error (lint:throws ratchet +1); a malformed
generated hash is a bug, so it becomes InternalError. Three new doc-comment
lines named SQL/Mongo inside packages/1-framework (family-vocabulary lint);
reworded family-blind, and the net reduction lowers the ratchet threshold to
835. The 0.16-to-0.17 upgrade instructions opened frontmatter without ever
closing it, so check:upgrade-coverage read the file as having no frontmatter
at all; close it and add the short prose body the sibling files carry.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
JSON.stringify leaves the line/paragraph separators unescaped; embedded in
generated migration.ts source they can terminate the string literal
(CodeQL js/bad-code-sanitization, alerts 24/25 on op-factory-call.ts
render sites). Escape them explicitly in the one shared printer.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
Comment thread packages/3-targets/7-drivers/postgres/src/exports/control.ts
@wmadden-electric
wmadden-electric added this pull request to the merge queue Jul 22, 2026
Merged via the queue into main with commit 0e51f1f Jul 22, 2026
22 checks passed
@wmadden-electric
wmadden-electric deleted the tml-3059-dedupe-migration-snapshots branch July 22, 2026 09:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants