Performance rules: indexing and query health
Redundant indexes, boolean-led indexes, B-tree where GIN belongs, foreign keys losing their covering index, index pile-up on hot tables. Advisory notes that never block unless your policy says so.
The BP family is for migrations that work and then quietly slow you down. Redundant indexes covered by a wider prefix, indexes led by a boolean or near-constant column, B-tree on jsonb, array or tsvector columns, DROP INDEX removing the only index covering a foreign key, one more index on a table already carrying many, composite indexes led by a range column, partial or expression indexes the migration’s own queries cannot use, backfills filtering a large table on unindexed columns, statistics disabled, autovacuum scale factors raised past usefulness, and DROP INDEX on an index the planner is demonstrably using.
They are notes. A note never fails CI unless the team policy says so — the family exists to be read in the PR comment, not to block a merge.
Evidence, not guesses
Several BP rules only fire at all with a live snapshot: index usage counts, table sizes and hot-table traffic come from the catalogs. Three read the migration’s own UPDATE, DELETE and INSERT … SELECT clauses as evidence — never guessing at application queries. No query in the file, no finding.
The CLI is open source and needs no account: npx bolvrk check migration.sql