v3.0.0
Trip lifecycle. POST /rides/{id}/cancel moves a REQUESTED or MATCHED trip to CANCELLED in the rider service and POST /drivers/{id}/trips/{ride}/complete publishes a completion; both travel on the new ride-lifecycle topic to the matching service, which applies the conditional row update (only the matched driver may complete) and releases the Redis claim so the driver is back in the pool immediately instead of at claim expiry. completed_at and cancelled_at columns, ride_events for every transition, completed/cancelled/lifecycleIgnored stats. 49 unit tests and 14 integration tests.