Feature lifecycle
A feature is not just a Python module. It has an explicit lifecycle that spans configuration, installation, database evolution, and runtime activation.
(absent) → [cached] → [declared] → [installed] → [migrated] → [active] ⇄ [disabled]
- States — what each state means and how to reach it
- State guards — blocked operations and automatic transitions
- Signals — signal-based decoupling between features
- Manifest —
splent.manifest.jsontracking and cleanup
State transitions are triggered by CLI commands, startup scripts, and the Flask application factory. The current state is persisted in splent.manifest.json.
Lifecycle layers
| Layer | States | System | Who updates manifest |
|---|---|---|---|
| Configuration | declared | pyproject.toml + symlinks |
feature:add, feature:attach, product:resolve |
| Environment | installed | Python environment, pip | 00_install_features.sh |
| Persistence | migrated | Database schema (Alembic) | db:upgrade, db:migrate |
| Runtime | active, disabled | Flask app, blueprints | FeatureManager.register_features() |