Signaler une technique (tech step) absente du catalogue lors d'une correction d'étape #130
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Contexte
Origine : ticket #3, puce 3 — « Permettre d'ajouter des tech steps inconnus pour ceux qui manquent, afin d'aider à enrichir le catalogue ».
Le catalogue
TechStepest de la donnée de référence :key @unique, seedé depuisreference-seed-data.ts'sTECH_STEPS(schema.prisma:729-745). Aucun endpoint de création.Le seul point d'entrée « édition de technique » est le
TechStepCorrectionPopover, ouvert depuisStepDescriptionen modeeditablesur le panneau de détail d'une recette dont on est l'auteur (RecipeDetailPanel,showActions— RecipeDetailPanel.tsx:230-235, StepDescription.tsx:84-109). Là, leCatalogSearchPickerne propose que desTechStepexistants (TechStepCorrectionPopover.tsx:672-686), etsubmitTechStepCorrectionSchema.correctedTechStepIddoit matcher une ligne réelle (assertTechStepsExist→ 404TECH_STEP_NOT_FOUND, recipe-tech-step-correction.service.ts:68-88).⇒ Impossible de dire « la technique ici n'existe pas encore dans le catalogue ».
Il existe déjà une boucle de feedback :
StepTechStepCorrection→services/tech-step-llm-worker→TechStepTrainingSuggestion→ revue manuelle (schema.prisma:978-1017). Mais elle ne sait relier une correction qu'à une technique connue.Modèle de référence : les ingrédients hors-catalogue
Le pattern à répliquer existe déjà pour les ingrédients (schema.prisma:548-612,
Ingredient.isPlaceholder) : ligne libredisplayName+createdById+createdAt+reviewedAt, exclue des listes browsables (reference.service.ts:143-146), regroupée par nom normalisé dans/admin/catalogue(CatalogPage+catalog.ts) où un mainteneur la marque « traitée » ou purge les orphelines. L'ajout réel au catalogue reste une édition manuelle dereference-seed-data.ts+ locales.Comportement souhaité
Dans le
TechStepCorrectionPopover, sous leCatalogSearchPickerde techniques, une échappatoire « Ma technique n'est pas dans la liste » ouvrant un champ texte libre. À la validation, la correction est enregistrée avec une technique placeholder (nommée par l'utilisateur), visible dans un onglet « techniques manquantes » de/admin/catalogue, à côté des ingrédients hors-catalogue.Modèle de données (proposition)
TechStep(apps/api/prisma/schema.prisma) — colonnes additives calquées surIngredient:Migration purement additive : colonnes nullable +
@default(false), aucune ligne seedée touchée.Alternative (à trancher) : ne pas toucher
TechStepet modéliser unProposedTechStepséparé — mais réutiliserisPlaceholdercolle mieux au précédent ingrédient et gardeStepTechStep.techStepId(FK) inchangée.Backend
submitTechStepCorrectionSchema(packages/shared/src/schemas/recipe.ts:252-284) : acceptercorrectedTechStepName?: stringen plus decorrectedTechStepId?, mutuellement exclusifs (même forme querecipeIngredientInputSchema'singredientIdxorplaceholderName).submitTechStepCorrection(recipe-tech-step-correction.service.ts:413) : sicorrectedTechStepName, créer la ligneTechStepplaceholder dans la transaction (commeresolveIngredientLines), puis continuer avec son id.getTechSteps(reference.service.ts:82-88) :where: { isPlaceholder: false }.toStepTechStepViews(recipe.service.ts:175-241) :TechStepViewportedisplayName/isPlaceholder(label =displayName ?? t(catalog.techSteps.<key>), même helper que les ingrédients)./admin/api/catalog/tech-step-placeholders(listreviewed=,mark-reviewed,prune-orphans) — miroir de celles des ingrédients.tech_step.placeholder_created.services/tech-step-llm-worker: hors scope ici, mais une technique placeholder est un signal de plus haute valeur qu'une correction ordinaire — à noter pour un ticket suivant.Frontend
TechStepCorrectionPopover(TechStepCorrectionPopover.tsx:672) : bouton « pas dans la liste » sous leCatalogSearchPicker, champ texte, envoiecorrectedTechStepName. Pill « à compléter » sur une technique placeholder posée (commeingredient-row__placeholder-badge).StepDescription: highlight de technique placeholder au style distinct.CatalogPage(/admin/catalogue) : onglet « Techniques manquantes » réutilisantPlaceholderGroupCard/ le regroupement par nom normalisé.recipes.techStepCorrection.notInListButton,admin.catalog.techStepTab, etc.Découpage proposé
TechStep.isPlaceholder, schémapackages/shared,submitTechStepCorrectioncrée la ligne,getTechSteps/toStepTechStepViewsfiltrent/exposent. Pas d'UI encore.TechStepCorrectionPopover/StepDescription, e2e Gherkin./admin/api/catalog/tech-step-placeholders, onglet dansCatalogPage.Tests (obligatoires, cf.
specs/dev-conventions.md)submitTechStepCorrectionaveccorrectedTechStepNamecrée uneTechStepisPlaceholder+ laStepTechStep"manual"associée ;getTechStepsexclut les placeholders ; routes admin list/mark-reviewed/prune.TechStepCorrectionPopover(échappatoire visible, champ, validation) ; Gherkin détail recette → corriger une étape → « pas dans la liste » → badge visible ; mode layout onglet admin.Documentation à mettre à jour
specs/batch-cooking-modele.md+specs/backend-architecture.md—tech_step(colonnes placeholder), section corrections tech-step, admin catalogue.Points restant à trancher en revue
TechStep.isPlaceholdervs tableProposedTechStepséparée (voir plus haut).CatalogSearchPickerdes autres utilisateurs (mutualiser une même technique manquante entre recettes), ou strictement invisible jusqu'à promotion ? (invisible = aligné sur les ingrédients.)🤖 Filed by Claude Code