fix(recipes): persiste les métadonnées de clause des tech-steps à l'édition #26
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/recipe-tech-step-metadata-on-update"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Le bug
recipe.service.tsa deux chemins d'écriture desStepTechStep:ingredientsutensilstemperaturescreateRecipeInternal(import + création)updateRecipe(PATCH /recipes/:id)scripts/backfill-tech-steps.tsmatchStepsTechStepscalcule pourtant les trois pour les deux chemins —updateRecipeet le backfill les ignoraient simplement. La divergence existe depuis5506279(#75, ingrédients/ustensiles) ;189df73(#22, températures) l'a reproduite.Conséquence : toute recette ré-enregistrée via l'UI perd les ingrédients/ustensiles/températures de ses techniques ; toute recette importée avant le 29/08/2026 n'a jamais eu de températures (la migration
20260829120000ne crée que la table). Résultat concret sur la prod :cooking-optimizer.tsne voit jamais deCookingTemperatureView, doncdetectApplianceTemperatureConflicts()ne peut pas signaler « four requis à 150 °C et 200 °C » — le préchauffage des recettes concernées est fusionné sans température ni note d'enchaînement. (Constaté surbatch.dev.kyuno.fr: gratin dauphinoisPréchauffer … 150 °C+ moussakapréchauffer … 200 °Cfusionnés en une tâche sans température, zéro note de conflit.)Changements
toStepTechStepCreateInputs(lib/recipe-matching/tech-step-persistence.ts) — seule source de vérité du payloadtechSteps.create(technique +ingredients/utensils/temperatures).createRecipeInternal,updateRecipeetbackfill-tech-steps.tsl'utilisent tous les trois : ils ne peuvent plus diverger.createRecipeInternalpasse de ~40 lignes inline à un appel.backfill-tech-steps.ts—createMany→createpar ligne (createManyne fait pas les écritures imbriquées) + doc à jour.model BackfillState+ migrationbackfill_state(registre d'idempotence).scripts/backfill-runtime.tsajouté auCMDDocker aprèsseed-runtime. Gardé par un marqueur → tourne une seule fois ; une panne du backfill est loggée sans faire échouer le boot (le serveur démarre, retente au prochain start).reset-db.ts:backfill_stateajouté auTRUNCATE.PATCH /recipes/:id— une température de clause survit à l'édition (mêmes assertions que le test POST « extracts a step's temperature mentions », via PATCH).Compromis assumé du rattrapage
backfill-runtime.tslancebackfillTechSteps()entier : il supprime/recrée tous lesStepTechStepsource:"auto"contre le modèle NLP actuellement déployé. Il ne re-fait donc pas que les métadonnées — des tags de technique peuvent bouger sur des recettes existantes si le modèle a évolué depuis leur dernier matching (ex. les confusionsPréchauffer→bake,Enfourner→meltdéjà connues). C'est le prix d'une remise à niveau complète et automatique ; pas de garde-fou F1 ici (contrairement àretrain-tech-steps.ts) — l'objectif est d'aligner l'existant sur ce que produisent déjà les nouveaux imports. Premier boot post-déploiement : un appelintent-serviceparStep(quelques minutes, une fois ; le service esthealthyavant leCMDviadepends_on).Vérification
pnpm --filter api exec tsc --noEmitpnpm --filter api build(les 2 nouveaux scripts compilent dansdist/)pnpm lint(biome, 311 fichiers)recipe.test.tsnon lancé — Postgres +tech-step-intent-servicerequis, indisponibles ici. À jouer en CI / sur la machine de dev.🤖 Generated with Claude Code