feat(cooking-session): regroupement d'étapes sensible aux métadonnées d'action #24

Merged
kyuno merged 1 commit from feat/cooking-optimizer-metadata into feat/cooking-session-stepper 2026-09-03 14:09:31 +02:00
Owner

Empilée sur #23 (touche les mêmes fichiers web). Base à repointer sur main quand #23 sera mergée.

Dépend aussi de #22 (métadonnées de température) — déjà mergée dans main.


L'optimiseur ne mutualisait que le pré-découpage (chop/peel du même ingrédient). Il regroupe maintenant aussi les actions SETUP (preheat / boil / bainMarie) entre recettes — mais seulement quand les métadonnées de l'action sont compatibles.

Compatibilité des préchauffages

  • Deux preheat ne fusionnent que si leur température détectée est identique (temperatureKey : comparaison exacte, aucune conversion °C ↔ thermostat ↔ qualitatif devinée — même posture que ShoppingListItemView sur les unités).
  • Défaut optimiste : deux preheat sans température détectée fusionnent quand même (supposés compatibles).
  • Deux preheat à températures différentes → restent 2 tâches, ordonnées du plus froid au plus chaud, et la mise en place porte une note structurée appliance-temperature-conflict → le web affiche « Four requis à 2 températures — enchaîner 180 °C puis 210 °C ».
  • boil (« porter l'eau à ébullition ») fusionne librement (pas de température).

Fichiers

  • cooking-optimizer.ts : OptimizerTechStepInput.temperatures ; isPureSetupStep / setupSignature / extractMergedSetup en miroir strict du chemin merged-prep ; comparableTemp (thermostat × 30 ≈ °C — ordre seulement, jamais la fusion) ; detectApplianceTemperatureConflicts. Phase 0 = tout le prep puis tout le setup trié froid→chaud.
  • cooking-session.service.ts : temperatures: true dans l'include, mapping Decimal→number.
  • packages/shared : CookingTemperatureView, kind: "merged-setup", CookingTaskView.temperatures, CookingPhaseNoteView, CookingPhaseView.notes.
  • web : temperature-label.ts extrait de StepDescription.tsx (privé → partagé, réutilisé) ; taskHeadline gère merged-setup (« Préchauffer · 180 °C ») ; phaseNoteText ; bandeau .cooking-phase__note.
  • i18n : cookingSession.task.mergedSetupLabel, cookingSession.note.*.

Hors périmètre

Regroupement des cuissons passives (bake/roast) partageant le four ; plusieurs fours ; conversion inter-représentations pour la fusion.

Vérification

  • pnpm lint + pnpm build (monorepo) OK.
  • cooking-optimizer.test.ts : 47 passing (dont 7 nouveaux « setup pooling » + le test full-week mis à jour), lancé en isolation (suite pure, sans DB).
  • Nouveau test DB cooking-session.test.ts + cas Cypress (layout + Gherkin) écrits — nécessitent Postgres + intent-service, à jouer en CI / machine de dev (sandbox sans Docker).
  • Smoke test navigateur (mock fetch temporaire) : tâche merged-setup avec température, bandeau de note, ordre froid→chaud, clair/sombre, coche.

🤖 Generated with Claude Code

**Empilée sur #23** (touche les mêmes fichiers web). Base à repointer sur `main` quand #23 sera mergée. Dépend aussi de #22 (métadonnées de température) — déjà mergée dans `main`. --- L'optimiseur ne mutualisait que le pré-découpage (`chop`/`peel` du même ingrédient). Il regroupe maintenant aussi les **actions SETUP** (`preheat` / `boil` / `bainMarie`) entre recettes — mais seulement **quand les métadonnées de l'action sont compatibles**. ## Compatibilité des préchauffages - Deux `preheat` ne fusionnent que si leur **température détectée est identique** (`temperatureKey` : comparaison exacte, **aucune conversion** °C ↔ thermostat ↔ qualitatif devinée — même posture que `ShoppingListItemView` sur les unités). - **Défaut optimiste** : deux `preheat` **sans** température détectée fusionnent quand même (supposés compatibles). - Deux `preheat` à températures **différentes** → restent 2 tâches, ordonnées **du plus froid au plus chaud**, et la mise en place porte une note structurée `appliance-temperature-conflict` → le web affiche « Four requis à 2 températures — enchaîner 180 °C puis 210 °C ». - `boil` (« porter l'eau à ébullition ») fusionne librement (pas de température). ## Fichiers - **`cooking-optimizer.ts`** : `OptimizerTechStepInput.temperatures` ; `isPureSetupStep` / `setupSignature` / `extractMergedSetup` en miroir strict du chemin `merged-prep` ; `comparableTemp` (thermostat × 30 ≈ °C — **ordre seulement**, jamais la fusion) ; `detectApplianceTemperatureConflicts`. Phase 0 = tout le prep puis tout le setup trié froid→chaud. - **`cooking-session.service.ts`** : `temperatures: true` dans l'`include`, mapping `Decimal`→`number`. - **`packages/shared`** : `CookingTemperatureView`, `kind: "merged-setup"`, `CookingTaskView.temperatures`, `CookingPhaseNoteView`, `CookingPhaseView.notes`. - **web** : `temperature-label.ts` extrait de `StepDescription.tsx` (privé → partagé, réutilisé) ; `taskHeadline` gère `merged-setup` (« Préchauffer · 180 °C ») ; `phaseNoteText` ; bandeau `.cooking-phase__note`. - **i18n** : `cookingSession.task.mergedSetupLabel`, `cookingSession.note.*`. ## Hors périmètre Regroupement des cuissons passives (`bake`/`roast`) partageant le four ; plusieurs fours ; conversion inter-représentations pour la fusion. ## Vérification - `pnpm lint` + `pnpm build` (monorepo) OK. - `cooking-optimizer.test.ts` : **47 passing** (dont 7 nouveaux « setup pooling » + le test full-week mis à jour), lancé en isolation (suite pure, sans DB). - Nouveau test DB `cooking-session.test.ts` + cas Cypress (layout + Gherkin) écrits — nécessitent Postgres + intent-service, à jouer en CI / machine de dev (sandbox sans Docker). - Smoke test navigateur (mock `fetch` temporaire) : tâche `merged-setup` avec température, bandeau de note, ordre froid→chaud, clair/sombre, coche. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
kyuno added 1 commit 2026-09-03 12:06:45 +02:00
feat(cooking-session): regroupement d'étapes sensible aux métadonnées d'action
All checks were successful
CI / lint (push) Successful in 1m57s
CI / build (push) Successful in 3m2s
CI / e2e (push) Successful in 7m59s
CI / intent-service-test (push) Successful in 18m44s
CI / test (push) Successful in 28m2s
85268729e6
L'optimiseur ne mutualisait que le pré-découpage. Il regroupe maintenant
aussi les actions SETUP (préchauffage, ébullition) entre recettes, mais
seulement quand elles sont compatibles : deux préchauffages ne fusionnent
que s'ils visent la même température détectée. Deux préchauffages à des
températures différentes restent séparés, ordonnés du plus froid au plus
chaud, et la mise en place porte une note « Four requis à N températures —
enchaîner … ». Défaut optimiste : deux préchauffages sans température
détectée fusionnent quand même (supposés compatibles).

- cooking-optimizer.ts : temperatureKey (comparaison exacte, aucune
  conversion inter-représentations), isPureSetupStep / setupSignature /
  extractMergedSetup en miroir du chemin merged-prep ; comparableTemp pour
  l'ordre seul ; detectApplianceTemperatureConflicts → CookingPhaseView.notes
- cooking-session.service.ts : `temperatures` dans l'include + mapping
- packages/shared : CookingTemperatureView, kind « merged-setup »,
  CookingTaskView.temperatures, CookingPhaseNoteView, CookingPhaseView.notes
- web : temperature-label.ts extrait de StepDescription et réutilisé ;
  taskHeadline gère merged-setup ; phaseNoteText ; bandeau .cooking-phase__note
- i18n : cookingSession.task.mergedSetupLabel, cookingSession.note.*
- tests : 7 cas Mocha « setup pooling » + test DB cooking-session,
  cas Cypress mode layout + scénario Gherkin

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno merged commit 39e748adc9 into feat/cooking-session-stepper 2026-09-03 14:09:31 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: kyuno/batchCooking#24
No description provided.