0042084d17
BLOCKER B1: the fts config swap no longer blindly DROP+ADDs the generated column. swapEmbeddingsFtsConfig now (1) reads the column's actual generation expression from pg_catalog and TRUE-no-ops when it already references the target config (real out-of-band escape hatch), and (2) gates the inline ACCESS EXCLUSIVE rewrite behind SEARCH_EMBEDDINGS_FTS_INLINE_REWRITE (default 'true'; only a literal 'false' opts out), warning that the operator owns the swap. up() now creates ru_en only when missing (drop-recreate would fail on the fts hard dependency on a re-run), so up() is genuinely idempotent. down() guards the config DROP when fts still references ru_en (gated-off path), staying non-fatal. W2: corrected the header — Kysely runs EACH migration in its own transaction (not the whole set in ONE); the single-UPDATE atomicity conclusion is unchanged. Rewrote the runbook: inline path is a full-table ACCESS EXCLUSIVE rewrite of page_embeddings; removed the false "IF-EXISTS no-op" claim. Extends the roundtrip test with idempotent-skip (2nd up() no-op) and env-gate =false (embeddings rewrite skipped, pages.tsv still swapped) assertions. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>