{"record":{"id":"499bcb3daa3d0501","repo":"paperclipai/paperclip","slug":"authenticated-public-deployments-require-database-499bcb","errorCode":null,"errorMessage":"authenticated public deployments require DATABASE_URL to be a postgres/postgresql connection string","messagePattern":"authenticated public deployments require DATABASE_URL to be a postgres/postgresql connection string","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"server/src/index.ts","lineNumber":271,"sourceCode":"      prompt.close();\n    }\n  }\n  \n  type EnsureMigrationsOptions = {\n    autoApply?: boolean;\n  };\n  \n  async function ensureMigrations(\n    connectionString: string,\n    label: string,\n    opts?: EnsureMigrationsOptions,\n  ): Promise<MigrationSummary> {\n    const autoApply = opts?.autoApply === true;\n    let state = await inspectMigrations(connectionString);\n    if (state.status === \"needsMigrations\" && state.reason === \"pending-migrations\") {\n      const repair = await reconcilePendingMigrationHistory(connectionString);\n      if (repair.repairedMigrations.length > 0) {\n        logger.warn(\n          { repairedMigrations: repair.repairedMigrations },\n          `${label} had drifted migration history; repaired migration journal entries from existing schema state.`,\n        );\n        state = await inspectMigrations(connectionString);\n        if (state.status === \"upToDate\") return \"already applied\";\n      }\n    }\n    if (state.status === \"upToDate\") return \"already applied\";\n    if (state.status === \"needsMigrations\" && state.reason === \"no-migration-journal-non-empty-db\") {\n      logger.warn(\n        { tableCount: state.tableCount },\n        `${label} has existing tables but no migration journal. Run migrations manually to sync schema.`,\n      );\n      const apply = autoApply ? true : await promptApplyMigrations(state.pendingMigrations);\n      if (!apply) {\n        throw new Error(\n          `${label} has pending migrations (${formatPendingMigrationSummary(state.pendingMigrations)}). ` +\n            \"Refusing to start against a stale schema. Run pnpm db:migrate or set PAPERCLIP_MIGRATION_AUTO_APPLY=true.\",","sourceCodeStart":253,"sourceCodeEnd":289,"githubUrl":"https://github.com/paperclipai/paperclip/blob/3f1d897a7c018d76563a21c6e39c3c9b03933622/server/src/index.ts#L253-L289","documentation":"Deployment contract guard in assertCloudDatabaseContract: DATABASE_URL is set for an authenticated public deployment, but its URL scheme is not postgres: or postgresql: (isPostgresConnectionString returned false — unparseable URL or another scheme). Cloud deployments require a real PostgreSQL connection string, so startup aborts.","triggerScenarios":"Thrown at server/src/index.ts:260 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Use a postgres:// or postgresql:// connection string for DATABASE_URL."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"3f1d897a7c018d76563a21c6e39c3c9b03933622","analyzedAt":"2026-08-18T22:49:45.177Z","contentChangedAt":"2026-08-18T22:49:45.177Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}