Cornac
by TTC
Documentation Le manuel Cornac Driver

Version 1.57.0

Le manuel
Cornac Driver

L'automate qui pilote les bornes Acrelec : ce qu'il sait faire de l'écran, ce qu'il vérifie, et où atterrissent ses verdicts.

Le pendant du manuel Cornac Studio. Studio lit la caisse ; Driver agit sur la borne. Ils ne se recouvrent nulle part, et se passent la main à un seul endroit.

94scénarios écrits
11kits de campagne, 26 restaurants
61routes exposées par l'agent
84tests Go au vert
0ligne déployée sur la borne

Go · l'agent tourne sur la station d'automatisation, CDP par le réseau local

01

Pourquoi l'outil existe

Une campagne se termine sur un écran tactile. Le brief a beau être juste et la caisse bien configurée, ce que voit le client, c'est une tuile, un prix, un ordre de sauces et une photo. Personne ne peut vérifier ça à la main sur 26 restaurants avant chaque lancement.

Driver pilote la borne au niveau du DOM, via le Chrome DevTools Protocol — pas par simulation tactile ni reconnaissance d'image, toutes deux trop fragiles. Il clique ce qu'un client cliquerait, lit ce qu'un client lit, et compare au brief.

Le cornac guide l'éléphant → Cornac pilote la borne.

La règle qui a façonné toute l'architecture

On ne déploie rien sur la borne. Ni source, ni Go, ni git clone — c'est une règle de licence sur machine client, et elle explique la topologie entière : l'agent tourne sur la station d'automatisation et vise le CDP de la borne par le réseau. La borne n'a qu'une chose à faire : exposer son port de débogage.

Sur la station d'automatisation, il n'y a donc que des binairescornac-agent.exe et ses deux compagnons — jamais le dépôt.

02

Le socle

Trois machines, un protocole, et un point dur qu'il faut connaître avant de conclure quoi que ce soit d'un run rouge.

FRONTIÈRE DE LICENCE LA BORNE · MACHINE CLIENT portproxy :9222 port fixe, joignable depuis la station redirige vers CDP · port dynamique change à chaque relance du kiosk pilote ATP Browser · CEF 109 l'écran que voit le client data-read-text · data-automation 192.0.2.10 Rien de Cornac de ce côté : ni source, ni Go, ni binaire. CDP par le LAN pilote et lit le DOM LA STATION cornac-agent.exe :8080 recorder enregistre un parcours en le faisant runner joue un scénario, un set, un kit scan cartographie l'écran réel brief IA local, hors ligne rapports HTML auto-contenus, vidéo, captures 192.0.2.20 La station d'automatisation — les binaires seuls, jamais le dépôt. AILLEURS SUR LE RÉSEAU n° de commande les écrans visés Cornac Studio l'autre moitié de la suite lit la caisse Oracle Simphony l'API, et ses identifiants jamais en fin de run Jira · Xray tickets et Test Executions
Un seul processus, sur une seule machine. L'agent ne franchit la frontière de licence que par le réseau : la borne n'expose qu'un port de débogage, et rien de Cornac n'y est installé. Le lien vers la caisse passe par Studio — Driver n'a jamais d'identifiants Oracle, et c'est ce qui rend anodin le paquet déposé sur la station.

Le port CDP dynamique

Le point dur du projet, et la première chose à vérifier quand tout est rouge.

Le navigateur de la borne expose son CDP sur un port loopback qui change à chaque relance du kiosk. À chaque session, un script republie le port 9222 vers le vrai port : il scanne les ports en écoute, retient celui qui porte une page, recâble le portproxy, et relance iphlpsvc — sans quoi le port n'est pas re-bindé. C'était le point bloquant.

Ce que ça implique pour la lecture d'un rapport : si la borne a redémarré, le portproxy est tombé et le run échoue pour une raison qui n'a rien à voir avec l'application. C'est toute la distinction ÉCHEC / NON EXÉCUTÉ, et elle est portée jusque dans Jira. Demande de fond à Acrelec : rendre ce port fixe et permanent.
Prérequis de sessionÀ exécuter sur la borne

Les locators Acrelec

Comment cibler une tuile qui n'a ni identifiant de test, ni texte visible ?

Les écrans Acrelec exposent data-read-text (« Retour », « Menu épicé ») et data-automation. Le ciblage par texte et les assertions textuelles matchent ce libellé autant que le texte affiché, et sans tenir compte des accents. On atteint donc une tuile-image ou un bouton-icône qui n'affiche aucun mot.

C'est ce qui rend les scénarios lisibles : on écrit Coca-Cola, pas un sélecteur CSS de sept niveaux qui casserait au prochain build Acrelec.

Robuste sans data-testid

L'écran initial d'un scénario

Un test doit partir d'un état connu, pas de là où le précédent s'est arrêté.

Le flux borne va de l'attract loop à l'écran de service, puis au menu. Chaque scénario déclare où il démarre — attract, service, menu, ou un chemin comme À la carte > Sandwichs — et Driver y ramène la borne, reset compris, avant de jouer le premier pas. On déclare aussi le service (sur place / à emporter) et la langue.

Rejouable à l'identique
03

Cartographier l'écran

Avant d'écrire un test, il faut savoir ce qu'il y a vraiment à l'écran — le brief n'est pas toujours à jour, et un scénario écrit sur des libellés supposés échoue pour rien.

Le scan

Quelle est la vraie hiérarchie, avec les vrais libellés et les vrais prix ?

Le scan complet descend catégorie → sous-catégorie → produit et produit un arbre JSON plus une carte HTML repliable : les écrans dans leur ordre réel d'affichage, les articles avec leur prix et un sélecteur suggéré sous chacun.

Le scan ciblé répond au cas des builders profonds — une Box, avec ses étapes accompagnement, sauce, boisson, dessert. On navigue normalement à l'écran et chaque clic s'ajoute au chemin, puis on scanne depuis là. Les builders à étapes sont franchis tout seuls : si cliquer un produit ne change pas l'écran, Driver essaie « Continuer », « Suivant », « Valider », « Confirmer ».

Un scan complet n'atteint pas les builders — il plafonne en profondeur. C'est pour ça que le scan ciblé existe, et un troisième mode rejoue un parcours de clics fourni tel quel quand un bouton porte un libellé inhabituel.
Produit tree.json + carte HTML

Les décalages visible / accessibilité

Le texte affiché sur la tuile et son libellé d'accessibilité disent-ils la même chose ?

La carte du scan ouvre sur un encart qui liste tout écart entre le texte réellement affiché d'une tuile et son attribut d'accessibilité. Le genre de décalage qui ne se voyait qu'en ouvrant les devtools à la main — trouvé ainsi sur l'accueil : une tuile affichant « Sauce du moment » dont l'attribut disait encore « Boissons ».

Chaque tuile concernée porte aussi un badge à sa place dans l'arbre. Et une carte sans aucun décalage le dit explicitement, plutôt que de laisser une section vide et muette.

Défaut invisible à l'œil

L'audit des libellés

Mes 94 scénarios pointent-ils encore vers des libellés qui existent ?

Un passage unique rejoue le parcours de tous les scénarios connus et remonte tout libellé qui a dérivé — « Coca-Cola » écrit dans le scénario, « Coca-Cola 40cl » réellement affiché — ainsi que les vrais blocages. C'est ce qui évite de découvrir la dérive scénario par scénario, en pleine campagne.

Un bouton, pas un script à part
04

Écrire un scénario

Un scénario est un fichier JSON : un nom, un écran initial, une liste de pas. On ne l'écrit presque jamais à la main — on l'enregistre.

Le recorder

Enregistrer un parcours en le faisant, plutôt qu'en le décrivant.

L'écran de la borne est rejoué dans le navigateur de la station, en fenêtres flottantes. Survol : un cadre, et une infobulle qui donne le tag, le libellé d'accessibilité et le sélecteur. Clic gauche : un vrai clic, exécuté sur la borne et enregistré comme un pas. Clic droit : le menu des vérifications — cliquer par texte, lire, attendre, saisir, vérifier, capturer, comparer en bitmap.

Deux outils de diagnostic complètent le tableau quand un clic « ne fait rien » : la pile complète des éléments au point visé avec comparaison avant/après, et un diagnostic de défilement qui liste tous les éléments dont le contenu déborde avec la raison exacte du rejet de chacun — utile quand la molette ne fait rien et que le statut annonce « aucun panneau à défilement détecté ».

Recorder dans Edge · localhost:8080

Le pas, tel qu'il s'écrit

À quoi ressemble la matière produite ?

Un pas de vérification d'ordre, relié au brief dont il est issu. Les quatre derniers champs sont ce qui transforme un test en preuve opposable : le rapport affichera la phrase métier attendue à côté de la citation verbatim du brief.

scenarios/lunch-deal/… — écran des sauces
{
  "action": "assert",
  "selector": "#sauces acr-button-item",
  "mode": "order",
  "value": "Ketchup, Mayonnaise, Sauce ranch, …, Sans Sauce",
  "expected": "9 sauces, Ketchup en premier, Sans Sauce en dernier",
  "brief_source": "rules/lunch-deal.md — Écran des sauces",
  "brief_excerpt": "Il y a 9 sauces, dans cet ordre exact : …"
}
Une virgule dans un libellé casserait la liste — « Menus Sandwichs, Wraps & Salades » se coupait en deux faux morceaux et produisait un échec fantôme. Le séparateur bascule automatiquement sur ; dès qu'il apparaît dans la valeur attendue.
Relié au brief

Le pas connu mais pas encore réalisable

Que faire d'un check qu'on sait devoir exister, mais qu'on ne peut pas encore écrire ?

Un visuel annoncé dans un brief dont l'image de référence n'est pas fournie, un sélecteur qu'on ne peut pas résoudre faute de connexion live. Plutôt que d'omettre le pas ou d'inventer un sélecteur, on l'écrit avec le motif du blocage.

Driver ne l'exécute pas, l'affiche en orange dans le rapport avec son motif, et ne le compte ni en réussite ni en échec. Un run dont les seuls résultats non verts sont de ce type reste au vert. C'est la trace visible d'une dette de test, au lieu d'un trou invisible.

Convention orange
05

Ce qu'il vérifie

Onze familles de vérification, toutes exécutées sur la borne réelle. Elles couvrent exactement ce que Studio ne peut pas voir depuis l'API : ce qui est affiché.

VérificationCe qu'elle affirmeLe défaut qu'elle attrape
Présence par texteCe libellé est affiché sur cet écranUn produit du brief qui n'est jamais arrivé sur la borne
Absence par texteCe libellé n'est plus affichéLe bug le plus fréquent : un article retiré de la campagne, toujours à l'écran
Intitulé et prixLe texte lu contient ou vaut exactement l'attenduUn prix qui n'a pas suivi la campagne
OrdreLes tuiles apparaissent dans cet ordre précisUne grille réordonnée par un build Acrelec
NombreCet écran porte exactement N élémentsUn produit en trop, ou un manquant
DispositionLes éléments forment bien une grille 2×2Une mise en page qui casse sur un écran donné
Régression visuelleCette zone est pixel pour pixel identique à sa référenceUn visuel de tuile remplacé, un bandeau resté sur l'ancienne version
Coin de tuileLe « i » allergènes est cliquable sur la bonne tuileUn point d'entrée réglementaire devenu inatteignable
CarouselLes bannières défilent et portent le bon contenuUne bannière de campagne qui ne tourne pas
DéfilementLe panneau interne défile et révèle la suiteDes produits inaccessibles en bas d'un écran long
Dispatch en caisseLa commande passée est arrivée en caisse et part vers les bons écransLe maillon borne → caisse, vérifié par Studio

La règle permanente : l'ordre, pas seulement la présence

Posée le 31 juillet 2026, après deux oublis successifs : dès qu'un écran porte plus d'un élément, un contrôle d'ordre fait partie du scénario dès sa création — pas ajouté après coup si quelqu'un le remarque.

Le passage en revue qui a suivi a montré pourquoi : plusieurs scénarios ne testaient qu'une présence partielle — 3 sandwichs sur 11, 2 offres sur 6, 2 box sur 5, et une catégorie entière absente de l'écran d'accueil. Tous corrigés dans la même passe, à partir d'un vrai scan.

Le pas de dispatch doit suivre le paiement de près

La caisse ne liste que les commandes encore ouvertes. Dès l'encaissement, la recherche par numéro ne trouve plus rien — constaté sur une commande de test passée en closed en quelques minutes.

Ce pas se place juste après le paiement, jamais en fin de suite. Sinon il échoue pour une raison qui n'a rien à voir avec l'application, et c'est exactement le genre de faux rouge qui fait cesser de lire les rapports. Le paiement au comptoir aide : il laisse le check ouvert jusqu'à l'encaissement.

06

Du brief au test

Le brief arrive en PDF ou en Excel, écrit par le marketing. Le transformer en scénario est le travail le plus lent de la chaîne — c'est là que Driver a poussé le plus loin.

Les règles en texte libre

Écrire ce qu'on attend sans apprendre une syntaxe.

Les règles de vérification s'écrivent en langage naturel, une puce par règle vérifiable, avec les produits nommés comme ils s'affichent. Onze fichiers de campagne existent aujourd'hui. Ils servent deux fois : à générer les scénarios, et à alimenter la citation verbatim que le rapport met en face du résultat.

Ces mêmes fichiers sont lus par l'onglet Conformité campagne de Cornac Studio, qui confronte les règles à ce que sert l'API Simphony. Une règle écrite une fois est donc vérifiée des deux côtés — sur la borne et en caisse.
11 campagnes documentées

Le brief IA

Générer un brouillon de scénario directement depuis le PDF du brief.

Un modèle local — hors ligne, aucune donnée envoyée nulle part — produit un premier scénario à partir du brief, relu et corrigé par la QA. Une génération dédiée existe pour les allergènes : elle lit le classeur Excel des descriptifs et le croise avec le dernier scan pour retrouver le chemin de navigation de chaque produit.

Il apprend des corrections. Chaque scénario validé après retouche est conservé comme exemple et réinjecté aux générations suivantes. Pas de réentraînement — des exemples concrets remis en contexte, avec un effet immédiat.

Le choix du local n'est pas technique, il est contractuel : les briefs de l'enseigne sont confidentiels et ne doivent pas sortir de la station.
Hors ligneBrouillon relu par la QA
07

Exécuter

Le scénario, le set, le kit

Trois échelles, et elles ne veulent pas dire la même chose.

Un scénario est un parcours. Un test set en enchaîne plusieurs, chacun avec son propre reset et son écran initial, et rend un résultat combiné plus le détail par scénario. Un kit de campagne est la maille métier : onze kits couvrent les 26 restaurants, parce qu'un restaurant ne porte pas la même carte qu'un autre — « Standard + kit promo », « Gamme réduite + kit famille », « Standard sans taxe soda ».

Le kit s'ajoute au socle commun sans jamais écraser ce qui est déjà sélectionné, et se retire d'un clic.

Un seul run à la fois — une seconde demande est refusée franchement plutôt que mise en file. Deux parcours simultanés sur une seule borne ne veulent rien dire.
94 scénarios · 11 kits

Pendant le run

Ce qu'on voit, et ce qu'on peut faire.

La durée s'affiche en direct, le run se met en pause ou s'arrête, et une vidéo du parcours est enregistrée. Chaque pas ressort en réussite ou en échec, et toute défaillance déclenche une capture d'écran automatique dont le chemin est écrit dans le journal du pas concerné.

Vidéo + captures
08

Restituer

Un test qui trouve un défaut n'a servi à rien tant que le défaut n'est pas arrivé chez quelqu'un qui peut le corriger. C'est la moitié de l'outil.

Le résumé métier

Ce qu'un lecteur non technique doit pouvoir lire en dix secondes.

En fin de run : le parcours — les intitulés effectivement cliqués, lus sur les éléments eux-mêmes — et le panier, reconstitué depuis les valeurs captées qui évoquent un prix ou un total. « Sur place → Menu Burger », panier « 9,40 € ». Pas un sélecteur CSS en vue.

Lisible sans le contexte technique

Le rapport HTML

La preuve, autonome, transmissible.

Un rapport par scénario et un consolidé par set, auto-contenus — images en base64, donc lisibles par double-clic sans rien d'autre. Durée, vrai titre d'écran, détail dépliable par pas, et pour chaque vérification reliée au brief : la phrase métier attendue, la citation verbatim, et l'extrait du brief affiché côte à côte avec la capture de l'écran réel.

Le rapport porte aussi le numéro de version et la machine qui l'a produit — et l'heure de compilation gravée dans le binaire, qui ne ment pas, là où une date de fichier survit mal à une copie.

Auto-contenuJournal JSON à côté

La fenêtre Bugs, et l'hypothèse

Transformer un pas rouge en quelque chose qu'on peut envoyer.

Dès qu'un run a des échecs, une fenêtre s'ouvre : un bug par pas en échec, avec le cas de test, la station, l'écran, l'attendu, l'obtenu, l'erreur — et une hypothèse en langage métier sur la cause probable (« l'ordre a peut-être changé côté borne », « nécessite peut-être un défilement »).

L'hypothèse est une piste, pas un verdict, et le libellé le dit. Un diagnostic automatique présenté comme une conclusion serait pire que pas de diagnostic du tout.
Un bug par pas en échec

Jira

Créer le ticket sans quitter le rapport.

Un bouton dans le détail du bug crée le ticket dans le projet QA, avec le rapporteur choisi dans la liste réelle des comptes assignables, la description complète, et les pièces jointes — capture d'écran et extrait de brief. Les images sont réinsérées en ligne dans la description, pas reléguées en bas de page.

Le bouton parle à l'agent, pas à Jira : c'est l'agent qui détient les identifiants. Conséquence pratique — l'agent doit tourner pour que le bouton fonctionne, et il le dit clairement si ce n'est pas le cas. Une pièce jointe qui échoue n'empêche jamais la création du ticket.

Vérifié sur tickets réels

Xray

Faire remonter un run rouge jusqu'à l'exigence de campagne qu'il met en défaut.

Un scénario devient un Test, une passe de set devient une Test Execution portant un résultat par scénario. La projection est automatique en fin de run, sans écran ni bouton.

La couverture remonte par la Story : quand le Test échoue, la Story passe en NOK toute seule. C'est le point d'arrivée de toute la chaîne — un run rouge sur la borne rend visible, dans Jira, l'exigence de campagne qui n'est pas tenue.

Deux règles de prudence. La projection ne bloque jamais : Jira injoignable, le rapport est écrit quand même et l'échec est signalé à côté — sinon on transforme une recette kiosque en test de connectivité Atlassian. Et par défaut, seule une passe de set part : un scénario isolé relancé dix fois dans une soirée de mise au point n'a rien à faire dans l'historique.
Automatique en fin de runEssai à blanc par défaut

Les quatre statuts, et pourquoi il n'y en a pas cinq

L'instance ne connaît que PASSED, FAILED, TO DO, EXECUTING — il n'y a pas d'ABORTED. Un run empêché par l'environnement — borne injoignable, portproxy tombé — reste donc à TO DO, jamais FAILED.

C'est la distinction ÉCHEC / NON EXÉCUTÉ tenue jusqu'au bout de la chaîne. Sans elle, trois matins rouges pour une raison d'environnement suffisent à ce que plus personne ne lise les rapports.

09

Les angles morts

Driver voit un écran tactile, et rien d'autre. Voici la frontière exacte, et qui la couvre quand ce n'est pas lui.

MaillonÉtatQui couvre, ou ce qui manque
Écran de la borneCouvertLe domaine propre de Driver : textes, prix, ordre, nombre, disposition, visuels.
Enregistrement en caisseCouvertPar le pas de dispatch, qui délègue à Cornac Studio. Driver ne parle jamais à Simphony lui-même.
Configuration de la carteCouvertPar Studio, côté API : prix, compositions, taxes, remises, cohérence du parc.
Commande au comptoirHors périmètreDriver pilote une borne. Une commande saisie en caisse n'a pas d'écran à piloter — et l'écoute du poste de caisse reste ouverte chez Oracle.
Paiement par carteNon instrumentéLes terminaux sont fournis par un tiers, 217 au parc. C'est un maillon du parcours borne, et le kick-off d'intégration n'a pas eu lieu.
Ticket cuisine et écrans KDSNon observéDriver sait dire vers quels écrans une commande doit partir — via Studio. Il ne sait pas lire ce qui s'y affiche. Le matériel de recette est en ligne ; c'est la méthode de lecture qui manque.
Applications non-webDifféréLe pilotage passe par le DOM. Une application Windows native demanderait un adaptateur d'accessibilité — prévu dans l'architecture, derrière le même contrat, jamais construit faute de besoin.
Stabilité du port CDPContournéLe script de republication règle le problème à chaque session. La demande de fond — un port fixe et permanent — est chez Acrelec.

La frontière avec Studio, en une phrase

Driver agit et regarde l'écran ; Studio lit la caisse. Ils se passent la main à un seul endroit — le pas de dispatch — et c'est délibéré : le flux d'authentification Oracle, coûteux et fragile, existe une fois, dans Studio. Le réimplémenter ici donnerait deux versions qui divergeraient au premier changement d'API, et mettrait des identifiants Oracle administrateur dans le paquet qui part sur la station, où l'équipementier et l'enseigne ont la main.

10

S'en servir

Sur la station

Deux gestes, dans cet ordre.

D'abord sur la borne : republier le port CDP — c'est le prérequis de session, et l'oublier fait échouer tout le reste pour rien. Ensuite sur la station : double-clic sur le lanceur, qui ouvre le recorder dans Edge et démarre l'agent. La fenêtre noire reste ouverte pendant les tests.

Binaire seul, jamais le code

La livraison

Faire arriver une nouvelle version sur une machine qu'on n'administre pas.

Tout passe par le dossier OneDrive partagé : les binaires, le lanceur, les scénarios, les règles, le script de mise à jour. Deux archives sont déposées, dont une chiffrée — parce que l'antivirus de OneDrive refuse régulièrement un exécutable en faux positif, et qu'une archive chiffrée ne peut pas être scannée.

Déposer sur OneDrive ne met pas à jour l'agent déjà installé. Il faut relancer le script de mise à jour sur la station, ou ré-extraire l'archive. Cible durable : signer le binaire, ce qui éliminerait à la fois les faux positifs et le bandeau « éditeur inconnu ».
Geste manuel sur la station

Travailler à plusieurs sur le dépôt

Trois règles, nées d'une fusion douloureuse le 2 août 2026.

La branche principale est toujours livrable et personne n'y commite — on n'y arrive que par fusion. Une branche courte par sujet, poussée dès le premier jour, même inachevée : une branche qui vit sur un seul poste n'est ni sauvegardée, ni visible, ni fusionnable sans douleur.

Le numéro de version se pose à la fusion, jamais sur une branche. C'est la règle qui manquait : deux personnes avaient posé le même numéro, et il a fallu en renuméroter vingt-cinq à la main.

Un garde-fou local refuse les pousses directes. Ce n'est pas une sécurité — il s'installe poste par poste et se contourne d'une option. Il attrape l'erreur d'inattention, pas une intention. La vraie protection est côté serveur, et GitHub ne l'autorise pas sur un dépôt privé en formule gratuite.

Ce qui reste ouvert

  • Le port CDP fixe, chez Acrelec. Tout le reste du réseau et du pilotage est prouvé depuis longtemps ; il ne manque que la stabilité.
  • Le rattachement automatique d'un scénario à sa Story Jira. La correspondance est déjà écrite dans les fichiers de campagne — elle est aujourd'hui repassée à la main à chaque synchronisation.
  • Le rapport HTML en pièce jointe Xray. Médiane de 3 Mo, mais cinq rapports dépassent 50 Mo : il faut une variante allégée avant de les attacher.
  • La planification matin et soir, et le déclenchement sur livraison d'une version Acrelec. Conçu, jamais écrit — c'est le chantier du rapport hebdomadaire.

Cornac Driver — version 1.57.0, documentation au 26 août 2026
Agent · Recorder · Runner · Scan · Brief IA, et la projection vers Jira Xray
Suite Cornac : Driver (bornes Acrelec) · Studio (configuration, parc, commandes)