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

  1. Remove the remove_home key from the present-state user entry
  2. If you actually want the user deleted (with home cleanup), set state = "absent" and keep remove_home
  3. 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

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


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)