paperclipai/paperclip · error · Error
Plugin migration ${migrationKey} is empty
Error message
Plugin migration ${migrationKey} is empty What it means
Sanity guard in applyWithClient: the SQL migration file read from disk is empty after trimming. Empty migrations would create a misleading ledger row and checksum baseline, so they are rejected; the empty .sql file is at fault.
Source
Thrown at server/src/services/plugin-database.ts:500
const content = await readFile(path.join(migrationDir, migrationKey), "utf8");
const checksum = createHash("sha256").update(content).digest("hex");
const existingRows = await client
.select()
.from(pluginMigrations)
.where(and(eq(pluginMigrations.pluginId, pluginId), eq(pluginMigrations.migrationKey, migrationKey)))
.limit(1);
const existing = existingRows[0] as PluginMigrationRecord | undefined;
if (existing?.status === "applied") {
if (existing.checksum !== checksum) {
throw new Error(`Plugin migration checksum mismatch for ${migrationKey}`);
}
continue;
}
const statements = splitSqlStatements(content);
try {
if (statements.length === 0) {
throw new Error(`Plugin migration ${migrationKey} is empty`);
}
for (const statement of statements) {
validatePluginMigrationStatement(statement, namespace.namespaceName, coreReadTables);
await client.execute(sql.raw(statement));
}
await client
.insert(pluginMigrations)
.values({
pluginId,
pluginKey: manifest.id,
namespaceName: namespace.namespaceName,
migrationKey,
checksum,
pluginVersion: manifest.version,
status: "applied",
appliedAt: new Date(),
})
.onConflictDoUpdate({View on GitHub (pinned to 120ae5428f)
Solutions
- Add statements to the empty plugin migration, or remove the empty migration file.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at server/src/services/plugin-database.ts:500 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of paperclipai/paperclip@120ae5428f (2026-08-18).
Data as JSON: /api/errors/520454278188053a.
Report an issue: GitHub.