bevyengine/bevy · warning · NotReady
not available until all configured schedules have been run;
Error message
not available until all configured schedules have been run; try again next frame
What it means
Stepping derives the schedule execution order by observing schedules as they run; Stepping::schedules() returns NotReady until every schedule registered for stepping has executed at least once (schedule_order is only complete when it matches schedule_states). It is a transient, recoverable error: retry on a later frame.
Source
Thrown at crates/bevy_ecs/src/schedule/stepping.rs:91
/// Updates to [`Stepping::schedule_states`] that will be applied at the start
/// of the next render frame
enum Update {
/// Set the action stepping will perform for this render frame
SetAction(Action),
/// Enable stepping for this schedule
AddSchedule(InternedScheduleLabel),
/// Disable stepping for this schedule
RemoveSchedule(InternedScheduleLabel),
/// Clear any system-specific behaviors for this schedule
ClearSchedule(InternedScheduleLabel),
/// Set a system-specific behavior for this schedule & system
SetBehavior(InternedScheduleLabel, SystemIdentifier, SystemBehavior),
/// Clear any system-specific behavior for this schedule & system
ClearBehavior(InternedScheduleLabel, SystemIdentifier),
}
#[derive(Error, Debug)]
#[error("not available until all configured schedules have been run; try again next frame")]
pub struct NotReady;
#[derive(Resource, Default)]
/// Resource for controlling system stepping behavior
pub struct Stepping {
// [`ScheduleState`] for each [`Schedule`] with stepping enabled
schedule_states: HashMap<InternedScheduleLabel, ScheduleState>,
// dynamically generated [`Schedule`] order
schedule_order: Vec<InternedScheduleLabel>,
// current position in the stepping frame
cursor: Cursor,
// index in [`schedule_order`] of the last schedule to call `skipped_systems()`
previous_schedule: Option<usize>,
// Action to perform during this render frameView on GitHub (pinned to 396ca72708)
Solutions
- Treat the error as 'skip this frame': return early and retry after the frame completes.
- Ensure the app actually runs every stepping-enabled schedule so the order can be discovered.
- If a schedule was added to stepping mid-session, wait until it has run once before querying again.
Example fix
// before
let schedules = stepping.schedules().unwrap(); // panics on frame 0
// after
let Some(schedules) = stepping.schedules().ok() else {
return; // not all schedules have run yet; try again next frame
}; Defensive patterns
Strategy: retry
Validate before calling
if stepping.schedules().is_err() {
return; // schedules not all observed yet; try again next frame
} Try / catch
match stepping.schedules() {
Ok(order) => draw_stepping_ui(order),
Err(NotReady) => {} // render nothing this frame; retry next frame
} Prevention
- Query Stepping only from systems that run after the schedules of interest.
- Gate stepping UI on schedules() returning Ok.
- In tests, advance at least one full frame before asserting on stepping state.
When it happens
Trigger: Calling stepping.schedules() in the same frame the Stepping resource was created/populated, before all stepping-enabled schedules have run once; adding a schedule to stepping mid-frame and querying immediately; debug UI reading the list on frame 0.
Common situations: Custom debug front-ends or inspector UIs integrating with bevy's Stepping resource; headless tests that create Stepping but never actually run the app loop.
Related errors
AI-assisted analysis of bevyengine/bevy@396ca72708 (2026-08-20).
Data as JSON: /api/errors/6eb71521d4f74576.
Report an issue: GitHub.