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
- Mark the owning user Present (or drop its Absent declaration)
- Reassign the resource's owner to an existing Present user
- 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
- Before retiring a user account, grep for it as an owner across all resource definitions
- Use a single source of truth for account state so all layers agree
- Prefer group-based ownership over individual service accounts where possible
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
- bootstrap resource ' ' requires group ' ', but that group…
- present bootstrap user
- present bootstrap user
- failed with
- absent bootstrap group
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)