Tuesday, August 12. Night shift.

At 9:40 PM we were in the middle of our outbound peak. At the cross aisle where Main Road B meets Aisle C, four AMRs rolled up from four directions at the same moment. And stopped. All four. Nobody moved, because every one of them thought it had the right of way.

On the dispatch screen, four little dots sat there frozen. Behind them, a line of robots backed up down Aisle C. Shift lead Xiao Li ran over, watched for a while, and came back to me: "Chen, those four look like they planned this. Nobody's budging."

It took 8 minutes from the moment they locked up to the moment one of our guys walked over and manually moved a robot out of the way. Eight minutes with zero movement in Aisle C. Replenishment couldn't get in. The whole wave plan fell apart. That night our hourly throughput dropped from the usual 1,100 cases to barely 800. I'll be honest with you: the RCS had been running smooth for three months, and the thing that finally took us down was a single intersection.

Four Robots, Nobody Yielding

The factory default priority was "first come, first served." Sounds fair, right? Like a queue. Whoever gets to the intersection first goes first.

Here's what actually happens. During peak, four robots arrive within about a second of each other. The system can't tell who was truly first. So all four stop, all four inch forward to test, all four emergency-stop when their safety lasers catch each other. Stop for three seconds, try again, stop again. Deadlock.

And deadlock is contagious. Once the intersection freezes, the robots behind it stop, and the ones behind those stop too. Eight minutes later, half the fleet in Zone B was standing still and the RCS screen was a wall of red. Old Wang, our veteran on nights, got on the radio: "Chen, are these robots here to work or here to hold a meeting?"

Next morning I spent the whole standup arguing with the vendor's engineer. His exact words: "Chen, this is the industry standard." I said: "Your standard just shut my warehouse down for eight minutes. Give me a non-standard one."

Two Wrong Fixes We Actually Tried

The first idea was obvious: heavy loads go first. We set "loaded priority" — full robots get the highest priority, empty ones yield.

Three days later, Old Zhang was standing at the Aisle C intersection with two new hires, cursing at the robots. An empty robot on its way to pick up a load had yielded to seven or eight loaded ones in a row and sat there for 11 minutes. Zhang said: "Chen, these things bully the new guys — is an empty robot not a robot?" Worse, the loaded robots started acting entitled. They knew everyone would yield, so they stopped slowing down at intersections, and twice they nearly shoved an empty robot coming out of a side aisle into the racking. Morale is invisible until it breaks — but at the shift handover that day, somebody actually said: "Maybe nights should just go back to forklifts." Hearing that gave me chills.

The second idea: main road priority. Robots on the main road never stop; side-aisle robots yield.

That was worse. Side-aisle robots couldn't get onto the main road at all. They piled up in the aisles — the worst one was a 40-meter side aisle with six robots bumper to bumper, and the replenishment guy couldn't even get his manual pallet jack through. We moved the jam from the intersection into the aisles, where it was harder to fix, and starved the pick zones of replenishment in the process.

Two failed experiments taught us something counterintuitive: the harder you try to be "fair," the worse the jam.

First-come-first-served sounds the fairest — and deadlocks the most. Loaded-priority sounds the most sensible — and bullies the empty robots into uselessness. Main-road priority sounds the most scientific — and moves the jam somewhere harder to deal with. It finally clicked for me: intersections don't fear slowness, they fear ambiguity. The moment two robots both think they should go, you're done. The only way to keep traffic moving is to build in deliberate "unfairness" — spell out exactly who yields to whom, and leave zero room for negotiation.

What Our Warehouse Does Now

After a month of trial and error, we've settled on three rules. This is how our warehouse runs today.

Rule one: change the rules by time of day. No one-size-fits-all.

During the day, when waves are light and few robots are out, we use first-come-first-served. Simple, no fuss. From 7 PM to 11 PM, the system auto-switches to "task urgency priority." Every task gets a score — outbound tasks near their carrier cutoff score highest, replenishment next, empty robots heading back to charge lowest. Note: we score by urgency, not by weight. An empty robot rushing to a wave that's about to miss cutoff outranks a loaded robot cruising along with no deadline. Old Zhang hasn't cursed at an intersection since.

Strategy Deadlock risk Longest empty-robot wait Peak throughput When we use it
First-come-first-served High (nearly daily at peak) about 5 min Baseline Daytime, light traffic
Loaded priority Medium Over 10 min about 10% below baseline Tried 3 days, dropped
Main-road priority Medium Side aisles pile up Aisles jam, even worse Tried 2 days, dropped
Time-of-day task urgency Low (zero deadlocks in 3 months) Under 3 min about 15% above baseline What we run now, all day

(These are measured numbers from our own floor with 40 robots. Different fleet, different layout — take them as reference, not gospel.)

AMRs yielding at aisle intersection

Rule two: draw a no-stop box around the bad intersections.

We pulled the stats on all six intersections in the building. That one on Main Road B accounted for over 70% of our deadlocks. The fix was simple: 15 meters out in each direction, we drew an electronic fence. Before any robot enters the box, the RCS has to prove it can clear the intersection in one go. If it can't prove it, it waits outside. No "I'll squeeze in and figure it out." It's the same rule as "don't block the box" on city streets — except we wrote it into the software. That intersection hasn't locked up once since.

Rule three: new dispatchers shadow the old hands for three days — watching intersections.

This one's about people. For the first two weeks after we changed the rules, the night-shift veterans stared at the monitors, and the moment something looked off they'd call it on the radio. Now every new dispatcher spends three days with Old Wang just watching intersection traffic, learning to spot "those two are about to get into it." Machines handle the rules; people handle the exceptions. Sounds old-fashioned, but it works — last month a software update reset our priority parameters to factory defaults, and Old Wang noticed "the robots are yielding wrong" ten minutes before the system alarm went off.

Let's do the math. In our worst week, we averaged three deadlocks a day, five to eight minutes each, and hourly throughput dropped by two or three hundred cases every time. That's nearly 4,000 cases lost in a week. In peak season, that kind of miss gets you customer penalties that'll make your eyes water. We've been on the new setup for three months: zero deadlocks, and night-shift throughput is actually up from where it was. Honestly, the vendor's engineer thought our approach was crude at first. Now they've written our time-of-day rules into the recommended config they ship to other warehouses.

One reminder for fellow operators: when you bring RCS online, don't just admire how clever the dispatch algorithm is. Go stand at your busiest intersection during a peak shift first. Get the intersection wrong and 40 robots become 40 roadblocks; get it right and the people become the bonus. And before you change any traffic rule, talk to your night-shift veterans first — the robots drive themselves, but the shifts are run by people. If the people don't buy in, no rule works.

By Chen Feng, Warehouse Operations Manager