Skip to content

BRP Add schedule.graph endpoint#23452

Merged
alice-i-cecile merged 11 commits intobevyengine:mainfrom
Zeophlite:brp-systems2
Mar 26, 2026
Merged

BRP Add schedule.graph endpoint#23452
alice-i-cecile merged 11 commits intobevyengine:mainfrom
Zeophlite:brp-systems2

Conversation

@Zeophlite
Copy link
Copy Markdown
Contributor

@Zeophlite Zeophlite commented Mar 21, 2026

Objective

  • Describe the graph for a given schedule

Solution

  • Add endpoint schedule.graph

Related:

Testing

  • in terminal 1 run cargo run --example server --features="bevy_remote"
  • in terminal 2 run curl -d'{"jsonrpc":"2.0","method":"schedule.graph","id":1,"params":{"schedule_name":"First"}}' -X POST -H "Accept: applcation/json" -H "Content-Type: application/json" http://127.0.0.1:15702
Response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "systemsets": [
            {
                "key": "SystemSetKey(1v1)",
                "method": "SystemTypeSet:bevy_ecs::message::update::message_update_system"
            },
            {
                "key": "SystemSetKey(2v1)",
                "method": "MessageUpdateSystems"
            },
            {
                "key": "SystemSetKey(3v1)",
                "method": "SystemTypeSet:bevy_time::time_system"
            },
            {
                "key": "SystemSetKey(4v1)",
                "method": "TimeSystems"
            },
            {
                "key": "SystemSetKey(5v1)",
                "method": "SystemTypeSet:bevy_render::view::window::screenshot::clear_screenshots"
            },
            {
                "key": "SystemSetKey(6v1)",
                "method": "SystemTypeSet:bevy_ecs::schedule::executor::ApplyDeferred"
            },
            {
                "key": "SystemSetKey(7v1)",
                "method": "SystemTypeSet:bevy_ui::widget::viewport::viewport_picking"
            },
            {
                "key": "SystemSetKey(8v1)",
                "method": "PostInput"
            },
            {
                "key": "SystemSetKey(9v1)",
                "method": "SystemTypeSet:bevy_picking::input::mouse_pick_events"
            },
            {
                "key": "SystemSetKey(10v1)",
                "method": "Input"
            },
            {
                "key": "SystemSetKey(11v1)",
                "method": "SystemTypeSet:bevy_picking::input::touch_pick_events"
            }
        ],
        "hierarchy_nodes": [
            "Set(SystemSetKey(11v1))",
            "Set(SystemSetKey(10v1))",
            "System(SystemKey(6v1))",
            "Set(SystemSetKey(9v1))",
            "System(SystemKey(5v1))",
            "Set(SystemSetKey(8v1))",
            "Set(SystemSetKey(7v1))",
            "System(SystemKey(4v1))",
            "Set(SystemSetKey(6v1))",
            "Set(SystemSetKey(5v1))",
            "System(SystemKey(3v1))",
            "Set(SystemSetKey(4v1))",
            "Set(SystemSetKey(3v1))",
            "System(SystemKey(2v1))",
            "Set(SystemSetKey(2v1))",
            "Set(SystemSetKey(1v1))",
            "System(SystemKey(1v1))"
        ],
        "hierarchy_edges": [
            [
                "Set(SystemSetKey(1v1))",
                "System(SystemKey(1v1))"
            ],
            [
                "Set(SystemSetKey(3v1))",
                "System(SystemKey(2v1))"
            ],
            [
                "Set(SystemSetKey(8v1))",
                "System(SystemKey(4v1))"
            ],
            [
                "Set(SystemSetKey(2v1))",
                "System(SystemKey(1v1))"
            ],
            [
                "Set(SystemSetKey(7v1))",
                "System(SystemKey(4v1))"
            ],
            [
                "Set(SystemSetKey(4v1))",
                "System(SystemKey(2v1))"
            ],
            [
                "Set(SystemSetKey(9v1))",
                "System(SystemKey(5v1))"
            ],
            [
                "Set(SystemSetKey(10v1))",
                "System(SystemKey(6v1))"
            ],
            [
                "Set(SystemSetKey(5v1))",
                "System(SystemKey(3v1))"
            ],
            [
                "Set(SystemSetKey(10v1))",
                "System(SystemKey(5v1))"
            ],
            [
                "Set(SystemSetKey(11v1))",
                "System(SystemKey(6v1))"
            ]
        ],
        "dependency_nodes": [
            "System(SystemKey(1v1))",
            "Set(SystemSetKey(1v1))",
            "Set(SystemSetKey(2v1))",
            "System(SystemKey(2v1))",
            "Set(SystemSetKey(3v1))",
            "Set(SystemSetKey(4v1))",
            "System(SystemKey(3v1))",
            "Set(SystemSetKey(5v1))",
            "Set(SystemSetKey(6v1))",
            "System(SystemKey(4v1))",
            "Set(SystemSetKey(7v1))",
            "Set(SystemSetKey(8v1))",
            "System(SystemKey(5v1))",
            "Set(SystemSetKey(9v1))",
            "Set(SystemSetKey(10v1))",
            "System(SystemKey(6v1))",
            "Set(SystemSetKey(11v1))"
        ],
        "dependency_edges": [
            [
                "Set(SystemSetKey(2v1))",
                "Set(SystemSetKey(10v1))"
            ],
            [
                "Set(SystemSetKey(10v1))",
                "Set(SystemSetKey(8v1))"
            ],
            [
                "System(SystemKey(3v1))",
                "Set(SystemSetKey(6v1))"
            ],
            [
                "System(SystemKey(5v1))",
                "System(SystemKey(6v1))"
            ],
            [
                "Set(SystemSetKey(4v1))",
                "Set(SystemSetKey(8v1))"
            ],
            [
                "Set(SystemSetKey(4v1))",
                "Set(SystemSetKey(10v1))"
            ],
            [
                "Set(SystemSetKey(2v1))",
                "Set(SystemSetKey(8v1))"
            ],
            [
                "Set(SystemSetKey(1v1))",
                "System(SystemKey(3v1))"
            ]
        ]
    }
}

From the above response, the below graph can be generated. Hierarchy edges are blue, dependency edges are red. System nodes are implied by hierarchy from Set to System.

first
GraphViz Source

digraph {
    "Set(SystemSetKey(1v1))" [label="message_update_system"]
    "Set(SystemSetKey(2v1))" [label="MessageUpdateSystems"]
    "Set(SystemSetKey(3v1))" [label="time_system"]
    "Set(SystemSetKey(4v1))" [label="TimeSystems"]
    "Set(SystemSetKey(5v1))" [label="clear_screenshots"]
    "Set(SystemSetKey(6v1))" [label="ApplyDeferred"]
    "Set(SystemSetKey(7v1))" [label="viewport_picking"]
    "Set(SystemSetKey(8v1))" [label="PostInput"]
    "Set(SystemSetKey(9v1))" [label="mouse_pick_events"]
    "Set(SystemSetKey(10v1))" [label="Input"]
    "Set(SystemSetKey(11v1))" [label="touch_pick_events"]

    // implied nodes
    "System(SystemKey(1v1))" [label="implied message_update_system", shape=rectangle]
    "System(SystemKey(2v1))" [label="implied time_system", shape=rectangle]
    "System(SystemKey(3v1))" [label="implied clear_screenshots", shape=rectangle]
    "System(SystemKey(4v1))" [label="implied viewport_picking", shape=rectangle]
    "System(SystemKey(5v1))" [label="implied mouse_pick_events", shape=rectangle]
    "System(SystemKey(6v1))" [label="implied touch_pick_events", shape=rectangle]

    // hierarchy
    "Set(SystemSetKey(1v1))" -> "System(SystemKey(1v1))" [color=blue]
    "Set(SystemSetKey(3v1))" -> "System(SystemKey(2v1))" [color=blue]
    "Set(SystemSetKey(8v1))" -> "System(SystemKey(4v1))" [color=blue]
    "Set(SystemSetKey(2v1))" -> "System(SystemKey(1v1))" [color=blue]
    "Set(SystemSetKey(7v1))" -> "System(SystemKey(4v1))" [color=blue]
    "Set(SystemSetKey(4v1))" -> "System(SystemKey(2v1))" [color=blue]
    "Set(SystemSetKey(9v1))" -> "System(SystemKey(5v1))" [color=blue]
    "Set(SystemSetKey(10v1))" -> "System(SystemKey(6v1))" [color=blue]
    "Set(SystemSetKey(5v1))" -> "System(SystemKey(3v1))" [color=blue]
    "Set(SystemSetKey(10v1))" -> "System(SystemKey(5v1))" [color=blue]
    "Set(SystemSetKey(11v1))" -> "System(SystemKey(6v1))" [color=blue]

    // dependencies
    "Set(SystemSetKey(2v1))" -> "Set(SystemSetKey(10v1))" [color=red]
    "Set(SystemSetKey(10v1))" -> "Set(SystemSetKey(8v1))" [color=red]
    "System(SystemKey(3v1))" -> "Set(SystemSetKey(6v1))" [color=red]
    "System(SystemKey(5v1))" -> "System(SystemKey(6v1))" [color=red]
    "Set(SystemSetKey(4v1))" -> "Set(SystemSetKey(8v1))" [color=red]
    "Set(SystemSetKey(4v1))" -> "Set(SystemSetKey(10v1))" [color=red]
    "Set(SystemSetKey(2v1))" -> "Set(SystemSetKey(8v1))" [color=red]
    "Set(SystemSetKey(1v1))" -> "System(SystemKey(3v1))" [color=red]
}

@Zeophlite Zeophlite added A-Dev-Tools Tools used to debug Bevy applications. D-Modest A "normal" level of difficulty; suitable for simple features or challenging fixes S-Needs-Review Needs reviewer attention (from anyone!) to move forward labels Mar 21, 2026
@Zeophlite Zeophlite marked this pull request as ready for review March 21, 2026 16:35
@Zeophlite Zeophlite added this to the 0.19 milestone Mar 21, 2026
@Zeophlite Zeophlite added the S-Needs-Help The author needs help finishing this PR. label Mar 21, 2026
@ChristopherBiscardi
Copy link
Copy Markdown
Contributor

The output for systems and systemsets in a request for Update looks weird and potentially wrong. How did you validate the output for this PR?

    "systems": [],
    "systemsets": [
      {
        "key": "SystemSetKey(1v1)",
        "method": "SystemTypeSet:bevy_window::system::close_when_requested"
      },
      {
        "key": "SystemSetKey(2v1)",
        "method": "SystemTypeSet:bevy_app::terminal_ctrl_c_handler::TerminalCtrlCHandlerPlugin::exit_on_flag"
      },
      {
        "key": "SystemSetKey(3v1)",
        "method": "SystemTypeSet:bevy_render::view::window::screenshot::trigger_screenshots"
      },
      {
        "key": "SystemSetKey(4v1)",
        "method": "SystemTypeSet:bevy_light::probe::automatically_add_parallax_correction_components"
      },

Copy link
Copy Markdown
Member

@mockersf mockersf left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add a test for the new endpoint

@alice-i-cecile alice-i-cecile added S-Waiting-on-Author The author needs to make changes or address concerns before this can be merged and removed S-Needs-Review Needs reviewer attention (from anyone!) to move forward labels Mar 22, 2026
@Zeophlite Zeophlite removed the S-Needs-Help The author needs help finishing this PR. label Mar 23, 2026
@Zeophlite Zeophlite added S-Needs-Review Needs reviewer attention (from anyone!) to move forward and removed S-Waiting-on-Author The author needs to make changes or address concerns before this can be merged labels Mar 24, 2026
Copy link
Copy Markdown
Contributor

@kfc35 kfc35 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just some documentation suggestions

Co-authored-by: Kevin Chen <chen.kevin.f@gmail.com>
@kfc35 kfc35 added S-Ready-For-Final-Review This PR has been approved by the community. It's ready for a maintainer to consider merging it and removed S-Needs-Review Needs reviewer attention (from anyone!) to move forward labels Mar 25, 2026
@kfc35
Copy link
Copy Markdown
Contributor

kfc35 commented Mar 25, 2026

just a note for maintainers that there is a light dependency on #23447 in documentation wrt merge order

@alice-i-cecile alice-i-cecile dismissed mockersf’s stale review March 25, 2026 16:58

Test has been added

github-merge-queue bot pushed a commit that referenced this pull request Mar 25, 2026
# Objective

- List schedules in BRP

## Solution

- Add the endpoint
- Add to `Schedules` some tracking of `temporarily_removed` (schedule
removed to execute) and `empty_labels` (no `Schedule` for that label)

## Related:

- #23452
- #23446

## Testing

- in terminal 1 run `cargo run --example server
--features="bevy_remote"`
- in terminal 2 run `curl
-d'{"jsonrpc":"2.0","method":"schedule.list","id":1,"params":{}}' -X
POST -H "Accept: applcation/json" -H "Content-Type: application/json"
http://127.0.0.1:15702`

<details><summary>Response</summary>
<p>

```json
{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "empty_schedule_labels": [
            "FixedPreUpdate",
            "FixedUpdate"
        ],
        "schedule_labels": [
            "Startup",
            "First",
            "RunFixedMainLoop",
            "PostStartup",
            "FixedFirst",
            "StateTransition",
            "PreUpdate",
            "PostUpdate",
            "Update",
            "PreStartup",
            "SpawnScene",
            "Last",
            "FixedLast",
            "FixedPostUpdate",
            "FixedMain"
        ],
        "unavailable_schedule_labels": [
            "Main",
            "RemoteLast"
        ]
    }
}
```

</p>
</details>

---------

Co-authored-by: Kevin Chen <chen.kevin.f@gmail.com>
@alice-i-cecile alice-i-cecile added this pull request to the merge queue Mar 26, 2026
Merged via the queue into bevyengine:main with commit 56f3ef6 Mar 26, 2026
38 checks passed
github-merge-queue bot pushed a commit that referenced this pull request Mar 28, 2026
…` changes (#23513)

# Objective

- Render schedules are static, compared to the main schedules in the
main world that can be dynamically added with the `MainScheduleOrder`
resource
- This is necessary to allow BRP introspection of schedules in the
Render world (see #23452 )

## Solution

- Add `RenderScheduleOrder` resource that allows for ordering of
`Render` schedules

## Testing

- CI
- #23446
github-merge-queue bot pushed a commit that referenced this pull request Mar 30, 2026
# Objective

- BRP on the `RenderApp`

## Solution

- Add type registry to `RenderApp`
- Add BRP systems to render app
- Add HTTP listener to extra port

I suggest hiding whitespace for reviewing:

<img width="422" height="360" alt="image"
src="https://github.com/user-attachments/assets/3d76eafb-40f5-42f6-8752-c9d94f81d378"
/>

## Related:

- #23513
- #23447
- #23452

## Testing

- CI
- in terminal 1 run `cargo run --example client
--features="bevy_remote"`
- in terminal 2 run `curl
-d'{"jsonrpc":"2.0","method":"world.list_resources","id":1,"params":{}}'
-X POST -H "Accept: applcation/json" -H "Content-Type: application/json"
http://127.0.0.1:15702`
- in terminal 2 run `curl
-d'{"jsonrpc":"2.0","method":"world.list_resources","id":1,"params":{}}'
-X POST -H "Accept: applcation/json" -H "Content-Type: application/json"
http://127.0.0.1:15703`

---------

Co-authored-by: Kevin Chen <chen.kevin.f@gmail.com>
splo pushed a commit to splo/bevy that referenced this pull request Mar 31, 2026
# Objective

- List schedules in BRP

## Solution

- Add the endpoint
- Add to `Schedules` some tracking of `temporarily_removed` (schedule
removed to execute) and `empty_labels` (no `Schedule` for that label)

## Related:

- bevyengine#23452
- bevyengine#23446

## Testing

- in terminal 1 run `cargo run --example server
--features="bevy_remote"`
- in terminal 2 run `curl
-d'{"jsonrpc":"2.0","method":"schedule.list","id":1,"params":{}}' -X
POST -H "Accept: applcation/json" -H "Content-Type: application/json"
http://127.0.0.1:15702`

<details><summary>Response</summary>
<p>

```json
{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "empty_schedule_labels": [
            "FixedPreUpdate",
            "FixedUpdate"
        ],
        "schedule_labels": [
            "Startup",
            "First",
            "RunFixedMainLoop",
            "PostStartup",
            "FixedFirst",
            "StateTransition",
            "PreUpdate",
            "PostUpdate",
            "Update",
            "PreStartup",
            "SpawnScene",
            "Last",
            "FixedLast",
            "FixedPostUpdate",
            "FixedMain"
        ],
        "unavailable_schedule_labels": [
            "Main",
            "RemoteLast"
        ]
    }
}
```

</p>
</details>

---------

Co-authored-by: Kevin Chen <chen.kevin.f@gmail.com>
splo pushed a commit to splo/bevy that referenced this pull request Mar 31, 2026
# Objective

- Describe the graph for a given schedule

## Solution

- Add endpoint `schedule.graph`

## Related:

- bevyengine#23447
- bevyengine#23446

## Testing

- in terminal 1 run `cargo run --example server
--features="bevy_remote"`
- in terminal 2 run `curl
-d'{"jsonrpc":"2.0","method":"schedule.graph","id":1,"params":{"schedule_name":"First"}}'
-X POST -H "Accept: applcation/json" -H "Content-Type: application/json"
http://127.0.0.1:15702 `

<details><summary>Response</summary>
<p>

```json
{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "systemsets": [
            {
                "key": "SystemSetKey(1v1)",
                "method": "SystemTypeSet:bevy_ecs::message::update::message_update_system"
            },
            {
                "key": "SystemSetKey(2v1)",
                "method": "MessageUpdateSystems"
            },
            {
                "key": "SystemSetKey(3v1)",
                "method": "SystemTypeSet:bevy_time::time_system"
            },
            {
                "key": "SystemSetKey(4v1)",
                "method": "TimeSystems"
            },
            {
                "key": "SystemSetKey(5v1)",
                "method": "SystemTypeSet:bevy_render::view::window::screenshot::clear_screenshots"
            },
            {
                "key": "SystemSetKey(6v1)",
                "method": "SystemTypeSet:bevy_ecs::schedule::executor::ApplyDeferred"
            },
            {
                "key": "SystemSetKey(7v1)",
                "method": "SystemTypeSet:bevy_ui::widget::viewport::viewport_picking"
            },
            {
                "key": "SystemSetKey(8v1)",
                "method": "PostInput"
            },
            {
                "key": "SystemSetKey(9v1)",
                "method": "SystemTypeSet:bevy_picking::input::mouse_pick_events"
            },
            {
                "key": "SystemSetKey(10v1)",
                "method": "Input"
            },
            {
                "key": "SystemSetKey(11v1)",
                "method": "SystemTypeSet:bevy_picking::input::touch_pick_events"
            }
        ],
        "hierarchy_nodes": [
            "Set(SystemSetKey(11v1))",
            "Set(SystemSetKey(10v1))",
            "System(SystemKey(6v1))",
            "Set(SystemSetKey(9v1))",
            "System(SystemKey(5v1))",
            "Set(SystemSetKey(8v1))",
            "Set(SystemSetKey(7v1))",
            "System(SystemKey(4v1))",
            "Set(SystemSetKey(6v1))",
            "Set(SystemSetKey(5v1))",
            "System(SystemKey(3v1))",
            "Set(SystemSetKey(4v1))",
            "Set(SystemSetKey(3v1))",
            "System(SystemKey(2v1))",
            "Set(SystemSetKey(2v1))",
            "Set(SystemSetKey(1v1))",
            "System(SystemKey(1v1))"
        ],
        "hierarchy_edges": [
            [
                "Set(SystemSetKey(1v1))",
                "System(SystemKey(1v1))"
            ],
            [
                "Set(SystemSetKey(3v1))",
                "System(SystemKey(2v1))"
            ],
            [
                "Set(SystemSetKey(8v1))",
                "System(SystemKey(4v1))"
            ],
            [
                "Set(SystemSetKey(2v1))",
                "System(SystemKey(1v1))"
            ],
            [
                "Set(SystemSetKey(7v1))",
                "System(SystemKey(4v1))"
            ],
            [
                "Set(SystemSetKey(4v1))",
                "System(SystemKey(2v1))"
            ],
            [
                "Set(SystemSetKey(9v1))",
                "System(SystemKey(5v1))"
            ],
            [
                "Set(SystemSetKey(10v1))",
                "System(SystemKey(6v1))"
            ],
            [
                "Set(SystemSetKey(5v1))",
                "System(SystemKey(3v1))"
            ],
            [
                "Set(SystemSetKey(10v1))",
                "System(SystemKey(5v1))"
            ],
            [
                "Set(SystemSetKey(11v1))",
                "System(SystemKey(6v1))"
            ]
        ],
        "dependency_nodes": [
            "System(SystemKey(1v1))",
            "Set(SystemSetKey(1v1))",
            "Set(SystemSetKey(2v1))",
            "System(SystemKey(2v1))",
            "Set(SystemSetKey(3v1))",
            "Set(SystemSetKey(4v1))",
            "System(SystemKey(3v1))",
            "Set(SystemSetKey(5v1))",
            "Set(SystemSetKey(6v1))",
            "System(SystemKey(4v1))",
            "Set(SystemSetKey(7v1))",
            "Set(SystemSetKey(8v1))",
            "System(SystemKey(5v1))",
            "Set(SystemSetKey(9v1))",
            "Set(SystemSetKey(10v1))",
            "System(SystemKey(6v1))",
            "Set(SystemSetKey(11v1))"
        ],
        "dependency_edges": [
            [
                "Set(SystemSetKey(2v1))",
                "Set(SystemSetKey(10v1))"
            ],
            [
                "Set(SystemSetKey(10v1))",
                "Set(SystemSetKey(8v1))"
            ],
            [
                "System(SystemKey(3v1))",
                "Set(SystemSetKey(6v1))"
            ],
            [
                "System(SystemKey(5v1))",
                "System(SystemKey(6v1))"
            ],
            [
                "Set(SystemSetKey(4v1))",
                "Set(SystemSetKey(8v1))"
            ],
            [
                "Set(SystemSetKey(4v1))",
                "Set(SystemSetKey(10v1))"
            ],
            [
                "Set(SystemSetKey(2v1))",
                "Set(SystemSetKey(8v1))"
            ],
            [
                "Set(SystemSetKey(1v1))",
                "System(SystemKey(3v1))"
            ]
        ]
    }
}
```

</p>
</details> 

From the above response, the below graph can be generated. Hierarchy
edges are blue, dependency edges are red. System nodes are implied by
hierarchy from Set to System.

<img width="1543" height="347" alt="first"
src="https://github.com/user-attachments/assets/80ac7e80-2a28-4246-80cc-29337bad4383"
/>

<details><summary>GraphViz Source</summary>
<p>

```
digraph {
    "Set(SystemSetKey(1v1))" [label="message_update_system"]
    "Set(SystemSetKey(2v1))" [label="MessageUpdateSystems"]
    "Set(SystemSetKey(3v1))" [label="time_system"]
    "Set(SystemSetKey(4v1))" [label="TimeSystems"]
    "Set(SystemSetKey(5v1))" [label="clear_screenshots"]
    "Set(SystemSetKey(6v1))" [label="ApplyDeferred"]
    "Set(SystemSetKey(7v1))" [label="viewport_picking"]
    "Set(SystemSetKey(8v1))" [label="PostInput"]
    "Set(SystemSetKey(9v1))" [label="mouse_pick_events"]
    "Set(SystemSetKey(10v1))" [label="Input"]
    "Set(SystemSetKey(11v1))" [label="touch_pick_events"]

    // implied nodes
    "System(SystemKey(1v1))" [label="implied message_update_system", shape=rectangle]
    "System(SystemKey(2v1))" [label="implied time_system", shape=rectangle]
    "System(SystemKey(3v1))" [label="implied clear_screenshots", shape=rectangle]
    "System(SystemKey(4v1))" [label="implied viewport_picking", shape=rectangle]
    "System(SystemKey(5v1))" [label="implied mouse_pick_events", shape=rectangle]
    "System(SystemKey(6v1))" [label="implied touch_pick_events", shape=rectangle]

    // hierarchy
    "Set(SystemSetKey(1v1))" -> "System(SystemKey(1v1))" [color=blue]
    "Set(SystemSetKey(3v1))" -> "System(SystemKey(2v1))" [color=blue]
    "Set(SystemSetKey(8v1))" -> "System(SystemKey(4v1))" [color=blue]
    "Set(SystemSetKey(2v1))" -> "System(SystemKey(1v1))" [color=blue]
    "Set(SystemSetKey(7v1))" -> "System(SystemKey(4v1))" [color=blue]
    "Set(SystemSetKey(4v1))" -> "System(SystemKey(2v1))" [color=blue]
    "Set(SystemSetKey(9v1))" -> "System(SystemKey(5v1))" [color=blue]
    "Set(SystemSetKey(10v1))" -> "System(SystemKey(6v1))" [color=blue]
    "Set(SystemSetKey(5v1))" -> "System(SystemKey(3v1))" [color=blue]
    "Set(SystemSetKey(10v1))" -> "System(SystemKey(5v1))" [color=blue]
    "Set(SystemSetKey(11v1))" -> "System(SystemKey(6v1))" [color=blue]

    // dependencies
    "Set(SystemSetKey(2v1))" -> "Set(SystemSetKey(10v1))" [color=red]
    "Set(SystemSetKey(10v1))" -> "Set(SystemSetKey(8v1))" [color=red]
    "System(SystemKey(3v1))" -> "Set(SystemSetKey(6v1))" [color=red]
    "System(SystemKey(5v1))" -> "System(SystemKey(6v1))" [color=red]
    "Set(SystemSetKey(4v1))" -> "Set(SystemSetKey(8v1))" [color=red]
    "Set(SystemSetKey(4v1))" -> "Set(SystemSetKey(10v1))" [color=red]
    "Set(SystemSetKey(2v1))" -> "Set(SystemSetKey(8v1))" [color=red]
    "Set(SystemSetKey(1v1))" -> "System(SystemKey(3v1))" [color=red]
}
```

</p>
</details>

---------

Co-authored-by: Kevin Chen <chen.kevin.f@gmail.com>
Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
splo pushed a commit to splo/bevy that referenced this pull request Mar 31, 2026
…` changes (bevyengine#23513)

# Objective

- Render schedules are static, compared to the main schedules in the
main world that can be dynamically added with the `MainScheduleOrder`
resource
- This is necessary to allow BRP introspection of schedules in the
Render world (see bevyengine#23452 )

## Solution

- Add `RenderScheduleOrder` resource that allows for ordering of
`Render` schedules

## Testing

- CI
- bevyengine#23446
splo pushed a commit to splo/bevy that referenced this pull request Mar 31, 2026
- BRP on the `RenderApp`

- Add type registry to `RenderApp`
- Add BRP systems to render app
- Add HTTP listener to extra port

I suggest hiding whitespace for reviewing:

<img width="422" height="360" alt="image"
src="https://github.com/user-attachments/assets/3d76eafb-40f5-42f6-8752-c9d94f81d378"
/>

- bevyengine#23513
- bevyengine#23447
- bevyengine#23452

- CI
- in terminal 1 run `cargo run --example client
--features="bevy_remote"`
- in terminal 2 run `curl
-d'{"jsonrpc":"2.0","method":"world.list_resources","id":1,"params":{}}'
-X POST -H "Accept: applcation/json" -H "Content-Type: application/json"
http://127.0.0.1:15702`
- in terminal 2 run `curl
-d'{"jsonrpc":"2.0","method":"world.list_resources","id":1,"params":{}}'
-X POST -H "Accept: applcation/json" -H "Content-Type: application/json"
http://127.0.0.1:15703`

---------

Co-authored-by: Kevin Chen <chen.kevin.f@gmail.com>
github-merge-queue bot pushed a commit that referenced this pull request Apr 9, 2026
…ta. (#23733)

# Objective

- A possible step towards #10981.
- Followup to #22520.
- We accidentally have two implementations of the same thing! We created
a way to collect schedule data in `bevy_dev_tools` and in `bevy_remote`.
`ScheduleData` is a more complete implementation of collecting schedule
data, and is less tied to the internals of BRP (e.g., it supports
serializing to disk instead of only through the BRP API), so we switch
to that.

## Solution

- Replace the implementation of `schedule.graph` with the `ScheduleData`
API.

A disadvantage is that we now need to wait for the schedules to be
initialized before we can read them. Since users have to connect with
BRP though, it is almost certain that the schedules will be initialized
by the time they request the schedules. This may not be true of
schedules like state transitions though - since these only run rarely.
In a future PR, we can build the schedules on-demand instead.

## Testing

- Updated the test for this.
- Ran the same test as #23452
    - Terminal 1: `cargo r --example server --features=bevy_remote`
- Terminal 2: `curl
-d'{"jsonrpc":"2.0","method":"schedule.graph","id":1,"params":{"schedule_label":"First"}}'
-X POST -H "Accept: applcation/json" -H "Content-Type: application/json"
http://127.0.0.1:15702`
    - It dumped out a whole load of JSON that looked expected!
- I don't have a visualization of the schedule data yet, so I can't
validate that it's correct, but there's no reason to believe its wrong
given the existing `ScheduleData` tests.
viridia pushed a commit to viridia/bevy that referenced this pull request Apr 10, 2026
…ta. (bevyengine#23733)

# Objective

- A possible step towards bevyengine#10981.
- Followup to bevyengine#22520.
- We accidentally have two implementations of the same thing! We created
a way to collect schedule data in `bevy_dev_tools` and in `bevy_remote`.
`ScheduleData` is a more complete implementation of collecting schedule
data, and is less tied to the internals of BRP (e.g., it supports
serializing to disk instead of only through the BRP API), so we switch
to that.

## Solution

- Replace the implementation of `schedule.graph` with the `ScheduleData`
API.

A disadvantage is that we now need to wait for the schedules to be
initialized before we can read them. Since users have to connect with
BRP though, it is almost certain that the schedules will be initialized
by the time they request the schedules. This may not be true of
schedules like state transitions though - since these only run rarely.
In a future PR, we can build the schedules on-demand instead.

## Testing

- Updated the test for this.
- Ran the same test as bevyengine#23452
    - Terminal 1: `cargo r --example server --features=bevy_remote`
- Terminal 2: `curl
-d'{"jsonrpc":"2.0","method":"schedule.graph","id":1,"params":{"schedule_label":"First"}}'
-X POST -H "Accept: applcation/json" -H "Content-Type: application/json"
http://127.0.0.1:15702`
    - It dumped out a whole load of JSON that looked expected!
- I don't have a visualization of the schedule data yet, so I can't
validate that it's correct, but there's no reason to believe its wrong
given the existing `ScheduleData` tests.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-Dev-Tools Tools used to debug Bevy applications. D-Modest A "normal" level of difficulty; suitable for simple features or challenging fixes S-Ready-For-Final-Review This PR has been approved by the community. It's ready for a maintainer to consider merging it

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants