jdx/mise · error
present bootstrap user
Error message
present bootstrap user '{name}' must not set remove_home What it means
remove_home is only meaningful when deleting a user (state = "absent"): it controls whether the home directory is removed along with the account. Specifying it on a user with state = "present" is contradictory — you cannot remove the home of a user you are creating/keeping — so from_toml rejects the combination eagerly.
Solutions
- Remove the remove_home key from the present-state user entry
- If you actually want the user deleted (with home cleanup), set state = "absent" and keep remove_home
- Split into two config variants if you need both lifecycle states
Example fix
# before
[bootstrap.users]
app = { state = "present", group = "app", remove_home = true }
# after
[bootstrap.users]
app = { state = "present", group = "app" } Defensive patterns
Strategy: validation
Validate before calling
# fail fast if any present bootstrap user sets remove_home
tomlq -r '.bootstrap.users | to_entries[] | select((.value.state // "present") == "present") | select(has("remove_home")) | .key' mise.toml Prevention
- Only set remove_home on state = "absent" user entries
- When flipping absent→present, remove lifecycle-cleanup fields in the same edit
- Keep present and absent user stanzas as separate templates rather than one merged block
- Run `mise bootstrap plan` after any state flip to validate the config
When it happens
Trigger: [bootstrap.users] entry with state = "present" and remove_home = true; flipping a user entry from absent to present without removing remove_home; generated configs that always emit remove_home regardless of state.
Common situations: Toggling a user's state while cleaning up a config; copy-paste from an absent-user example; templating that merges all possible fields into one stanza.
Understand the failure class
Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.
Related errors
- present bootstrap user
- absent bootstrap group
- absent bootstrap user
- bootstrap resource ' ' requires owner ' ', but that user is…
- bootstrap user ' ' sets exclusive_groups without groups
AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17).
Data as JSON: /api/errors/b26e600f9a033afc.
Report an issue: GitHub.
Appendix: source
Thrown at src/system/accounts.rs:336
ResourceAction::Update => Ok(Some(AccountAction::UpdateGroup {
name: self.name.clone(),
gid: self.gid.expect("group update requires a desired gid"),
})),
ResourceAction::Remove => Ok(Some(AccountAction::RemoveGroup {
name: self.name.clone(),
})),
}
}
}
impl UserRequest {
fn from_toml(name: String, config: UserTomlConfig) -> Result<Self> {
validate_name("user", &name)?;
if config.state == AccountState::Present && config.group.is_none() {
bail!("present bootstrap user '{name}' requires a primary group");
}
if config.state == AccountState::Present && config.remove_home {
bail!("present bootstrap user '{name}' must not set remove_home");
}
if config.state == AccountState::Absent
&& (config.uid.is_some()
|| config.group.is_some()
|| config.groups.is_some()
|| config.exclusive_groups
|| config.home.is_some()
|| config.shell.is_some()
|| config.comment.is_some()
|| config.system
|| config.create_home.is_some()
|| config.move_home)
{
bail!("absent bootstrap user '{name}' may only set state and remove_home");
}
if config.exclusive_groups && config.groups.is_none() {
bail!("bootstrap user '{name}' sets exclusive_groups without groups");
}View on GitHub (pinned to 533346cc37)