Le docblock de ProductRepository pretendait que la suppression dure est bloquee
si le produit est reference (4 FK RESTRICT listees), en omettant que
product_ingredient.product_id est ON DELETE CASCADE : un produit avec une recette
mais sans reference commande/menu se supprime (la recette est cascade-supprimee),
ce qui contredit le contrat affiche.
La cascade est le comportement VOULU (la recette appartient au produit). Correctif
de contrat, sans changement de comportement :
- docblock ProductRepository : topologie FK reelle (RESTRICT bloquants vs CASCADE
product_ingredient), + TODO trace audit du nb de lignes recette (phase stock).
- commentaire au site de suppression dans ProductController.
Differe (assume) : tracer le compte de lignes product_ingredient cascade dans
audit_log. La table est vide (domaine recettes/stock non construit) ; la trace
sera concue avec cette feature. 188 tests verts, PHPStan L6 propre.