I guess my explanation was not really clear.
A feature is required or not as the result of a user action:
"features:install" will flag the feature as "required" and
"features:uninstall" will unflag it.
A feature becomes installed or uninstalled as the result of a
FeaturesService's resolution. As a
Thanks Guillaume for the explanation.
I will say that this is very confusing beyond the error message displayed
since a feature can still be "not required" and yet be reported as installed
via the isInstall() or listInstalledFeatures().
In addition, calling uninstallFeature() does more than simpl