fix(migrate): run the AI safety checkpoint on the interactive db push path - #29793
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
Summary by CodeRabbit
Walkthrough
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
✨ Simplify code
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/migrate/src/commands/DbPush.ts (1)
240-249: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick winKeep the checkpoint inside the cleanup
tryblock.At Line [240],
aiAgentConfirmationCheckpoint()can throw before thetryat Line [242], bypassingmigrate.stop()in the catch handler. Move it inside thetryas the first statement, immediately before the forced push.Proposed fix
- aiAgentConfirmationCheckpoint() - try { + aiAgentConfirmationCheckpoint() await migrate.push({ force: true, })🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/migrate/src/commands/DbPush.ts` around lines 240 - 249, Move aiAgentConfirmationCheckpoint() into the existing try block in the DbPush flow, placing it as the first statement immediately before migrate.push({ force: true }). Keep migrate.stop() in the catch so checkpoint failures and push failures both trigger cleanup before rethrowing.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/migrate/src/__tests__/DbPush.test.ts`:
- Around line 202-212: Strengthen the interactive confirmation test around
DbPush.new().parse by spying on the forced migrate.push invocation and asserting
it is not called when the Claude Code safety checkpoint rejects. Keep the
existing rejection assertion, ensuring the test verifies the checkpoint prevents
execution rather than merely reporting an error afterward.
---
Outside diff comments:
In `@packages/migrate/src/commands/DbPush.ts`:
- Around line 240-249: Move aiAgentConfirmationCheckpoint() into the existing
try block in the DbPush flow, placing it as the first statement immediately
before migrate.push({ force: true }). Keep migrate.stop() in the catch so
checkpoint failures and push failures both trigger cleanup before rethrowing.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 077415be-43e8-4713-ab12-2efbc7892790
📒 Files selected for processing (2)
packages/migrate/src/__tests__/DbPush.test.tspackages/migrate/src/commands/DbPush.ts
… path (prisma#29793) ## Summary - call `aiAgentConfirmationCheckpoint()` before the forced push that follows the interactive data loss confirmation in `prisma db push` - clear inherited agent marker environment variables in `DbPush.test.ts`, so the suite is stable when it runs under an AI agent - cover the interactive path with a regression test ## Why `db push` reaches `migrate.push({ force: true })` through two routes: - `--accept-data-loss`, which goes through the AI safety checkpoint (added in prisma#29713) - the interactive confirmation shown when the push reports data loss warnings, which does not Both apply the same destructive schema change. An agent that runs with a TTY attached answers the confirmation prompt itself, so on that route it can opt into data loss without the explicit user consent the checkpoint exists to obtain. `--force-reset` and `migrate reset` are already guarded. The checkpoint is placed after the confirmation and immediately before the push, which is where `MigrateReset` calls it, so a human running the command interactively sees no change. ## Scope Outside tests `canPrompt()` is `isInteractive() && !isCi()`, so the gap only affects agents whose shell has a real TTY; an agent without one never reaches the prompt. Cursor agent mode and Codex CLI, both of which `ai-safety.ts` lists as detected agents, run in the user's terminal. The new test reaches the same path through the `prompts.inject()` branch of `canPrompt()`, like the existing prompt tests in this file. ## Test hygiene `AGENTS.md` notes that the AI safety tests have to clear inherited agent markers because the test process may itself run under an agent. `DbPush.test.ts` did not, so `--accept-data-loss flag`, `unexecutable - drop allowed (--force-reset)` and both `--force-reset should succeed and display a log` tests already fail when the suite is run from an agent CLI, and this change would have added a fifth. The `beforeEach` added here reuses the `agentMatchers` env var list the same way `ai-safety.test.ts` does. `MigrateReset.test.ts` and `DbDrop.test.ts` have the same problem today (12 of their tests fail under an agent shell). That is out of scope here, but I can send it as a separate change. ## Verification - `pnpm --filter @prisma/migrate test DbPush.test.ts --runInBand`: 21 passed, 1 skipped (docker only), with the docker Postgres running - reverting the one line in `DbPush.ts` makes the new test fail, and only that test - `prettier --check` and `eslint` pass on both files; `tsc --noEmit` reports no error in them
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@prisma/adapter-pg](https://github.com/prisma/prisma) ([source](https://github.com/prisma/prisma/tree/HEAD/packages/adapter-pg)) | imports | minor | [`7.9.1` -> `7.10.0`](https://renovatebot.com/diffs/npm/@prisma%2fadapter-pg/7.9.1/7.10.0) | | [@prisma/client](https://www.prisma.io) ([source](https://github.com/prisma/prisma/tree/HEAD/packages/client)) | imports | minor | [`7.9.1` -> `7.10.0`](https://renovatebot.com/diffs/npm/@prisma%2fclient/7.9.1/7.10.0) | --- ### Release Notes <details> <summary>prisma/prisma (@​prisma/adapter-pg)</summary> ### [`v7.10.0`](https://github.com/prisma/orm/releases/tag/7.10.0) [Compare Source](prisma/orm@7.9.1...7.10.0) ##### Prisma ORM 7.10.0 Prisma ORM 7.10.0 introduces a compatibility package for running Prisma 7 alongside newer Prisma versions, secures Prisma Studio's local server, and includes fixes across Prisma Client and the PostgreSQL, MariaDB, Neon, SQLite, and Prisma Postgres Serverless adapters. ##### Highlights ##### Run Prisma 7 alongside Prisma 8 This release introduces `@prisma/prisma7`, a compatibility package that lets you retain a matching Prisma 7 CLI and configuration while installing Prisma 8 in the same project. Once 7.10.0 is released, a side-by-side installation can use: ```sh npm install --save-dev prisma@8 @prisma/prisma7@7.10.0 npm install @prisma/client@7.10.0 ``` Use `prisma` for the directly installed Prisma 8 CLI and `prisma7` for Prisma 7: ```sh npx prisma --version npx prisma7 --version npx prisma7 generate npx prisma7 migrate dev npx prisma7 db push ``` Prisma 7 now prefers version-specific configuration files, allowing its configuration to coexist with Prisma 8's `prisma.config.*` files: ```ts // prisma7.config.ts import { defineConfig } from '@prisma/prisma7/config' export default defineConfig({ schema: 'prisma/schema.prisma', migrations: { path: 'prisma/migrations', }, }) ``` Without an explicit `--config` option, Prisma 7 searches for: 1. Root-level `prisma7.config.*` files. 2. `.config/prisma7.*` files. 3. Existing `prisma.config.*` files as a backwards-compatible fallback. The supported extensions are `.js`, `.ts`, `.mjs`, `.cjs`, `.mts`, and `.cts`. An explicit config path always takes precedence: ```sh npx prisma7 generate --config ./custom/prisma7.config.ts ``` New projects initialized by the Prisma 7 CLI use `prisma7.config.ts`. Existing projects containing only `prisma.config.*` continue to work without migration or additional warnings. If a `prisma7.config.*` file exists but cannot be loaded, Prisma reports the error rather than silently falling back to another configuration. The `prisma7` identity is carried through CLI help, version output, shell completion, initialization, migration, database, and generation guidance. Stable Prisma concepts such as `schema.prisma`, Prisma Migrate, `@prisma/client`, and `PRISMA_*` environment variables remain unchanged. Together, the separate executable and configuration namespace make it possible to operate Prisma 7 and Prisma 8 side by side without command or config-file collisions. [#​29949](prisma/orm#29949), [#​29969](prisma/orm#29969), [#​29994](prisma/orm#29994), [#​30000](prisma/orm#30000), [#​30002](prisma/orm#30002), [#​30020](prisma/orm#30020) ##### Prisma Studio security hardening Prisma Studio's local HTTP server now: - Binds explicitly to `127.0.0.1` instead of all network interfaces. - Rejects browser requests from origins other than the active `localhost` or `127.0.0.1` Studio URL. - No longer returns wildcard CORS headers. - Applies the same protections across Node.js, Bun, and Deno. This prevents network clients or malicious websites from accessing Studio's database endpoints while Studio is running. [#​29890](prisma/orm#29890) ##### Prisma Client - Fixed `P2002` errors from nested writes so `meta.modelName` identifies the model where the unique constraint violation occurred, including models using `@@map` and `@@schema`. [#​29628](prisma/orm#29628) - Fixed automatically batched `findUniqueOrThrow()` calls so every missing record rejects with `P2025`; later misses no longer resolve to `undefined`. [#​29654](prisma/orm#29654) - Parameter-chunked statements are now executed atomically in a transaction and rolled back if a later chunk fails. [#​29771](prisma/orm#29771) - Improved interactive transaction cleanup during `$disconnect()`, including transactions whose driver-level startup is still in progress. [#​28768](prisma/orm#28768) - Prevented transaction cleanup failures after a timeout or backend termination from becoming unhandled promise rejections. [#​29611](prisma/orm#29611) - Fixed fluent relation queries when relation fields are literally named `select` or `include`. [#​29683](prisma/orm#29683) - Fixed handling of `Date` and `Uint8Array` values created in other JavaScript realms, such as iframes, jsdom, and Node.js `vm` contexts. [#​29177](prisma/orm#29177) - Invalid `Date` values passed to `$queryRaw` or `$executeRaw` now throw `PrismaClientValidationError` instead of a generic error. [#​29718](prisma/orm#29718) - Fixed `moduleFormat` inference for the `prisma-client` generator in TypeScript projects using `module: "node16"` or `"nodenext"`. Generated output now follows the nearest `package.json` `type`, defaulting to CommonJS when absent. [#​29712](prisma/orm#29712) - Deserialized `Bytes` values now own standalone `ArrayBuffer`s rather than exposing unrelated contents from Node.js's shared `Buffer` pool. This applies to both regular and raw query results. [#​29701](prisma/orm#29701) - Fixed an incorrect logging context in the remote executor, including Accelerate-backed query execution. [#​28892](prisma/orm#28892) ##### Client extensions and observability - Result-extension `compute` callbacks now receive the current model name as a typed second argument: ```ts compute(data, modelName) { // ... } ``` The model name is also preserved when multiple extensions compose the same computed field. [#​29782](prisma/orm#29782) - Improved OpenTelemetry context for remotely executed queries: - `$on('query')` callbacks run within the matching `db_query` span. - Events from one operation share the same trace. - Error events are recorded as span exceptions. - Log events continue to be emitted when tracing is disabled or their reported span is unavailable. [#​28892](prisma/orm#28892) ##### Driver adapters ##### MariaDB - `@prisma/adapter-mariadb` now accepts an existing `mariadb` pool. External pools remain caller-owned unless `disposeExternalPool: true` is supplied. [#​27992](prisma/orm#27992) - Fixed pooled connection leaks during commit, rollback, and failed transaction startup. Connections are now returned with `release()` and transaction-specific listeners are removed before reuse. [#​29612](prisma/orm#29612) - Added support for bracketed IPv6 addresses in both `mysql://` and `mariadb://` connection strings. [#​29026](prisma/orm#29026) - Prevented malformed connection strings from exposing embedded passwords in retained debug output and diagnostic reports. [#​27992](prisma/orm#27992) ##### PostgreSQL, Neon, and Prisma Postgres Serverless - PostgreSQL deadlocks using SQLSTATE `40P01` are now reported as `P2034` transaction write conflicts. [#​29717](prisma/orm#29717) - PostgreSQL `RESTRICT` violations using SQLSTATE `23001` are now reported as `P2003`, preserving an available field or constraint name. [#​29554](prisma/orm#29554) - `@prisma/adapter-pg` now preserves database constraint names when reporting unique constraint violations through `P2002`. [#​29587](prisma/orm#29587) - Prisma Postgres Serverless now prefers the named constraint for `P2002`, falling back to parsed field names when no constraint name is available. [#​29801](prisma/orm#29801) - Fixed Neon HTTP adapter serialization for typed parameters such as `Bytes` and `DateTime`. [#​29747](prisma/orm#29747) ##### SQLite - `@prisma/adapter-better-sqlite3` now converts previously unhandled SQLite result codes into typed database errors instead of exposing raw driver errors. - The complete `SQLITE_BUSY` family is now mapped to socket timeout errors, with numeric extended result codes preserved where available. [#​29794](prisma/orm#29794) ##### CLI and Migrate - `prisma generate` can now offer to install Prisma's agent skills. The opt-in prompt: - Is shown at most once per machine. - Is skipped in CI, containers, Git hooks, npm lifecycle scripts, and watch mode. - Is skipped when `--no-hints` is used or Prisma skills are already installed. - Times out after 30 seconds. - Never causes generation to fail if installation is unsuccessful. [#​29690](prisma/orm#29690) - A globally installed CLI now warns during `prisma generate` when its version differs from the project's local `prisma` or `@prisma/client`, and recommends running the local CLI. The check is best-effort and does not fail generation. [#​29593](prisma/orm#29593) - `prisma version` and `prisma version --json` now include the resolved Prisma CLI package path, making global-versus-local installation issues easier to diagnose. [#​29573](prisma/orm#29573) - Empty or generator-only schema files now report `Schema must contain a datasource block` from `db pull`, `db push`, and `migrate dev`, rather than reaching the schema engine and potentially producing inconsistent errors. [#​29657](prisma/orm#29657) - CLI commands now tolerate corrupt, unreadable, or unwritable command-state files. Invalid state is reinitialized, writes are atomic, and persistence failures fall back to in-memory state. [#​29609](prisma/orm#29609) - Studio now recognizes semicolon-delimited `sqlserver://` connection strings before reporting the existing explicit message that SQL Server is not supported by Studio. [#​29623](prisma/orm#29623) - The AI-agent safety checkpoint now also covers interactive `prisma db push` confirmations involving data-loss warnings, rather than only invocations using `--accept-data-loss`. [#​29793](prisma/orm#29793) ##### Performance and reliability - Optimized query-plan execution by eagerly evaluating plans with one unconditional database operation and synchronously interpreting the remaining pure plan. Cached plans remain immutable. [#​29004](prisma/orm#29004) - Prevented call-stack overflows when rendering very large parameter lists or combining chunked results containing hundreds of thousands of rows. [#​29751](prisma/orm#29751) - Reduced ordinary query setup overhead by constructing fluent-relation field maps lazily and in linear time. Non-fluent queries no longer build this map. [#​29752](prisma/orm#29752) ##### Dependencies - Updated the transitive `fast-uri` dependency to a patched release addressing production audit advisories affecting versions through `3.1.3`. [#​29758](prisma/orm#29758) </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4zMC4zIiwidXBkYXRlZEluVmVyIjoiNDQuMzAuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==--> Reviewed-on: https://git.oirnoir.dev/OIRNOIR/YouTube-Helper-Server/pulls/41
Summary
aiAgentConfirmationCheckpoint()before the forced push that follows the interactive data loss confirmation inprisma db pushDbPush.test.ts, so the suite is stable when it runs under an AI agentWhy
db pushreachesmigrate.push({ force: true })through two routes:--accept-data-loss, which goes through the AI safety checkpoint (added in fix(migrate): guard db push data loss for AI agents #29713)Both apply the same destructive schema change. An agent that runs with a TTY attached answers the confirmation prompt itself, so on that route it can opt into data loss without the explicit user consent the checkpoint exists to obtain.
--force-resetandmigrate resetare already guarded.The checkpoint is placed after the confirmation and immediately before the push, which is where
MigrateResetcalls it, so a human running the command interactively sees no change.Scope
Outside tests
canPrompt()isisInteractive() && !isCi(), so the gap only affects agents whose shell has a real TTY; an agent without one never reaches the prompt. Cursor agent mode and Codex CLI, both of whichai-safety.tslists as detected agents, run in the user's terminal. The new test reaches the same path through theprompts.inject()branch ofcanPrompt(), like the existing prompt tests in this file.Test hygiene
AGENTS.mdnotes that the AI safety tests have to clear inherited agent markers because the test process may itself run under an agent.DbPush.test.tsdid not, so--accept-data-loss flag,unexecutable - drop allowed (--force-reset)and both--force-reset should succeed and display a logtests already fail when the suite is run from an agent CLI, and this change would have added a fifth. ThebeforeEachadded here reuses theagentMatchersenv var list the same wayai-safety.test.tsdoes.MigrateReset.test.tsandDbDrop.test.tshave the same problem today (12 of their tests fail under an agent shell). That is out of scope here, but I can send it as a separate change.Verification
pnpm --filter @prisma/migrate test DbPush.test.ts --runInBand: 21 passed, 1 skipped (docker only), with the docker Postgres runningDbPush.tsmakes the new test fail, and only that testprettier --checkandeslintpass on both files;tsc --noEmitreports no error in them