feature:status
Table of contents
- Introduction
- Reading the states
- Checking the state against reality
- Fixing what the check finds
- Seeing the history
- Reference
- Requirements
- See also
Introduction
feature:status shows where each feature of the selected product is in its lifecycle, from declared to active. It reads splent.manifest.json, and it can check that state against what is really on disk and in the container. Run it when a feature does not show up in the app.
splent feature:status
Feature status — my_first_app
──────────────────────────────────────────────────────────────────
Feature Mode Progress State
─────────────────────────────────────────────────────────────────────────
splent_io/splent_feature_auth@v1.2.0 pinned ●─●─●─● active
splent_io/splent_feature_mailer@v1.3.2 pinned ●─●─○─○ installed
splent_io/splent_feature_notes editable ●─●─●─● active
─────────────────────────────────────────────────────────────────────────
Progress: declared → installed → migrated → active
Modes: pinned = versioned release editable = local development
Last updated: 2026-10-31T09:50:45+00:00
Mode is pinned, a release from the cache, or editable, a copy at the workspace root. Progress has one dot per state reached, and a feature without migrations leaves the third one empty.
Reading the states
| State | Means | What moves it on |
|---|---|---|
declared |
In pyproject.toml and linked |
The product’s start installs it |
installed |
Installed and importable | db:upgrade applies its migrations |
migrated |
Its tables exist | The app registers it at start |
active |
Running in the app | |
disabled |
Installed and turned off at runtime |
A fully rolled back feature goes back to installed. Only the features your pyproject.toml declares are listed, and product:resolve drops the rest from the manifest. The whole state machine is in Feature lifecycle.
Checking the state against reality
splent feature:status --integrity
splent_feature_mailer
[✔] Symlink: OK
[✖] pip: not pip-installed
4 passed, 1 failed.
Each feature gets up to three checks. Symlink checks its link under features/ resolves. pip checks the package is installed in the web container, at the pinned version, from installed on. Migrations checks a migrated or active feature has migration files, without reading the database.
A declared feature still at an older version passes, as right after feature:upgrade, with the hint to run splent product:restart. With the web container stopped, every pip line reads not verified.
Fixing what the check finds
splent feature:status --fix
Fixing pip → installing splent_feature_mailer...
✔ pip install fixed (restart the app or let the reloader pick it up).
--fix runs the check, restores a missing symlink with product:resolve and installs a missing package with pip install -e in the web container. In production nothing is installed, since the image carries its features. Rebuild it with splent product:derive --prod.
Seeing the history
splent feature:status --timeline
09:00:12 ┬─○ notes declared
└─○ mailer declared
│
09:00:30 ──◐ notes installed
│
NOW ──● 2 feature(s) notes, mailer
Every transition is drawn, oldest first, and transitions in the same second share a timestamp. --json prints the raw manifest instead, described in Feature state.
Reference
| Option | Description |
|---|---|
--integrity |
Check the manifest against the links, the packages and the migrations |
--fix |
Repair a missing link or package. Implies --integrity |
--timeline |
Draw the lifecycle transitions |
--json |
Print the raw manifest |
| Message | What to do |
|---|---|
splent.manifest.json not found |
Every feature shows as declared. Start the product |
<n> stale entries hidden |
Run splent product:resolve |
pip: installed <x>, product pins <y> |
Run splent product:restart |
pip: not verified, ... is not running |
Start the product with splent product:up --dev |
Pinned snapshot <name>@<version> not found |
Run splent product:resolve to fetch it |
Requirements
- A selected product (
SPLENT_APP). - For the pip check and its fix, the product running.
See also
- Feature lifecycle explains the state machine.
product:resolvesyncs the features and drops stale entries.