

Capacity is typed, and the types are yours to define: seats and wheelchair spots for patient transport, pallets, crates or cold chain for freight. Each dimension has its own limit per vehicle, and the running load is checked on every leg, not just at departure.
Both stops of a trip ride one vehicle, and the pickup always precedes the delivery in the route. Both are hard rules.
Time in the vehicle is limited per trip: 45 minutes by default, or a tighter per-trip cap. A detour that would hold a passenger or load longer is not allowed.
A trip can prohibit pooling. No other stop is served between its pickup and its delivery.
Load dimensions are configurable per operation: seats, wheelchair places, parcels, pallets, whatever the vehicle carries. A vehicle without capacity in a dimension never receives that trip.
At every stop the running load is updated: pickups add, deliveries subtract. The limit holds on every leg between stops.
Each stop carries its own window. Arriving early means waiting; starting service after the window closes is not allowed.
A van leaves its base at shift start and must finish its last stop by shift end.
Stops already served are locked and their trips stay on their vehicle. A breakdown, an urgent trip or a driver report triggers a re-solve of what is still open.
Served stops are fixed and their trips stay pinned to their vehicle. A re-solve only changes what is still open.
Mark a van broken and its remaining trips reopen and land on the other vans at the next solve.
A new pickup and delivery can be added during the day and is routed on the next solve.
Drag a trip to a specific van and it stays there. The rest of the plan re-optimises around it.
Drag a trip onto a van and it is pinned to that vehicle. The solver keeps choosing the order and the timing; the vehicle is the dispatcher’s decision. Dragging it back releases the pin.
A trip dragged onto another van moves with both its stops and is pinned there. The next solve routes it on that vehicle, in the best position the rules allow.
A pinned trip never moves to another vehicle, whatever the weights say. Dropping it back on its own lane releases the pin.
A pin fixes the vehicle, not the clock. Order and times inside that route stay optimised against every other rule.
A vehicle can be excluded from a solve, what-if style. Its trips reopen and the remaining vans absorb what fits.
Drive time, SLA lateness, dropped optional trips and fairness across vans carry separate weights. The same trips re-solved under different weights produce a different plan; the numbers show the trade.
Travel time, SLA lateness, unassigned optional trips and van-load fairness each carry a weight, set per solve. Zero disables one.
An unassigned trip costs its priority weight, so high-priority work is protected first when capacity runs short.
A stop with an SLA is penalised per minute it arrives past the deadline, ahead of pure drive-time savings.
An optional balance objective spreads drive time across the fleet. Off by default, on when even days matter more than total minutes.
The constraints above are the standard set. Rules specific to your operation are added to the model as hard or soft constraints with their own weight. The solver treats them like the built-in ones: hard rules are never broken, soft rules are traded off against the rest.
A custom rule is either absolute or a weighted preference. Absolute rules are never broken; preferences carry a weight you set per solve.
Custom rules are evaluated on every candidate plan while the solver searches, not checked afterwards. A plan that breaks one is never proposed.
Each rule reports its own contribution, so you can see what it costs the plan, retune its weight or switch it off.
You describe the rule the way your dispatchers state it; it becomes a named constraint in the model.