A route builder that doesn't know where you're starting from is guessing. The GPS button on the Route View page changed that — technicians set their current location as the starting point, and the optimization algorithm threads it through as the depot parameter to Google Routes API. The route that comes back starts from where you actually are, not from the office address in the system.

Permissions got sharper in the same session. Route operations split into two tiers: managers can create, optimize, cancel, and approve. Members can start routes, complete stops, and skip stops — but only on their own routes. An authorizeRouteOwnership() method on the controller enforces the boundary. Managers bypass it. Members must own the route. The distinction matters because a field tech completing their own stops is normal operations, but a field tech approving someone else's route is a management decision.

The Auto-Build button got an animation. Click it and routes draw themselves on the map — polylines extending segment by segment, markers popping in sequence, each route animating in turn with 80 milliseconds between segments and 300 between routes. The old behavior auto-triggered on order selection through a debounced watcher, building routes before you'd finished choosing which orders to include. Now it waits for the explicit click.

The circle lasso for selecting orders on the map had a collision problem — draw mode disabled dragging but not zoom, scroll, or box-zoom. Drawing a selection circle would accidentally zoom the map. Now draw mode disables all map interactions.

The My Route page — the technician's daily view — had a data shape bug. The API returns { routes: [...] } but the component was looking for result.data, which was undefined, so it fell through to the wrapper object. Calling .length on an object returns undefined, which is falsy, which meant "No route scheduled" appeared even when routes existed. A response destructuring fix and a user-specific filter.