Files
IdeA/.ideai/tickets/69/carnet.md
Blomios 24f5e85974 chore(ideai): carnet de #69 — validation live partielle et réserve du lot 3
État `.ideai/` du chantier client téléphone, séparé du code applicatif
conformément aux précédents `5ee25d1` / `8e481ae`.

- Carnet #69 : périmètre exact de la validation live utilisateur sur téléphone
  réel (lots 1 et 2 validés en réel via l'appairage puis le workspace ; lot 3 —
  `TerminalKeyBar` et invariant de focus — NON exercé), arbitrage Main
  autorisant le merge avec réserve écrite, et report de l'écart Playwright
  vers #63 plutôt que vers un ticket neuf.
- Faits de topologie mis à jour après rebase sur `develop@fe0e53e` : les SHA
  cités (`e22ea5b`/`8f15ad6`/`6ed0087`) n'existaient plus sur aucune branche.
- Journal des tâches de fond : complétions enregistrées.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 15:15:45 +02:00

7.6 KiB
Raw Blame History

issueRef, version, updatedBy, updatedAt
issueRef version updatedBy updatedAt
#69 11
kind agent_id
agent cd0b4cf1-1bef-4fae-ade5-f0a6b49bbaf5
1784207736267

Ticket #69 — Adaptibilité client téléphone (carnet de chantier)

Statut : validation live utilisateur PARTIELLE effectuée — mergé dans develop avec réserve explicite sur le lot 3. Branche : feature/ticket69-mobile-responsive-client, rebasée sur develop @ fe0e53e (base d'origine 506d589). Commits après rebase : 48b8853 (shell), 62ecefe (terminal + tests), f0f2f3b (fix typecheck) — anciennement e22ea5b/8f15ad6/6ed0087. Arbre frontend/ identique bit pour bit avant/après rebase (git diff 6ed0087 HEAD -- frontend vide) ; historique d'origine conservé sur backup/ticket69-pre-rebase-6ed0087. Frontend uniquement — vérifié.

Cadrage Architect

Ticket frontend-pur : aucun changement DTO, use case, ni modèle LayoutTree. Contrats HTTP/WS et layout/terminal inchangés. Mais PAS du « CSS pur ».

⚠️ Le cadrage initial reposait sur un modèle FAUX (constat majeur)

Le lot 2 prévoyait « remplacer les docks gauche/droite/floating par une pile verticale/drawer/bottom sheet ». Il n'y a rien à remplacer : le client web n'a JAMAIS eu de docks, de fenêtres flottantes ni de LayoutTree. main.tsx route le mode http vers WebApp, surface autonome livrée par #13 : pairing ou WebWorkspace, déjà une colonne verticale unique. Les seuls imports @/features/* de tout features/web/ sont terminals et workstate — le shell desktop n'est pas atteignable depuis le web. ⇒ La question « bottom sheet vs drawer » ne se pose pas. Frontière épinglée par un test (WebMobile.test.tsx) + mémoire web-client-is-single-column-no-desktop-shell, pour que le cadrage ne reparte pas du même modèle faux.

Le vrai blocage était le terminal, pas le layout

Le clavier virtuel n'a ni Esc, ni Tab, ni Ctrl, ni flèches : on pouvait taper un prompt à un agent CLI mais pas l'interrompre, compléter un chemin, sortir d'un éditeur ou rappeler l'historique.

Livré

  • Lot 1 (shell) : 100dvh (le height:100% se résolvait sur le large viewport ⇒ la barre d'URL rétractable masquait le bas), viewport-fit=cover + safe-area insets, padding responsive, inputMode="numeric" sur le code d'appairage. Zoom laissé libre (accessibilité).
  • Lot 2 (réinterprété) : AgentLiveRow + rangée de tâche de fond (statut/kind/Cancel/Retry ne tenaient pas à 360px) s'empilent sous sm, ligne unique dès sm.
  • Lot 3 (terminal) : TerminalView expose onReady(api) optionnel (desktop inchangé) ; api.send passe par term.input() — même chemin qu'une frappe réelle, donc relais PTY + suspension du write-portal s'appliquent à l'identique (écrire sur le handle aurait court-circuité le portal). TerminalKeyBar : Esc/Tab/Ctrl-C/Ctrl-D/flèches en chips 44px ; chaque tap annule le déplacement de focus puis refocalise xterm (sinon le clavier virtuel se referme à chaque touche). Cellule h-64h-[60dvh].

Vérif QA (exécution réelle) — VERT

  • npm run typecheck exit 0 · npx vitest run → 85 files / 774 passed · VITE_TRANSPORT=http npx vite build OK.
  • CSS mobile confirmé DANS le bundle (les valeurs arbitraires Tailwind avec env() no-opent en silence) : 100dvh, 60dvh, les 4 safe-area-inset-*, viewport-fit=cover, .h-\[60dvh\]{height:60dvh}.
  • Non-régression desktop : LayoutGrid ne passe pas onReady ; chemin desktop inchangé.
  • Rendu réel Chrome headless 360×780 : pairing tient sans débordement horizontal.
  • Ré-exécutée par Git sur la base rebasée fe0e53e avant merge (les chiffres du carnet ne valaient que sur 506d589) : npm run typecheck exit 0 · npx vitest run → 85 files / 774 passed, 0 échec · VITE_TRANSPORT=http npx vite build exit 0. Identique — le rebase n'a rien cassé.

Réserve ASSUMÉE — trou de couverture réel

jsdom n'évalue PAS les media queries : les tests sont structurels, pas visuels. Ils ne prouvent NI le rendu aux breakpoints, NI l'effet réel de dvh, NI les safe areas, NI le clavier virtuel/focus sur navigateur mobile. QA : « acceptable pour merger avec réserve explicite », pas rouge. C'est exactement ce que la validation utilisateur doit couvrir.

Validation live utilisateur — PÉRIMÈTRE EXACT (2026-07-16)

Effectuée par l'utilisateur sur un vrai téléphone, contre le serveur idea-serve exposé via le reverse proxy https://idea.anthonybouteiller.ovh.

Couvert — verdict utilisateur : OK. « Le terminal s'ouvre correctement pour le téléphone. » Atteindre le terminal implique d'avoir traversé l'appairage puis le workspace : cela valide en réel le shell (lot 1) et la mise en page à taille de téléphone (lot 2), y compris le 100dvh et le 60dvh de la cellule terminal, que jsdom ne pouvait pas prouver.

NON couvert — angle mort qui subsiste. Le lot 3 n'a pas été exercé : la TerminalKeyBar (Esc/Tab/Ctrl-C/Ctrl-D/flèches) n'a pas été utilisée, et le comportement de focus au tap — l'invariant « chaque tap annule le déplacement de focus puis refocalise xterm », sans lequel le clavier virtuel se referme à chaque touche — n'a pas été observé sur un navigateur mobile réel. Or c'est le cœur du ticket : le carnet identifie le terminal, pas le layout, comme le vrai blocage.

Le test qui fermerait ce trou tient en 30 s : lancer une commande longue, taper Ctrl-C dans la barre de touches, vérifier (a) que la commande s'interrompt et (b) que le clavier virtuel reste ouvert.

Arbitrage Main : merge autorisé avec cette réserve écrite, pas effacée. Le risque résiduel est borné (surface frontend-pure, desktop non atteint, non-régression prouvée) et ne justifie pas de bloquer le sprint. Mais tant que le test Ctrl-C n'est pas fait, le lot 3 est livré et non prouvé en conditions réelles — à ne pas présenter comme validé.

Report de la réserve dans l'historique git (Git, 2026-07-16) : la réserve est recopiée dans le corps du commit de merge de develop. Un carnet peut être réécrit ; un message de commit mergé, non. Le fait « lot 3 non prouvé en réel au moment du merge » est donc daté et infalsifiable, indépendamment de ce fichier.

Écart de périmètre — Playwright : TRANCHÉ, reporté vers #63

Lot 4 demandait « Playwright ou équivalent ». DevFrontend a livré l'équivalent (vitest/jsdom) et REFUSÉ d'installer Playwright unilatéralement (binaires navigateur + surface CI = décision de dépendance qui remonte à Architect/Main) — refus fondé. QA : non bloquant pour ce lot. Décision Main (2026-07-16) : ne bloque pas #69 et ne donne PAS lieu à un ticket neuf. La décision de dépendance appartient à #63 « Système de test de l'UI », déjà ouvert, où elle sera tranchée avec la stratégie de test UI dans son ensemble plutôt qu'au coin d'un sprint serveur/client. Rationnel conservé : Playwright rend un vrai navigateur (media queries, dvh, safe areas évalués pour de vrai) et aurait attrapé automatiquement les deux bugs de classe « CSS silencieusement absent du bundle » corrigés ici ; il n'émule cependant qu'un téléphone et ne remplace pas la validation manuelle du clavier virtuel — sa valeur est d'empêcher la régression silencieuse entre deux validations manuelles.

Prochaine étape

Merge fait par Git (rebase + --no-ff dans develop, sans conflit). Le test Ctrl-C sur téléphone réel reste ouvert : s'il échoue, il ouvre un bug, il ne réverte pas le ticket. Le passage du ticket à un statut terminal appartient à Main : tant que le lot 3 n'est pas prouvé en réel, « mergé » ≠ « validé ».