Un navigateur. Deux pilotes — selon l'enjeu.
Iris donne à l'IA un accès direct à Chrome — naviguer, cliquer, remplir un formulaire, lire ce qui s'affiche, comme un humain le ferait, sans Selenium ni Playwright. La chaîne est courte : un HTTP POST traverse un bridge Python jusqu'à une extension MV3, qui passe la commande en Chrome DevTools Protocol natif. Shadow DOM, SPAs, iframes, contenu derrière authentification — tout est accessible.
Deux pilotes selon l'enjeu. Pour les terrains nouveaux ou critiques — formulaire administratif, démarche bancaire, action où une erreur coûte des heures — c'est l'instance Claude qui pilote elle-même, lentement, prudemment, en pré-remplissant et en s'arrêtant avant le submit final pour validation humaine. Pour les terrains déjà connus — scraping routinier, recherche web, tâche battle-testée — un sub-agent dédié iris-driver prend le volant : il connaît les patterns, les pièges Django formset, les selectors qui changent.
Iris apprend de chaque visite. Chaque succès note les sélecteurs qui marchent ; chaque erreur note ce qui a piégé. site_memory.json grandit domaine par domaine — recettes, fast paths, mises en garde. La deuxième visite est plus rapide que la première, la dixième est presque instantanée. Une whitelist de domaines garde la sécurité : Iris ne pilote que ce qui a été explicitement autorisé.
Runtime.evaluate, Input.dispatchMouseEvent, Input.insertText — perce Shadow DOM, CSP, SPAs sans couche d'abstraction.
Claude direct quand l'enjeu est sérieux. Sub-agent iris-driver dédié quand le terrain est connu et la délégation efficace.
Sélecteurs, recettes, erreurs — appris par domaine, persistés dans site_memory.json. Visite N+1 plus rapide que N.
Iris ne pilote que les domaines explicitement autorisés. Pas de wildcard, pas de surprise.
L'extension push les changements de tab via chrome.runtime.Port — zéro polling, latence millisecondes.
Profile IrisProfile séparé du Default — cookies de l'utilisateur préservés, aucune contamination de session.