jdx/mise · error

bootstrap resource ' ' requires owner ' ', but that user is…

Error message

bootstrap resource '{resource}' requires owner '{owner}', but that user is absent

What it means

A resource declares an owner account, and account planning resolved that user to AccountState::Absent. A resource cannot be owned by a user the plan will remove or never create, so add_account_dependencies (called from plan) bails instead of wiring a dependency to a nonexistent user resource.

Solutions

  1. Mark the owning user Present (or drop its Absent declaration)
  2. Reassign the resource's owner to an existing Present user
  3. Remove the owner field if default ownership is acceptable

Example fix

// before
user("svc-old", state: "absent")
resource(owner: "svc-old")
// after
resource(owner: "svc-new")
Defensive patterns

Strategy: validation

Validate before calling

const users = new Map(accountResources.filter(r => r.kind === 'user').map(r => [r.name, r.state]));
for (const res of resources) if (res.owner && users.get(res.owner) === 'absent') throw new Error(`${res.id}: owner ${res.owner} is declared absent`);

Type guard

function ownerExists(res, users) { return !res.owner || users.get(res.owner) === 'present'; }

Try / catch

try { plan = planner.plan(); } catch (e) { if (String(e).includes('requires owner') && e.message.includes('is absent')) { reassignOwner(config); } else throw e; }

Prevention

When it happens

Trigger: Calling plan with any bootstrap resource (directory, file, compose project) whose owner is set to a username for which a user resource exists but is declared Absent.

Common situations: Retiring a service account while forgetting resources still owned by it; a config layer marks a user absent while another layer's resources reference it as owner; renaming a user without updating owner fields.

Understand the failure class

Background: "User not found", "Invalid user", and "does not exist": what missing-user lookup errors mean across Rocket.Chat, LiteLLM, Phabricator, rustfs, and pnpm — this error's family across 10 libraries.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/a9b2ae5fac9b1dae. Report an issue: GitHub.

Appendix: source

Thrown at src/system/resources.rs:713

fn add_account_dependencies(
    plan: &mut BootstrapPlan,
    resource: &ResourceId,
    state: super::managed_files::ManagedState,
    owner: Option<&str>,
    group: Option<&str>,
    user_states: &HashMap<String, super::accounts::AccountState>,
    group_states: &HashMap<String, super::accounts::AccountState>,
) -> Result<()> {
    if state != super::managed_files::ManagedState::Present {
        return Ok(());
    }
    if let Some(owner) = owner {
        match user_states.get(owner) {
            Some(super::accounts::AccountState::Present) => {
                plan.add_dependency(resource, ResourceId::new("user", owner))?;
            }
            Some(super::accounts::AccountState::Absent) => bail!(
                "bootstrap resource '{resource}' requires owner '{owner}', but that user is absent"
            ),
            None => {}
        }
    }
    if let Some(group) = group {
        match group_states.get(group) {
            Some(super::accounts::AccountState::Present) => {
                plan.add_dependency(resource, ResourceId::new("group", group))?;
            }
            Some(super::accounts::AccountState::Absent) => bail!(
                "bootstrap resource '{resource}' requires group '{group}', but that group is absent"
            ),
            None => {}
        }
    }
    Ok(())
}

View on GitHub (pinned to 533346cc37)