Files
IdeA/.ideai/memory/ticket113-controlled-args-field-rootcause.md
Blomios 5efb026a80 chore(tickets): synchronise l'état runtime des tickets et de la mémoire
Clôture #114/#115/#116/#117, suppression #111, ouverture #119/#120/#121,
notes mémoire root-cause #113 et angle d'investigation #120.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-31 23:52:33 +02:00

1.7 KiB

name, description, metadata
name description metadata
ticket113-controlled-args-field-rootcause memory note ticket113-controlled-args-field-rootcause
type
project

Root cause confirmée dans le code (2026-07-31) : frontend/src/features/model-servers/ModelServersPanel.tsx:645-647 affiche value={draft.args.join(" ")} et parse via parseArgs (modelServer.ts:133, split(/\s+/).filter(non-vide)) à chaque onChange. Le state du champ est un string[] reconstruit en texte à chaque frappe, donc tout espace en fin de saisie ou espace double est immédiatement absorbé avant le prochain re-render : l'utilisateur ne peut jamais laisser un espace « en attente ».

Le même pattern existe à l'identique dans frontend/src/features/first-run/FirstRunWizard.tsx:264 (même parseArgs importé depuis first-run/profile.ts) — probablement le même bug latent, non signalé par l'utilisateur mais à couvrir dans le même correctif.

Why: classique piège de champ contrôlé dont le state est un type dérivé (array) plutôt que la chaîne brute tapée — le round-trip parse→join efface la saisie en cours.

How to apply: le fix attendu est purement frontend/local : garder une valeur de saisie brute en state local (string) pendant la frappe, ne convertir vers args: string[] qu'à la sortie du champ (blur/submit), sans reconstruire value depuis args.join(" ") à chaque onChange. Aucun changement domaine/backend/DTO nécessaire — args: string[] reste le contrat de sortie inchangé.