Quinze entreprises, incapables de prendre une seule commande
A tier-scoped forms redesign left published listings resolving to 'No application form is currently available', with Continue permanently disabled.
Visible seulement en s'en servant
Invisible à la relecture du code. Trouvé en étant le vrai utilisateur, sur un vrai appareil, à une vraie largeur.
Sur le nouveau jeu de 48 organisations, un vrai client pouvait parcourir une vraie organisation — note 5,0, active, badges ouverts sur les trois catégories, 90 places, une grille de frais complète, un Postuler rouge — cliquer, choisir n'importe quelle catégorie et niveau, et atterrir sur « Aucun formulaire de candidature n'est actuellement disponible pour ce programme » avec Continuer désactivé de façon permanente.
La refonte des formulaires cadrés par niveau a fait de (program_id, tier_level) le seul chemin de résolution et a supprimé les replis au niveau organisation et succursale. Les templates préexistants cadrés sur l'organisation ont scope_type='organisation', program_id IS NULL et aucune ligne de niveau, donc ils ne peuvent jamais résoudre tout en se lisant comme publiés. Mesuré : 15 des 25 organisations actives affectées, 8 fonctionnelles, 2 sans aucun formulaire publié.
C'est invisible dans les deux sens. La page de l'admin affiche son formulaire comme publié, donc il croit être en ligne. Le client voit une fiche remplie avec de vrais prix. Rien n'erreur — chaque log de console et de réseau était propre. Ça ne fait surface que si quelqu'un parcourt tout le flux en tant que client sur une organisation que personne n'avait testée.
Et le correctif n'était pas le correctif. Le backfill a tourné, inséré les lignes de niveau, et le flux était toujours mort, parce que le résolveur filtrait aussi program_id sur la ligne de template elle-même. Je ne l'ai trouvé qu'en re-parcourant le flux dans un navigateur au lieu de faire confiance au nombre de lignes que le script affichait. Les organisations candidatables sont passées de 8 à 23 sur 25.
Deux choses à garder. Une migration qui rapporte « 27 lignes écrites » est une preuve sur la migration, pas sur la fonctionnalité. Et toute refonte qui retire un repli devrait être livrée avec une requête listant exactement ce qui cesse de résoudre — la conséquence ici a été énoncée et acceptée à la conception, et personne n'a énuméré les 15 organisations sur lesquelles elle est tombée.