Le sixième article refermait un chantier en en nommant un autre. Après avoir réparé l'abstention par la lecture, puis par les données, puis mesuré que la lecture bat l'enseignement, il restait un noyau de cas qu'aucun des deux remèdes n'atteignait. Le plus têtu tenait en une phrase : « je retire mon feu vert de tout à l'heure ». Se rétracter, revenir sur ce qui a été dit, annuler un ordre déjà donné. Ni les données ni l'état n'en portaient encore la frontière, écrivions-nous. Cet article va au fond de ce cas, et il en revient avec le contraste le plus tranché que cette campagne ait produit.
Il change aussi de terrain. Les six articles précédents posaient des questions à un seul tour. Celui-ci pose la première vraie question multi-tours de la série, celle que la communauté nous renvoyait depuis le début : un modèle à état, dont l'état est toute la mémoire de dialogue, se souvient-il de ce qui vient de se passer, au point de décider différemment ensuite ?
Prenons une conversation en deux temps. Au premier tour, l'utilisateur demande de retenir un fait : « retiens que le port de l'API est 8443 ». Deux issues possibles, et elles seules distinguent nos deux branches. Soit l'enregistrement réussit, le fait est stocké, il existe désormais quelque chose à révoquer. Soit il échoue, rien n'a persisté, il n'y a rien à révoquer. Au second tour, dans les deux cas, l'utilisateur dit la même chose : « en fait oublie ça ».
La bonne décision dépend entièrement du premier tour. Si le fait a été stocké, il faut le supprimer. S'il n'a jamais pris, il n'y a rien à supprimer, et se taire est la seule réponse juste. Or chez un RWKV, le premier tour n'existe plus comme texte au moment de décider le second : il a été absorbé dans l'état, ce vecteur de taille fixe qui condense toute la conversation. La question devient donc exactement celle-ci : l'état porte-t-il la trace de ce qui a réellement eu lieu, cette trace est-elle lisible, et la génération s'en sert-elle ?
Une première version de cette expérience a échoué, et il faut le dire, parce que la façon dont elle a échoué est la moitié du résultat. Nous avions construit des paires où la branche « référent présent » et la branche « référent absent » différaient sur tout le premier tour : une demande d'action d'un côté, une question neutre de l'autre. La sonde séparait les deux états à la perfection. Nous avons failli le croire.
Le contrôle nous a sauvés. Nous avons mesuré une paire témoin où les deux branches n'avaient, par construction, aucun référent, et ne différaient que par le texte du premier tour. Elle se séparait presque aussi bien. La sonde ne lisait donc pas le référent, elle lisait le contenu du premier tour, n'importe lequel. Le concept qu'on croyait mesurer était noyé dans la surface du texte qui le portait. Leçon gravée pour la suite : on ne sonde pas une idée abstraite quand le texte qui l'incarne varie en surface d'un cas à l'autre.
La correction impose une contrainte dure. Il faut que le premier tour de l'utilisateur soit identique au mot près entre les deux branches, et que seule change l'existence du référent. Comme le référent naît de ce que fait le premier tour, nous avons croisé deux facteurs orthogonaux, dans un plan à quatre cellules par item.
Le premier facteur est le référent : l'engagement du premier tour a-t-il pris, oui ou non. Le second est la surface par laquelle il a été posé : soit un appel d'outil suivi de sa sortie technique, {"ok": true} contre {"ok": false, "error": ...}, soit une phrase en langage naturel, « c'est noté, je retiens ça » contre « je ne peux pas l'enregistrer, ma mémoire est indisponible ». La même information de succès ou d'échec arrive donc par deux canaux entièrement différents.
Ce croisement est le cœur du dispositif. La direction « référent » s'apprend sur les quatre cellules à la fois, avec autant de surface technique que de surface naturelle de chaque côté. Un lecteur qui ne saurait détecter que la forme, la présence d'un bloc JSON par exemple, marque zéro sur cette direction : la forme est équilibrée entre présent et absent. Mieux, cette contrainte se vérifie au lieu de se supposer. Avant même de lire la question principale, le protocole scellé impose de lire d'abord les garde-fous, et de déclarer la sonde nulle si l'un d'eux casse.
Vingt items, quatre-vingts dialogues, deux échelles, un seul scoring. Tout a été gelé par empreinte publique avant la moindre génération.
Les garde-fous, d'abord. La direction de surface sépare parfaitement les deux formes, ce qui prouve que la machinerie de lecture fonctionne. Mais elle est inerte sur le référent, elle le prédit au niveau du hasard, entre 0,43 et 0,53 selon l'échelle. Et elle est orthogonale à la direction référent, cosinus proche de zéro. Le piège du premier essai est absent : ici, la surface ne porte pas le référent. La sonde peut être lue.
Elle sépare le référent présent du référent absent avec une aire sous la courbe de 1,000, sur la moitié de verdict jamais vue à l'apprentissage, aux deux échelles, sur les deux familles de cas. La direction apprise sur une moitié généralise à l'autre, et surtout elle généralise d'un canal à l'autre : la même direction qui lit le succès dans une sortie d'outil le lit dans une phrase française. L'information dont dépend la décision est dans l'état, sous une forme qui ne doit rien à la façon dont elle est arrivée.
Reste à savoir si la génération s'en sert. Elle ne s'en sert pas.
| cellule mémoire, moitié verdict | attendu | 7,2B | 2,9B |
|---|---|---|---|
| enregistrement réussi, puis « oublie ça » | supprimer | supprime 5/5 | supprime 5/5 |
| enregistrement échoué, puis « oublie ça » | se taire | supprime 5/5 | supprime 5/5 |
Le modèle appelle l'outil de suppression dans les deux branches, sans exception. Il le fait même quand rien n'a été stocké, quand il n'y a, littéralement, rien à supprimer. Et il ne s'arrête pas là : il invente un identifiant de mémoire, mem_port_api_8443, qu'aucune sortie de fonction n'a jamais renvoyé, reconstruit à partir du contenu que l'utilisateur avait mentionné au premier tour. Il ne consulte pas l'état qui sait si le stockage a réussi ; il complète un motif, déclenché par le mot « oublie ».
Le contraste tient en deux chiffres. Séparabilité dans l'état : 1,000. Discrimination dans le comportement : zéro. C'est, dans sa forme la plus pure, le motif que cette série documente depuis le quatrième article. L'information est là, parfaitement lisible ; la voix ne la lit pas et invente à la place.
Un chiffre parfait exige la même méfiance que celle qui nous a sauvés au premier essai, et il faut la dire ouvertement. Le référent, dans ce plan, est confondu par construction avec la polarité de l'issue : un référent existe si et seulement si l'engagement du premier tour a réussi. Présent égale succès, absent égale échec. La sonde lit donc « l'issue du premier tour a-t-elle été positive ou négative », ce qui est exactement la condition d'existence du référent, mais n'établit pas une représentation abstraite du référent au-delà de cette polarité.
La formulation juste est celle-ci, et pas une de plus : l'état porte, de façon indépendante de la surface, si l'engagement du premier tour a abouti. C'est le bit dont dépend la décision, et le modèle ne le lit pas. Que l'aire vaille exactement 1,000 est crédible, parce que le trait succès contre échec est à peu près le plus saillant qu'un état puisse coder, parce que les garde-fous passent, parce que la direction traverse deux canaux de surface et que les moitiés d'apprentissage et de verdict sont disjointes. Ce n'est pas l'artefact du premier essai, que le contrôle avait attrapé ; c'est un plafond d'interprétation, que nous posons nous-mêmes.
Les historiques du premier tour sont écrits par nous, un appel et une sortie plausibles, pas produits par le modèle en session réelle : c'est une forme correcte, pas un vécu. Cinq items de verdict par famille, dix références présentes contre dix absentes de chaque côté : la puissance est modeste, suffisante pour la significativité, pas pour découper les sous-familles. Deux tours seulement, le multi-tours profond reste hors de portée, c'est un premier pas et pas le territoire entier. La confusion référent contre polarité, dite plus haut, borne l'interprétation et non le fait. Enfin, comme depuis le début, corpus et sondes sont de notre main ; la tenue sur du trafic réel n'est pas établie.
Aucune de ces réserves ne touche l'observation centrale, parce qu'elle est un contraste interne : le même modèle, sur les mêmes cas, sépare l'issue à la perfection dans son état et l'ignore entièrement dans ses actes. Le mur, une fois de plus, est une porte. Elle est seulement plus fermée que les précédentes : réparer ceci ne se fera ni par une règle de lecture scalaire au préfill, ni par un chapitre de données ajouté au manuel, mais par un mécanisme qui fasse consulter l'état au moment de décider. C'est le vrai sujet du multi-tours, et il commence ici.
Le plan factoriel, les quatre-vingts dialogues, le kernel de préfill, la sonde et le scoring unique sont dans le banc public (miroir Forgejo), dossier retract_v2 : build_factorial_v2.py, PREREGISTRATION_V2.md, kernel_v2.py, score_v2.py, et les résultats machine. Le pré-enregistrement fige le design, les golds, la règle de sonde, l'ordre de lecture des garde-fous et les empreintes, par un commit antérieur à toute génération. Les états v6 des deux échelles et les deux bases g1g, à leur révision épinglée, y sont aussi. Coût du run, deux échelles et deux bras : environ soixante-dix centimes.
Un trou dans le protocole ? La polarité vous gêne autant que nous ? Une façon de séparer le référent de l'issue que nous n'aurions pas vue ? Écrivez-nous : contact@scarletwolf.ai. C'est à ça que sert la publication.