feat(tech-steps): détecte les températures dans les étapes #19

Merged
kyuno merged 2 commits from feat/temperature-metadata into feat/merge-admin-into-web 2026-08-29 21:15:57 +02:00
Owner

Stacked sur #18 (feat/merge-admin-into-web) — le seul fichier commun est apps/web/src/locales/fr/translation.json. À retarget sur main une fois #18 mergée.

3ᵉ type de métadonnée de clause, à côté des ingrédients et des ustensiles (StepTechStepView.ingredients / .utensils) : la température manquait alors qu'elle est omniprésente dans les recettes FR.

Couverture : °C (« 180°C », « 200 degrés », °F converti+arrondi), thermostat / gas mark (« th. 6 », « thermostat 7 »), intensité qualitative (« feu doux/moyen/vif/fort » → low / medium / high).

services/tech-step-intent-service

  • temperature_extraction.py : extract_temperatures(text, locale), pur, à base de regex — indépendant du modèle spaCy et de l'entraînement (extrait même pour une locale pas encore entraînée).
  • ProcessResult / ProcessResponse gagnent temperatures — ajout additif au contrat, EntityPayload inchangé. Liste à part des entities car une température porte des champs structurés (celsius / gas_mark / qualitative). Clé gas_mark en snake_case sur le fil.
  • Tests : test_temperature_extraction.py (10 cas) ; test_routes_process.py — les 2 assertions d'égalité stricte gagnent "temperatures": [], +1 nouveau cas. 15/15 verts (test_temperature_extraction + test_routes_process).

apps/api

  • IntentServiceTemperature dans intent-service-client.ts (mappe gas_mark → gasMark à la frontière).
  • TechStepMatch.temperatures : chaque température rattachée à la clause dont le span la contient — même règle que les ustensiles (matchTechStepSpans).
  • model StepTechStepTemperature — aucune FK (la valeur structurée est la donnée) ; migration manuelle 20260829120000_step_tech_step_temperature (cascade via le TRUNCATE de step_tech_step, comme _ingredient / _utensil — rien à ajouter à reset-db.ts).
  • Persistance + lecture : recipe.service.ts (recipeInclude + toStepTechStepViews), include de séquence fraîche du service de correction, sources.service.ts (aperçu d'import) les fait transiter. Nouveau cas dans recipe.test.ts.

packages/shared

StepTechStepTemperatureView + temperatures sur StepTechStepView.

apps/web

  • splitDescriptionSegments enrobe splitDescriptionByTechSteps et redécoupe les runs non-keyword autour des spans de température — la logique technique intriquée (bien couverte par tests) reste intacte. ?? [] tolère une payload d'avant temperatures (corrige une régression : les fixtures Cypress mockées n'ont pas le champ).
  • StepDescription : surlignage .step-temperature (accent Vermillion, --low/--high varient juste l'épaisseur du soulignement) + Tooltip via temperatureLabel. i18n recipes.temperature.{celsius,gasMark,qualitative.*}.
  • Tests composants +4 → 22/22 verts. Pas d'UI de correction pour les températures (v1, comme les ustensiles). L'optimiseur batch-cooking ne les consomme pas encore.

Vérification

  • biome check propre ; tsc -b (web + api) ; pnpm -r build 6/6.
  • Cypress web e2e : 102/103 (l'unique échec = flake pré-existant recipe-form.feature, identique à main) ; 49/49 composants.
  • pnpm --filter api test (Postgres :5433 + tech-step-intent-service requis) non lancé ici — à faire avant merge.

🤖 Generated with Claude Code

**Stacked sur #18** (`feat/merge-admin-into-web`) — le seul fichier commun est `apps/web/src/locales/fr/translation.json`. À retarget sur `main` une fois #18 mergée. 3ᵉ type de métadonnée de clause, à côté des ingrédients et des ustensiles (`StepTechStepView.ingredients` / `.utensils`) : la température manquait alors qu'elle est omniprésente dans les recettes FR. Couverture : °C (« 180°C », « 200 degrés », °F converti+arrondi), thermostat / gas mark (« th. 6 », « thermostat 7 »), intensité qualitative (« feu doux/moyen/vif/fort » → `low` / `medium` / `high`). ## `services/tech-step-intent-service` - **`temperature_extraction.py`** : `extract_temperatures(text, locale)`, pur, à base de regex — **indépendant du modèle spaCy et de l'entraînement** (extrait même pour une locale pas encore entraînée). - `ProcessResult` / `ProcessResponse` gagnent `temperatures` — **ajout additif** au contrat, `EntityPayload` inchangé. Liste à part des `entities` car une température porte des champs structurés (`celsius` / `gas_mark` / `qualitative`). Clé `gas_mark` en snake_case sur le fil. - Tests : `test_temperature_extraction.py` (10 cas) ; `test_routes_process.py` — les 2 assertions d'égalité stricte gagnent `"temperatures": []`, +1 nouveau cas. **15/15 verts** (`test_temperature_extraction` + `test_routes_process`). ## `apps/api` - `IntentServiceTemperature` dans `intent-service-client.ts` (mappe `gas_mark` → `gasMark` à la frontière). - `TechStepMatch.temperatures` : chaque température rattachée à la clause dont le span la contient — **même règle que les ustensiles** (`matchTechStepSpans`). - `model StepTechStepTemperature` — **aucune FK** (la valeur structurée *est* la donnée) ; migration manuelle `20260829120000_step_tech_step_temperature` (cascade via le `TRUNCATE` de `step_tech_step`, comme `_ingredient` / `_utensil` — rien à ajouter à `reset-db.ts`). - Persistance + lecture : `recipe.service.ts` (`recipeInclude` + `toStepTechStepViews`), include de séquence fraîche du service de correction, `sources.service.ts` (aperçu d'import) les fait transiter. Nouveau cas dans `recipe.test.ts`. ## `packages/shared` `StepTechStepTemperatureView` + `temperatures` sur `StepTechStepView`. ## `apps/web` - **`splitDescriptionSegments`** enrobe `splitDescriptionByTechSteps` et redécoupe les runs *non-keyword* autour des spans de température — la logique technique intriquée (bien couverte par tests) reste **intacte**. `?? []` tolère une payload d'avant `temperatures` (corrige une régression : les fixtures Cypress mockées n'ont pas le champ). - `StepDescription` : surlignage `.step-temperature` (accent Vermillion, `--low`/`--high` varient juste l'épaisseur du soulignement) + Tooltip via `temperatureLabel`. i18n `recipes.temperature.{celsius,gasMark,qualitative.*}`. - Tests composants +4 → **22/22 verts**. Pas d'UI de correction pour les températures (v1, comme les ustensiles). L'optimiseur batch-cooking ne les consomme pas encore. ## Vérification - `biome check` propre ; `tsc -b` (web + api) ; `pnpm -r build` 6/6. - Cypress `web` e2e : **102/103** (l'unique échec = flake pré-existant `recipe-form.feature`, identique à `main`) ; **49/49** composants. - `pnpm --filter api test` (Postgres :5433 + `tech-step-intent-service` requis) **non lancé ici** — à faire avant merge. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
kyuno added 1 commit 2026-08-29 17:38:39 +02:00
feat(tech-steps): detecte les temperatures dans les etapes
Some checks failed
CI / build (push) Successful in 3m31s
CI / lint (push) Successful in 4m15s
CI / e2e (push) Failing after 8m37s
CI / intent-service-test (push) Successful in 12m2s
CI / test (push) Failing after 21m35s
a04d796167
3e type de metadonnee de clause, a cote des ingredients et des ustensiles :
temperature en °C (« 180°C », « 200 degres », °F converti), numero de
thermostat (« th. 6 ») et intensite qualitative (« feu doux/moyen/vif » ->
low/medium/high).

services/tech-step-intent-service :
- `temperature_extraction.py` : `extract_temperatures(text, locale)` pur,
  a base de regex (independant du modele spaCy et de l'entrainement).
- `ProcessResult` / `ProcessResponse` gagnent `temperatures` (ajout additif
  au contrat ; cle `gas_mark` en snake_case sur le fil). `process()` les
  extrait meme pour une locale pas encore entrainee.
- Tests `test_temperature_extraction.py` (10) ; `test_routes_process.py` :
  2 assertions d'egalite stricte gagnent `"temperatures": []`, +1 cas.

apps/api :
- `IntentServiceTemperature` (mappe `gas_mark` -> `gasMark` a la frontiere).
- `TechStepMatch.temperatures` : filtrees par appartenance de span a la
  clause, meme regle que les ustensiles.
- `model StepTechStepTemperature` (aucune FK — la valeur structuree EST la
  donnee) + migration manuelle `20260829120000_step_tech_step_temperature`
  (cascade via le TRUNCATE de `step_tech_step`, rien a ajouter a
  reset-db.ts). Persistance + lecture dans `recipe.service.ts`
  (`recipeInclude`, `toStepTechStepViews`) et l'include de sequence fraiche
  du service de correction ; `sources.service.ts` (apercu d'import) les
  fait transiter.

packages/shared : `StepTechStepTemperatureView` + `temperatures` sur
`StepTechStepView`.

apps/web :
- `splitDescriptionSegments` enrobe `splitDescriptionByTechSteps` et
  redecoupe les segments non-keyword autour des spans de temperature (la
  logique technique intriquee reste intacte). `?? []` tolere une payload
  d'avant `temperatures`.
- `StepDescription` : surlignage `.step-temperature` + Tooltip via
  `temperatureLabel` ; i18n `recipes.temperature.*`.
- Tests composants +4 (22 verts) ; pas d'UI de correction (v1, comme les
  ustensiles).

Verifie : biome + tsc + `pnpm -r build` ; web 102/103 e2e (l'echec est le
flake pre-existant recipe-form.feature, sans rapport) + 49/49 composants ;
pytest temperature + routes 15/15. `pnpm --filter api test` (Postgres +
intent-service requis) non lance ici.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno force-pushed feat/temperature-metadata from a04d796167 to 189df73b4c 2026-08-29 19:29:12 +02:00 Compare
kyuno added 1 commit 2026-08-29 19:59:56 +02:00
test(tech-steps): ajoute temperatures aux fixtures StepTechStep
All checks were successful
CI / lint (push) Successful in 2m27s
CI / build (push) Successful in 3m33s
CI / e2e (push) Successful in 8m27s
CI / intent-service-test (push) Successful in 11m14s
CI / test (push) Successful in 20m57s
fd62dbbabe
CI: 7 `deep.equal` sur un `TechStepMatch` / `StepTechStepView` echouaient
(l'objet reel a une cle de plus depuis l'ajout de `temperatures`).

- tech-step-matcher.test.ts x4 : `temperatures: []`, sauf le cas
  « Faire mijoter a feu doux » ou « feu doux » [16,24) est une mention
  qualitative -> `qualitative: "low"`.
- recipe-tech-step-correction.test.ts x3 : `temperatures: []` (l'etape
  fixture « Faire mijoter la sauce. » n'a pas de mention de temperature).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno merged commit b1e7fbb5fb into feat/merge-admin-into-web 2026-08-29 21:15:57 +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#19
No description provided.