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

Open
kyuno wants to merge 2 commits from feat/temperature-metadata into feat/merge-admin-into-web
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 temperaturesajout 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_markgasMark à 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 StepTechStepTemperatureaucune 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>
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
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/temperature-metadata:feat/temperature-metadata
git checkout feat/temperature-metadata

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git checkout feat/merge-admin-into-web
git merge --no-ff feat/temperature-metadata
git checkout feat/temperature-metadata
git rebase feat/merge-admin-into-web
git checkout feat/merge-admin-into-web
git merge --ff-only feat/temperature-metadata
git checkout feat/temperature-metadata
git rebase feat/merge-admin-into-web
git checkout feat/merge-admin-into-web
git merge --no-ff feat/temperature-metadata
git checkout feat/merge-admin-into-web
git merge --squash feat/temperature-metadata
git checkout feat/merge-admin-into-web
git merge --ff-only feat/temperature-metadata
git checkout feat/merge-admin-into-web
git merge feat/temperature-metadata
git push origin feat/merge-admin-into-web
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.