Recorded synthetic example · SQLite 3.50.4
An update succeeds. Search loses the article.
A migration removes an external-content FTS5 update trigger. The following write succeeds, but a search for the new word returns one result before migration and none afterward.
- Inspect the broken migration · Report JSON
Search hits: 1 → 0. Exit 1: a declared behavior changed.
- Inspect the repaired migration · Report JSON
Search hits: 1 → 1. Exit 0: the declared workloads match.
- Inspect the unchanged control · Report JSON
Search hits: 1 → 1. Exit 0: the declared workloads match.
General integrity and foreign-key checks passed in all three runs. SQLite also provides a dedicated FTS5 index/content consistency check; Keepstep does not automatically run it.
Reproduce locally
Use Python 3.11+ with built-in FTS5 and Git. The example creates synthetic data in a new directory and checks the broken, repaired and unchanged results. No package installation is needed.
git clone https://github.com/nazeeh111/SchemaRehearsal.git
cd SchemaRehearsal
git checkout c303e9b4d00e5fa274ebd1a2f7eb811d2cb005d7
python3 examples/quickstart.py --fts5 search-demo
Open search-demo/broken/report.html. To examine your own migration, write a workload suite for the local CLI.
What these reports establish
These are static reports from the included synthetic articles, generated from source revision c303e9b4. Each scenario uses fresh before/after copies. The JSON files retain input hashes and the recorded SQLite version.
Keepstep compares only declared workloads. A match is not a guarantee about other queries, database versions or production concurrency. A few direct SQL assertions may be simpler for a single query. The walkthrough explains the example and SQLite's full consistency check.
Development and this presentation used AI assistance.