Both floors run an identical fleet, seen from above: robots drain battery while traveling and working a scattered set of tasks, and recharge only at the single charging pad in the corner. The left fleet is naive — every robot keeps grabbing tasks until its battery hits zero mid-task. It freezes, raises a red flag, and its unfinished task resets into the pool for someone else to start from scratch. That is a stranded incident.
The right fleet runs a predictive scheduler. For every robot it is working, it continuously estimates "time left to finish this task, plus time to drive back to the charger" and compares that to the robot's actual remaining battery. The moment the margin gets thin, it proactively pulls that robot off the task before it would run out, reassigns the unfinished task to another robot with spare capacity, and routes the low robot to recharge.
- Robots per fleet / Task load — raise either to see the naive fleet's stranded-incident count climb and its throughput sag, while the managed fleet keeps a steady rate.
- Battery ring around each robot — green/yellow/red fill shows charge; a robot heading to the pad turns cyan.
- Reassigned — how many times the managed scheduler handed an in-progress task to a different robot ahead of a predicted strand.