Runtime: frame scheduler, event system, subsystem manager; ties every other crate into the main loop.
[SubsystemManager] is the one place in the workspace allowed to know
about every *-core at once (see docs/dependency-rules.md rule 7) — it
owns real instances of the driver-independent subsystems that exist
today: an ecs-core [World], physics-core's body list and
pipeline, and audio-core's listener/mixer. graphics-core isn't
wired into [Runtime::tick] yet: rendering has nothing to submit to
without a real graphics-driver backend (blocked on the wgpu
decision — see docs/roadmap.md), so there's no frame in the render
sense to schedule.
[Runtime::tick] advances physics, then recomputes audio gains from
the physics-updated emitter frames, in that order — not through
[FrameScheduler]/task-core's JobGraph, deliberately: physics and
audio are the only two real per-frame systems today, and they have a
genuine sequential data dependency (audio reads positions physics just
wrote), not two independent branches. Wrapping a strictly sequential
two-step in a job graph would be decorative, not functional — the same
reason compute-runtime's task-core dependency isn't wired in yet
(see that crate's module doc). [FrameScheduler] is real and tested on
its own terms; it becomes load-bearing once a second real per-frame
system exists that's genuinely independent of physics (animation,
particles, ...) to run alongside it.