bevyengine/bevy · error

Expected {before:?} to exist

Error message

Expected {before:?} to exist

What it means

Mirror of `insert_after` on `RenderScheduleOrder`: `insert_before(before, schedule)` panics with "Expected {before:?} to exist" when the anchor label is absent from the ordered label list, because a relative insertion position cannot be computed.

Source

Thrown at crates/bevy_render/src/lib.rs:312

impl RenderScheduleOrder {
    /// Adds the given `schedule` after the `after` schedule
    pub fn insert_after(&mut self, after: impl ScheduleLabel, schedule: impl ScheduleLabel) {
        let index = self
            .labels
            .iter()
            .position(|current| (**current).eq(&after))
            .unwrap_or_else(|| panic!("Expected {after:?} to exist"));
        self.labels.insert(index + 1, schedule.intern());
    }

    /// Adds the given `schedule` before the `before` schedule
    pub fn insert_before(&mut self, before: impl ScheduleLabel, schedule: impl ScheduleLabel) {
        let index = self
            .labels
            .iter()
            .position(|current| (**current).eq(&before))
            .unwrap_or_else(|| panic!("Expected {before:?} to exist"));
        self.labels.insert(index, schedule.intern());
    }
}

/// The main render schedule.
///
/// See also [`RenderGraph`] for more details.
#[derive(ScheduleLabel, Debug, Hash, PartialEq, Eq, Clone, Default)]
pub struct Render;

impl Render {
    /// Sets up the base structure of the rendering [`Schedule`].
    ///
    /// The sets defined in this enum are configured to run in order.
    pub fn base_schedule() -> Schedule {
        use RenderSystems::*;

        let mut schedule = Schedule::new(Self);

View on GitHub (pinned to 396ca72708)

Solutions

  1. Insert relative to an always-present label such as `Render` or `First`
  2. Verify membership in `order.labels` before calling insert_before
  3. Register the anchor schedule (or use explicit ordering constraints) instead of assuming presence

Example fix

// before
order.insert_before(MyCustomSchedule, MyNewSchedule); // MyCustomSchedule not inserted yet

// after
order.insert_before(Render, MyNewSchedule); // or insert MyCustomSchedule first
Defensive patterns

Strategy: validation

Validate before calling

let exists = order.labels.iter().any(|l| (**l).eq(&MySchedule));
if exists {
    order.insert_before(MySchedule, MyNewSchedule);
} else {
    order.insert_before(Render, MyNewSchedule); // safe anchor
}

Prevention

When it happens

Trigger: Calling `render_schedule_order.insert_before(MySchedule, NewSchedule)` when `MySchedule` is not among `order.labels` — never inserted, removed, or a different/renamed label type.

Common situations: Plugin ordering code assuming another plugin's schedule exists; enabling a plugin conditionally while another unconditionally inserts relative to it.

Related errors


AI-assisted analysis of bevyengine/bevy@396ca72708 (2026-08-20). Data as JSON: /api/errors/2b5d70641d2a6688. Report an issue: GitHub.