87 revisions narrating this project's build-out become one file that
creates the schema in a single step. They cost nothing at runtime — all
86 upgrade steps ran in 0.2s (note #3260) — so this is a presentation
change, not a performance one: a new installer should not inherit our
development history to stand up a database.
Deleted: 87 revisions (6,052 lines), the 10 tests/test_migration_*.py
files (483 lines) that asserted intermediate states and backfills which
no longer exist, and backend/app/utils/artist_backfill.py — the only
live module a migration imported, with no other consumer anywhere. That
last one satisfies the operator's separate request to inline it into
0008 and delete the module; the squash removes both outright.
THE REVISION ID IS "0087", NOT "0001", ON PURPOSE. It is the id of the
last revision collapsed, so an existing database is already at head and
`alembic upgrade head` does nothing. The alternative is `alembic stamp`
against live data, and stamp validates NOTHING — it writes a version
string whether or not the schema matches, so a wrong baseline surfaces
later, via the next real migration, with no clean way back. This removes
that operation rather than making it safe. Future revisions run from
0088.
Four things are hand-written because SQLAlchemy metadata does not carry
them, and none fail at generation time:
1. CREATE EXTENSION vector — the VECTOR columns cannot be
created without it, so it is ordered first in upgrade().
2. CREATE EXTENSION tsm_system_rows — surfaces only when the random
sample query runs.
3. the HNSW index on image_record.siglip_embedding, raw SQL because
create_index cannot express USING hnsw (... vector_cosine_ops).
The quietest of the four: everything works, similarity search just
stops using an index.
4. import pgvector.sqlalchemy.vector — autogenerate EMITS
pgvector.sqlalchemy.vector.VECTOR references without importing it,
so the generated file dies with NameError on first run.
The candidate came out of CI (run 4967) as checksummed base64 rather
than a plain cat, because run 4964's cat was truncated mid-line inside a
column definition with the step still green — 29 tables instead of 42,
and it looked entirely plausible. Verified here: 56,582 bytes,
sha256 471acfca69c0…, 42 tables, 66 indexes, 42 drops.
NOT YET PROVEN against the old chain. baseline.yml does that, and it is
step 2's gate; this commit does not claim the schemas match.