The legacy pkg/persistence/migrations (DBMigration / dbmXXX) system now coexists with Alembic but accepts no new migrations — all new schema changes go through Alembic. - remove dbm026_llm_model_context_length (superseded by Alembic 0005_add_llm_context_length, which makes the identical change) - cap required_database_version at 25 (legacy chain dbm001-025 kept read-only to upgrade pre-existing 3.x DBs to the Alembic baseline) - add migrations/README.md documenting the freeze - document the Alembic-only policy and revision-id/idempotency rules in AGENTS.md
1.6 KiB
Legacy migrations (DEPRECATED — do not add new files here)
This directory holds the legacy 3.x database migration system
(DBMigration subclasses in dbmXXX_*.py, registered via
@migration.migration_class(N) and run from pkg/persistence/mgr.py).
This system is frozen. Do not add new dbmXXX_*.py migrations.
The chain is capped at version 25 (required_database_version = 25 in
pkg/utils/constants.py). These files exist only to upgrade pre-existing
3.x databases up to the Alembic baseline (0001_baseline). Removing them
would break in-place upgrades from old installations, so they are kept
read-only.
All new schema changes use Alembic
Migrations now live in pkg/persistence/alembic/versions/. To create one:
uv run python -m langbot.pkg.persistence.alembic_runner autogenerate "description of your change"
(requires data/config.yaml to exist). Review and edit the generated
script before committing — Alembic migrations run automatically on startup
and must be idempotent and guard against missing tables (the test suite
runs them against empty databases).
Rules for Alembic revision ids
- Keep the revision id ≤ 32 characters — PostgreSQL stores
alembic_version.version_numasvarchar(32)and will raiseStringDataRightTruncationErroron overflow. - Guard every
opcall against a missing table / missing column (inspector.get_table_names()/inspector.get_columns()); fresh installs create the schema viacreate_all()and stamp the baseline, so migrations may run against tables that already match or do not exist.