Response protocol: digit positions + Enter confirms (digit alone is not enough); arrows+Enter work everywhere. Registry detects waiting state for both permission and AskUserQuestion dialogs (same waitingFor label — fine-grained dialog typing needs screen reading). Sandboxed bash runs no-prompt for most commands: real waits come from edits/network/ questions. Pre-trust via ~/.claude.json projects[dir] .hasTrustDialogAccepted captured and plausible. Esc-deny and plan approval deferred to P4 reliability campaign.
3.6 KiB
3.6 KiB
Spike S3 — dialogues TUI, frappes, flood — VERDICT : ✅ GO (partiel documenté)
Exécuté le 2026-06-11 (CLI 2.1.173). Scripts : run.mjs (passe 1), run2.mjs (passe 2), flood.mjs. Résultats bruts dans captures/.
Dialogues testés
| Dialogue | Détection | Options extraites | Réponse validée |
|---|---|---|---|
| Trust dialog (nouveau dossier) | écran seul (précède le registre) — motif trust + ❯ sur texte aplati |
❯1. Yes, I trust this folder / 2. No, exit — « Enter to confirm · Esc to cancel » |
Entrée ✅ (10+ occurrences via S1/S3) |
| Permission Write (création/édition de fichier) | registre status: waiting, waitingFor: "permission prompt" + écran |
❯1. Yes / 2. Yes, allow all edits during this session (shift+tab) / 3. No — « Esc to cancel · Tab to amend » |
chiffre seul insuffisant ; chiffre puis Entrée ✅ (fichier créé) |
| AskUserQuestion | registre waiting (même waitingFor: "permission prompt" — le registre ne distingue pas les types) |
❯1. Rouge / 2. Bleu / 3. Type something. / 4. Chat about this — « Enter to select · ↑/↓ to navigate · Esc to cancel » |
↓ + Entrée ✅ (tour complété, bonne option choisie) |
| Permission Bash | non déclenchée : echo est dans l'allowlist par défaut ET node -e s'exécute dans le bash sandboxé du CLI 2.x sans prompt |
— | — |
| Refus par Esc | non exercé (quota) ; « Esc to cancel » affiché sur les deux dialogues observés | — | à valider en P4 |
Enseignements structurants
- Le protocole de réponse est : (chiffre pour positionner) + Entrée pour confirmer. Entrée seule valide l'option pré-sélectionnée (
❯). Flèches ↑/↓ + Entrée fonctionnent partout. → L'UI mobile enverra<chiffre>+\r. - Le registre
~/.claude/sessionsdétecte les états d'attente des dialogues outils (permission ET AskUserQuestion) avec le mêmewaitingFor: "permission prompt"→ le typage fin du dialogue (question vs permission, options) exige la lecture d'écran (@xterm/headlessen prod ; le strip ANSI naïf mange les espaces — voir VERDICT S1). - Il y a moins de prompts de permission que prévu : le bash sandboxé exécute sans prompt les commandes sans réseau/écriture hors workspace. Les vrais
waitingviennent des éditions de fichiers, du réseau, d'AskUserQuestion et des plans. Bonne nouvelle pour l'UX (moins d'interruptions), à intégrer aux fixtures P4. - Pré-trust programmatique plausible : accepter le dialogue écrit
projects["<dir>"].hasTrustDialogAccepted: truedans~/.claude.json(structure complète capturée). À la création d'un worktree, écrire cette entrée (avec consentement explicite dans la modal) éviterait le dialogue — à valider en P2/P3. - La regex d'options
^\s*(❯\s*)?(\d+)\.\s*(.+)$fonctionne sur le texte aplati (labels concaténés mais exploitables).
Volet flood (node-pty pause/resume) — ✅ GO complet
21,5 Mo streamés ; pause de 10 s → 0 octet reçu pendant la pause, bash survit, flux complet après resume (marqueur final intact, aucun octet perdu) ; écho 4,7 ms après le flood ; ~21 Mo en ~0,7 s hors pause.
Reste à faire (P4, avant les boutons mobiles)
- Exercer le refus par Esc et le dialogue « No, and tell Claude… » (champ texte).
- Approbation de plan (plan mode) non testée.
- Campagne de fiabilité 10/10 par type de dialogue (le critère complet du spike) — à automatiser comme tests d'intégration du claude-adapter.
- Le MVP (P3) n'a PAS besoin de tout ça : les boutons d'approbation sont en P4 ; le fallback « ouvrir le terminal » couvre tous les cas.