Skip to content

fix(core): remove FTS5 integrity-check to prevent D1 shadow table corruption#313

Merged
ascorbic merged 5 commits intoemdash-cms:mainfrom
mvanhorn:fix/252-fts5-d1-integrity-check
Apr 7, 2026
Merged

fix(core): remove FTS5 integrity-check to prevent D1 shadow table corruption#313
ascorbic merged 5 commits intoemdash-cms:mainfrom
mvanhorn:fix/252-fts5-d1-integrity-check

Conversation

@mvanhorn
Copy link
Copy Markdown
Contributor

@mvanhorn mvanhorn commented Apr 6, 2026

What does this PR do?

Removes the FTS5 integrity-check INSERT from verifyAndRepairIndex() in packages/core/src/search/fts-manager.ts. This command corrupts D1's FTS5 shadow tables on every Worker cold start, causing all content publishing to fail with SQLITE_CORRUPT_VTAB.

The row-count mismatch check (Check 1) is retained -- it catches the most common corruption case without triggering D1's shadow table bug.

Closes #252

Type of change

  • Bug fix
  • Feature (requires approved Discussion)
  • Refactor (no behavior change)
  • Documentation
  • Performance improvement
  • Tests
  • Chore (dependencies, CI, tooling)

Checklist

  • I have read CONTRIBUTING.md
  • pnpm typecheck passes
  • pnpm --silent lint:json | jq '.diagnostics | length' returns 0
  • pnpm test passes (or targeted tests for my change)
  • pnpm format has been run
  • I have added/updated tests for my changes (if applicable)
  • I have added a changeset (if this PR changes a published package)
  • New features link to an approved Discussion: https://github.com/emdash-cms/emdash/discussions/...

AI-generated code disclosure

  • This PR includes AI-generated code

Details

The root cause is at fts-manager.ts:407:

INSERT INTO "ftsTable"("ftsTable") VALUES('integrity-check')

This FTS5 command is safe on standard SQLite but corrupts D1's shadow tables. Once corrupted, every content UPDATE fires FTS triggers that fail with SQLITE_CORRUPT_VTAB, blocking all publishing across all collections.

The fix removes the integrity-check entirely. The row-count mismatch check already handles the primary corruption case (count drift between content and FTS tables). The integrity-check was meant to catch subtle shadow table inconsistencies, but on D1 it causes the very corruption it was designed to detect.

Note: 3 pre-existing auth test failures on main (invite, magic-link, signup URL assertions) are unrelated to this change.

This contribution was developed with AI assistance (Codex).

mvanhorn added 2 commits April 6, 2026 07:38
…ruption

The FTS5 integrity-check INSERT corrupts D1's shadow tables even when
they are healthy, causing SQLITE_CORRUPT_VTAB on all content publishing.
Row-count mismatch detection is retained as a safe alternative.

Fixes emdash-cms#252

This contribution was developed with AI assistance (Codex).
@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Apr 6, 2026

🦋 Changeset detected

Latest commit: 590a264

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 9 packages
Name Type
emdash Patch
@emdash-cms/cloudflare Patch
@emdash-cms/plugin-ai-moderation Patch
@emdash-cms/plugin-atproto Patch
@emdash-cms/plugin-audit-log Patch
@emdash-cms/plugin-color Patch
@emdash-cms/plugin-embeds Patch
@emdash-cms/plugin-forms Patch
@emdash-cms/plugin-webhook-notifier Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@ascorbic ascorbic requested a review from Copilot April 7, 2026 22:23
@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new bot commented Apr 7, 2026

Open in StackBlitz

@emdash-cms/admin

npm i https://pkg.pr.new/@emdash-cms/admin@313

@emdash-cms/auth

npm i https://pkg.pr.new/@emdash-cms/auth@313

@emdash-cms/blocks

npm i https://pkg.pr.new/@emdash-cms/blocks@313

@emdash-cms/cloudflare

npm i https://pkg.pr.new/@emdash-cms/cloudflare@313

emdash

npm i https://pkg.pr.new/emdash@313

create-emdash

npm i https://pkg.pr.new/create-emdash@313

@emdash-cms/gutenberg-to-portable-text

npm i https://pkg.pr.new/@emdash-cms/gutenberg-to-portable-text@313

@emdash-cms/x402

npm i https://pkg.pr.new/@emdash-cms/x402@313

@emdash-cms/plugin-ai-moderation

npm i https://pkg.pr.new/@emdash-cms/plugin-ai-moderation@313

@emdash-cms/plugin-atproto

npm i https://pkg.pr.new/@emdash-cms/plugin-atproto@313

@emdash-cms/plugin-audit-log

npm i https://pkg.pr.new/@emdash-cms/plugin-audit-log@313

@emdash-cms/plugin-color

npm i https://pkg.pr.new/@emdash-cms/plugin-color@313

@emdash-cms/plugin-embeds

npm i https://pkg.pr.new/@emdash-cms/plugin-embeds@313

@emdash-cms/plugin-forms

npm i https://pkg.pr.new/@emdash-cms/plugin-forms@313

@emdash-cms/plugin-webhook-notifier

npm i https://pkg.pr.new/@emdash-cms/plugin-webhook-notifier@313

commit: 590a264

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Removes the FTS5 integrity-check call from startup-time index verification to avoid triggering Cloudflare D1 FTS5 shadow-table corruption, while keeping the row-count drift check to rebuild obviously inconsistent indexes.

Changes:

  • Remove FTS5 integrity-check execution from FTSManager.verifyAndRepairIndex().
  • Update inline/docs comments to reflect the reduced verification strategy and D1-specific risk.
  • Add a patch changeset for the emdash package.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

File Description
packages/core/src/search/fts-manager.ts Stops running FTS5 integrity-check during verification to prevent D1 shadow-table corruption; keeps row-count mismatch rebuild.
.changeset/fix-fts5-d1-integrity.md Adds a patch changeset describing the D1-related fix.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Copy Markdown
Collaborator

@ascorbic ascorbic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@ascorbic ascorbic enabled auto-merge (squash) April 7, 2026 22:26
@ascorbic ascorbic merged commit 1bcfc50 into emdash-cms:main Apr 7, 2026
25 checks passed
@emdashbot emdashbot bot mentioned this pull request Apr 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

FTS5 integrity-check corrupts D1 shadow tables — publish fails with SQLITE_CORRUPT_VTAB on all collections

3 participants