É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>
7.6 KiB
issueRef, version, updatedBy, updatedAt
| issueRef | version | updatedBy | updatedAt | ||||
|---|---|---|---|---|---|---|---|
| #69 | 11 |
|
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(leheight: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 soussm, ligne unique dèssm. - Lot 3 (terminal) :
TerminalViewexposeonReady(api)optionnel (desktop inchangé) ;api.sendpasse parterm.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). Celluleh-64→h-[60dvh].
Vérif QA (exécution réelle) — VERT
npm run typecheckexit 0 ·npx vitest run→ 85 files / 774 passed ·VITE_TRANSPORT=http npx vite buildOK.- CSS mobile confirmé DANS le bundle (les valeurs arbitraires Tailwind avec
env()no-opent en silence) :100dvh,60dvh, les 4safe-area-inset-*,viewport-fit=cover,.h-\[60dvh\]{height:60dvh}. - Non-régression desktop :
LayoutGridne passe pasonReady; 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
fe0e53eavant merge (les chiffres du carnet ne valaient que sur506d589) :npm run typecheckexit 0 ·npx vitest run→ 85 files / 774 passed, 0 échec ·VITE_TRANSPORT=http npx vite buildexit 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é ».