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
- Insert relative to an always-present label such as `Render` or `First`
- Verify membership in `order.labels` before calling insert_before
- 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
- Anchor insert_before calls to always-present labels like Render
- Register the anchor schedule before ordering relative to it
- Watch plugin enable/disable order when schedules are inserted conditionally
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.