feat(preview): enforce passenger coverage contract and explicit materialization scope
-
Avant : l’endpoint generate-optimized-trips pouvait retourner 200 avec des passagers demandés absents des trips sans explication explicite.
-
Après : chaque passager envoyé est soit matérialisé dans trips, soit présent dans unplacedPassengers avec un reason_code structuré.
-
Avant : la sémantique de prévisualisation (delta vs rematérialisation complète) n’était pas explicite côté API.
-
Après : ajout de preview_materialization_scope (FULL / DELTA_ONLY) avec comportement déterministe dans la réponse.
-
Avant : certains route_points issus de l’intégration pouvaient avoir name: null (passagers/établissements).
-
Après : enrichissement systématique des noms (route_points[].name) avec fallback cohérent quand la donnée source est incomplète.