jdx/mise · error

bootstrap resource ' ' requires group ' ', but that group…

Error message

bootstrap resource '{resource}' requires group '{group}', but that group is absent

What it means

Mirror of the owner check: a bootstrap resource declares a group, and group planning resolved it to AccountState::Absent. The planner refuses to depend on a group that will not exist after the plan runs.

Solutions

  1. Mark the group Present (or remove its Absent declaration)
  2. Reassign the resource's group to an existing Present group
  3. Remove the group field if the default group suffices

Example fix

// before
group("app-team", state: "absent")
directory(group: "app-team")
// after
directory(group: "app-new-team")
Defensive patterns

Strategy: validation

Validate before calling

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

Type guard

function groupExists(res, groups) { return !res.group || groups.get(res.group) === 'present'; }

Try / catch

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

Prevention

When it happens

Trigger: Calling plan with a bootstrap resource whose group is set to a group name for which a group resource exists but is declared Absent.

Common situations: Deleting a legacy group while files/directories still declare it as their group; layered configs disagree about the group's state; a group rename not propagated to resource definitions.

Understand the failure class

Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.

Related errors


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

Appendix: source

Thrown at src/system/resources.rs:724

        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(())
}

fn desired_package(request: &super::packages::PackageRequest) -> String {
    if request.desired == super::packages::PackageDesiredState::Absent {
        return "absent".to_string();
    }
    request
        .version
        .as_ref()
        .map(|version| format!("installed ({version})"))
        .unwrap_or_else(|| "installed (any version)".to_string())
}

View on GitHub (pinned to 533346cc37)