State guards
The lifecycle module enforces valid transitions, blocking destructive operations on features that have applied migrations or are active.
Table of contents
Blocked operations
| Command | Blocked in state | Guidance |
|---|---|---|
feature:remove |
migrated, active | Run db:rollback <feature> first |
feature:detach |
migrated, active | Run db:rollback <feature> first |
feature:unlock |
migrated, active | Run db:rollback <feature> first |
feature:upgrade |
migrated, active | Run db:rollback <feature> first |
All blocked commands accept --force to bypass the check.
Automatic transitions
These happen without manual intervention:
| Trigger | Transition | Where |
|---|---|---|
pip install -e succeeds |
declared → installed | 00_install_features.sh |
splent db:upgrade succeeds |
installed → migrated | db:upgrade, db:migrate, db:reset |
| Flask loads feature | migrated → active | FeatureManager.register_features() |
splent db:rollback (full) |
migrated → installed | db:rollback |
splent product:resolve |
(new entries) → declared | product:resolve |