/* SPDX-License-Identifier: AGPL-3.0-only
   SPDX-FileCopyrightText: 2026 Com'Together */
/* Tests de la CHAÎNE COMPLÈTE de la phrase (sentence.js) : ce que la personne voit/entend,
   pas seulement le verbe. tokens + ctx {tense, registre, genre} -> phrase finale.
   Mêmes catégories : contracts (règle du français) + limitations (documentées, non bloquantes).
   NB : le moteur renvoie la phrase en minuscules sans point final (la capitale/le point sont
   de la présentation) ; les attendus suivent donc cette convention. */
window.SENTENCE_TESTS = {
  contracts: [
    { tokens: [{ label: "je", subject: "je" }, { label: "mal" }], ctx: {}, expect: "j'ai mal", rule: "État construit avec AVOIR (j'ai mal) + élision je→j'." },
    { tokens: [{ label: "je", subject: "je" }, { label: "mal" }, { label: "à" }, { label: "le" }, { label: "ventre", color: "nom" }], ctx: {}, expect: "j'ai mal au ventre", rule: "Contraction à + le → au." },
    { tokens: [{ label: "je", subject: "je" }, { label: "mal" }], ctx: { tense: "passe" }, expect: "j'ai eu mal", rule: "L'auxiliaire inséré se conjugue au temps courant (passé composé)." },
    { tokens: [{ label: "je", subject: "je" }, { label: "aller", verb: "aller" }, { label: "à" }, { label: "le" }, { label: "médecin", color: "nom" }], ctx: {}, expect: "je vais au médecin", rule: "Conjugaison du verbe + contraction à + le → au." },
    { tokens: [{ label: "je", subject: "je" }, { label: "parler", verb: "parler" }, { label: "de" }, { label: "le" }, { label: "voisin", color: "nom" }], ctx: {}, expect: "je parle du voisin", rule: "Contraction de + le → du." },
    { tokens: [{ label: "nous", subject: "nous" }, { label: "manger", verb: "manger" }], ctx: { tense: "imparfait" }, expect: "nous mangions", rule: "Imparfait -ger (mangions)." },
    { tokens: [{ label: "je", subject: "je" }, { label: "commencer", verb: "commencer" }], ctx: { tense: "imparfait" }, expect: "je commençais", rule: "Imparfait -cer (cédille)." },
    { tokens: [{ label: "elle", subject: "elle" }, { label: "content" }], ctx: {}, expect: "elle est contente", rule: "État construit avec ÊTRE + accord féminin (elle)." },
    { tokens: [{ label: "je", subject: "je" }, { label: "content" }], ctx: { genre: "feminin" }, expect: "je suis contente", rule: "Accord féminin selon le locuteur (réglage genre)." },
    { tokens: [{ label: "je", subject: "je" }, { label: "vouloir", verb: "vouloir" }, { label: "manger", verb: "manger" }], ctx: {}, expect: "je veux manger", rule: "Un verbe qui suit un verbe reste à l'infinitif (Bescherelle)." },
    { tokens: [{ label: "je veux", phrase: true }], ctx: { tense: "passe" }, expect: "j'ai voulu", rule: "Phrase rapide conjuguée au passé composé." },
    { tokens: [{ label: "je ne veux pas", phrase: true }], ctx: { tense: "present", registre: "oral" }, expect: "je veux pas", rule: "Négation orale : le « ne » tombe (registre oral)." },
    { tokens: [{ label: "je ne veux pas", phrase: true }], ctx: { tense: "present" }, expect: "je ne veux pas", rule: "Négation écrite : « ne … pas » conservé." },
    { tokens: [{ label: "donner", verb: "donner" }, { label: "le" }, { label: "moi" }], ctx: { tense: "imperatif" }, expect: "donne-le-moi", rule: "Impératif : pronoms après le verbe, traits d'union." },
    // --- REFUS / CONSENTEMENT / PROTECTION (priorité haute, ex-SEN-001) : verbe gouverné = infinitif à travers la négation ---
    { tokens: [{ label: "je", subject: "je" }, { label: "ne" }, { label: "vouloir", verb: "vouloir" }, { label: "pas" }, { label: "être", verb: "être" }, { label: "touché", color: "descriptif" }], ctx: { genre: "feminin" }, expect: "je ne veux pas être touchée", rule: "Refus/consentement : après un verbe conjugué gouvernant un infinitif, le 2e verbe reste à l'infinitif MÊME à travers la négation ; le participe s'accorde (touchée) sans conjuguer être selon le sujet." },
    { tokens: [{ label: "je", subject: "je" }, { label: "ne" }, { label: "vouloir", verb: "vouloir" }, { label: "pas" }, { label: "être", verb: "être" }, { label: "touché", color: "descriptif" }], ctx: {}, expect: "je ne veux pas être touché", rule: "Même règle au masculin par défaut." },
    { tokens: [{ label: "je", subject: "je" }, { label: "ne" }, { label: "vouloir", verb: "vouloir" }, { label: "pas" }, { label: "partir", verb: "partir" }], ctx: {}, expect: "je ne veux pas partir", rule: "Refus : infinitif gouverné conservé à travers « ne … pas »." },
    { tokens: [{ label: "je", subject: "je" }, { label: "ne" }, { label: "vouloir", verb: "vouloir" }, { label: "pas" }, { label: "manger", verb: "manger" }], ctx: {}, expect: "je ne veux pas manger", rule: "Infinitif gouverné conservé à travers la négation." },
    { tokens: [{ label: "je", subject: "je" }, { label: "ne" }, { label: "manger", verb: "manger" }, { label: "pas" }], ctx: {}, expect: "je ne mange pas", rule: "Non-régression : un SEUL verbe (pas d'infinitif gouverné) se conjugue normalement." },
    // --- Matrice refus/consentement élargie (verbes modaux, négations, subordonnées, pronoms) ---
    { tokens: [{ label: "je", subject: "je" }, { label: "ne" }, { label: "pouvoir", verb: "pouvoir" }, { label: "pas" }, { label: "parler", verb: "parler" }], ctx: {}, expect: "je ne peux pas parler", rule: "Modal pouvoir + infinitif gouverné à travers « ne … pas »." },
    { tokens: [{ label: "je", subject: "je" }, { label: "ne" }, { label: "vouloir", verb: "vouloir" }, { label: "plus" }, { label: "continuer", verb: "continuer" }], ctx: {}, expect: "je ne veux plus continuer", rule: "Négation « ne … plus » : infinitif gouverné conservé." },
    { tokens: [{ label: "je", subject: "je" }, { label: "ne" }, { label: "aimer", verb: "aimer" }, { label: "pas" }, { label: "ça" }], ctx: {}, expect: "je n'aime pas ça", rule: "Élision « ne » → « n' » devant voyelle (n'aime)." },
    { tokens: [{ label: "je", subject: "je" }, { label: "ne" }, { label: "être", verb: "être" }, { label: "pas" }, { label: "d'accord" }], ctx: {}, expect: "je ne suis pas d'accord", rule: "Désaccord : être conjugué + négation." },
    { tokens: [{ label: "je", subject: "je" }, { label: "vouloir", verb: "vouloir" }, { label: "qu'il" }, { label: "arrêter", verb: "arrêter" }], ctx: {}, expect: "je veux qu'il arrête", rule: "Subordonnée : le verbe de la subordonnée se conjugue (qu'il arrête)." },
    { tokens: [{ label: "je", subject: "je" }, { label: "ne" }, { label: "vouloir", verb: "vouloir" }, { label: "pas" }, { label: "qu'on" }, { label: "me" }, { label: "toucher", verb: "toucher" }], ctx: {}, expect: "je ne veux pas qu'on me touche", rule: "Refus/consentement avec subordonnée : je ne veux pas qu'on me touche." },
    // --- Infinitif gouverné À TRAVERS les CLITIQUES objets intercalés (régression trouvée par la comparaison jsRealB, build < 29x) ---
    { tokens: [{ label: "je", subject: "je" }, { label: "ne" }, { label: "vouloir", verb: "vouloir" }, { label: "pas" }, { label: "le" }, { label: "lui" }, { label: "donner", verb: "donner" }], ctx: {}, expect: "je ne veux pas le lui donner", rule: "Refus : le verbe gouverné reste à l'infinitif MÊME quand des clitiques (le lui) le séparent du modal — « donner », pas « donne »." },
    { tokens: [{ label: "est-ce que" }, { label: "tu", subject: "tu" }, { label: "pouvoir", verb: "pouvoir" }, { label: "me" }, { label: "le" }, { label: "donner", verb: "donner" }], ctx: {}, expect: "est-ce que tu peux me le donner", rule: "Modal pouvoir + clitiques (me le) + infinitif gouverné : « donner » reste à l'infinitif à travers les clitiques." },
    { tokens: [{ label: "je", subject: "je" }, { label: "le" }, { label: "manger", verb: "manger" }], ctx: {}, expect: "je le mange", rule: "Non-régression : un SEUL verbe précédé d'un clitique se CONJUGUE (je le mange), il ne bascule pas à l'infinitif." },
    { tokens: [{ label: "laisser", verb: "laisser" }, { label: "moi" }, { label: "tranquille" }], ctx: { tense: "imperatif" }, expect: "laisse-moi tranquille", rule: "Impératif d'un verbe -er non listé (regularER) : laisse-moi." },
    // --- RÉFLÉCHI : le clitique « se » s'accorde au sujet (build 318) ---
    { tokens: [{ label: "je", subject: "je" }, { label: "se" }, { label: "laver", verb: "laver" }], ctx: {}, expect: "je me lave", rule: "Réfléchi : se → me avec « je »." },
    { tokens: [{ label: "tu", subject: "tu" }, { label: "se" }, { label: "laver", verb: "laver" }], ctx: {}, expect: "tu te laves", rule: "Réfléchi : se → te avec « tu »." },
    { tokens: [{ label: "il", subject: "il" }, { label: "se" }, { label: "laver", verb: "laver" }], ctx: {}, expect: "il se lave", rule: "Réfléchi : se reste « se » à la 3e personne (non-régression)." },
    { tokens: [{ label: "nous", subject: "nous" }, { label: "se" }, { label: "laver", verb: "laver" }], ctx: {}, expect: "nous nous lavons", rule: "Réfléchi : se → nous avec « nous »." },
    // --- ACCORD DE NOMBRE dans le GROUPE NOMINAL (build 316/318) ---
    { tokens: [{ label: "les" }, { label: "chien", color: "nom" }, { label: "manger", verb: "manger" }], ctx: {}, expect: "les chiens mangent", rule: "Déterminant pluriel → nom au pluriel ET verbe à la 3e pers. du pluriel." },
    { tokens: [{ label: "des" }, { label: "grand", color: "descriptif" }, { label: "chien", color: "nom" }], ctx: {}, expect: "des grands chiens", rule: "GN pluriel : l'adjectif intercalé ne coupe pas l'accord (grands chiens)." },
    { tokens: [{ label: "le" }, { label: "chien", color: "nom" }, { label: "manger", verb: "manger" }], ctx: {}, expect: "le chien mange", rule: "Non-régression : déterminant singulier → 3e pers. du singulier." },
    // --- SUJET = NOM (3e personne, build 317) ---
    { tokens: [{ label: "le" }, { label: "chat", color: "nom" }, { label: "dormir", verb: "dormir" }], ctx: {}, expect: "le chat dort", rule: "Un nom sujet impose la 3e pers. (dort, pas dors)." },
    { tokens: [{ label: "les" }, { label: "chat", color: "nom" }, { label: "dormir", verb: "dormir" }], ctx: {}, expect: "les chats dorment", rule: "Nom sujet pluriel → 3e pers. du pluriel." },
    // --- SUJET DÉMONSTRATIF/INDÉFINI (build 318) ---
    { tokens: [{ label: "ça" }, { label: "dépendre", verb: "dépendre" }], ctx: {}, expect: "ça dépend", rule: "« ça » sujet → 3e pers. sing. (dépend, pas dépends)." },
    { tokens: [{ label: "ça" }, { label: "ne" }, { label: "aller", verb: "aller" }, { label: "pas" }], ctx: {}, expect: "ça ne va pas", rule: "« ça » sujet + négation (va, pas vais)." },
    { tokens: [{ label: "tout" }, { label: "aller", verb: "aller" }, { label: "bien" }], ctx: {}, expect: "tout va bien", rule: "« tout » sujet → 3e pers. sing." },
    // --- ACCORD de l'ADJECTIF ATTRIBUT en nombre (build 321) ---
    { tokens: [{ label: "ils", subject: "ils" }, { label: "content", color: "descriptif" }], ctx: {}, expect: "ils sont contents", rule: "Attribut accordé au pluriel avec « ils »." },
    { tokens: [{ label: "elles", subject: "elles" }, { label: "content", color: "descriptif" }], ctx: {}, expect: "elles sont contentes", rule: "Attribut : féminin PUIS pluriel (contentes)." },
    { tokens: [{ label: "il", subject: "il" }, { label: "content", color: "descriptif" }], ctx: {}, expect: "il est content", rule: "Non-régression : singulier reste invariable." },
    { tokens: [{ label: "vous", subject: "vous" }, { label: "content", color: "descriptif" }], ctx: {}, expect: "vous êtes content", rule: "« vous » : PAS d'accord pluriel auto (vouvoiement singulier possible)." },
    { tokens: [{ label: "ils", subject: "ils" }, { label: "faim" }], ctx: {}, expect: "ils ont faim", rule: "État en AVOIR : « faim » (nom) reste invariable, pas « faims »." },
    // --- NÉGATION de PROXIMITÉ : le « ne … pas » enveloppe le verbe le PLUS PROCHE (build 316) ---
    { tokens: [{ label: "je", subject: "je" }, { label: "content", color: "descriptif" }, { label: "je", subject: "je" }, { label: "vouloir", verb: "vouloir" }, { label: "ne pas", phrase: true }, { label: "jouer", verb: "jouer" }], ctx: {}, expect: "je suis content je ne veux pas jouer", rule: "Deux verbes : la négation reste sur « veux » (le plus proche du marqueur), pas sur « suis »." },
    // --- IMPÉRATIF + clitique enclitique au verbe PRÉCÉDENT (build 318) ---
    { tokens: [{ label: "montrer", verb: "montrer" }, { label: "moi" }], ctx: { tense: "imperatif" }, expect: "montre-moi", rule: "Impératif : « moi » (marqué sujet) est enclitique, pas supprimé." },
    { tokens: [{ label: "laisser", verb: "laisser" }, { label: "moi" }, { label: "finir", verb: "finir" }], ctx: { tense: "imperatif" }, expect: "laisse-moi finir", rule: "Clitique enclitique au verbe impératif PRÉCÉDENT ; l'infinitif gouverné (finir) reste à l'infinitif." },
    { tokens: [{ label: "écouter", verb: "écouter" }, { label: "moi" }], ctx: { tense: "imperatif" }, expect: "écoute-moi", rule: "Impératif -er + moi." },
    { tokens: [{ label: "mettre", verb: "mettre" }, { label: "le" }, { label: "ici" }], ctx: { tense: "imperatif" }, expect: "mets-le ici", rule: "Le pronom enclitique « -le » ne s'élide PAS avec le mot suivant (mets-le ici, pas mets-l'ici)." },
    { tokens: [{ label: "je", subject: "je" }, { label: "aimer", verb: "aimer" }, { label: "ça" }], ctx: {}, expect: "j'aime ça", rule: "Non-régression : l'élision proclitique normale fonctionne toujours (je → j')." },
    // --- INFINITIF après une amorce se terminant par une préposition (de/à/pour) ---
    { tokens: [{ label: "j'ai besoin de", phrase: true }, { label: "dormir", verb: "dormir" }], ctx: {}, expect: "j'ai besoin de dormir", rule: "Une amorce finissant par « de » gouverne l'infinitif (pas « j'ai besoin de dors »)." },
    { tokens: [{ label: "j'ai envie de", phrase: true }, { label: "partir", verb: "partir" }], ctx: {}, expect: "j'ai envie de partir", rule: "Idem « envie de » → infinitif." },
    { tokens: [{ label: "quelque chose", color: "nom" }, { label: "à" }, { label: "faire", verb: "faire" }], ctx: {}, expect: "quelque chose à faire", rule: "« à » (préposition finale) gouverne l'infinitif." },
    { tokens: [{ label: "le monde", color: "nom" }, { label: "dormir", verb: "dormir" }], ctx: {}, expect: "le monde dort", rule: "Non-régression : un nom finissant par « de » (monde) ne déclenche PAS l'infinitif (dort)." },
    { tokens: [{ label: "baisser", verb: "baisser" }, { label: "le" }, { label: "son", color: "nom" }], ctx: { tense: "imperatif" }, expect: "baisse le son", rule: "Impératif : « le » DÉTERMINANT d'un nom qui suit n'est pas un pronom enclitique (baisse le son, pas baisse-le son)." },
    { tokens: [{ label: "fermer", verb: "fermer" }, { label: "la" }, { label: "fenêtre", color: "nom" }], ctx: { tense: "imperatif" }, expect: "ferme la fenêtre", rule: "Idem « la » déterminant : ferme la fenêtre." },
    { tokens: [{ label: "prendre", verb: "prendre" }, { label: "le" }], ctx: { tense: "imperatif" }, expect: "prends-le", rule: "Non-régression : « le » PRONOM (rien après) reste enclitique (prends-le)." },
    // --- Formes NON FINIES au niveau PHRASE : pas de sujet, amorces conversationnelles préservées ---
    { tokens: [{ label: "je", subject: "je" }, { label: "aller", verb: "aller" }], ctx: { tense: "infinitif" }, expect: "aller", rule: "Infinitif : le pronom SUJET n'est pas rendu (pas de « j'aller »)." },
    { tokens: [{ label: "aller", verb: "aller" }], ctx: { tense: "infinitif" }, expect: "aller", rule: "Infinitif d'un verbe seul." },
    { tokens: [{ label: "tu", subject: "tu" }, { label: "manger", verb: "manger" }], ctx: { tense: "participepresent" }, expect: "mangeant", rule: "Participe présent : sujet non rendu, forme -ant." },
    { tokens: [{ label: "je veux", phrase: true }, { label: "aller", verb: "aller" }], ctx: { tense: "infinitif" }, expect: "je veux aller", rule: "Amorce figée (« je veux ») préservée en mode infinitif ; seul le verbe-tuile passe à l'infinitif." },
    { tokens: [{ label: "je", subject: "je" }, { label: "manger", verb: "manger" }], ctx: { tense: "present" }, expect: "je mange", rule: "Non-régression : en temps conjugué, le sujet reste (je mange)." },
    // --- QUAND mettre l'infinitif : après une PRÉPOSITION, le verbe reste à l'infinitif (Le Bon Usage) ---
    { tokens: [{ label: "pour" }, { label: "manger", verb: "manger" }], ctx: { tense: "present" }, expect: "pour manger", rule: "Infinitif après « pour » (pas « pour mange »)." },
    { tokens: [{ label: "je", subject: "je" }, { label: "aller", verb: "aller" }, { label: "pour" }, { label: "manger", verb: "manger" }], ctx: { tense: "present" }, expect: "je vais pour manger", rule: "Verbe principal conjugué (vais) + infinitif après « pour » (manger)." },
    { tokens: [{ label: "sans" }, { label: "parler", verb: "parler" }], ctx: { tense: "present" }, expect: "sans parler", rule: "Infinitif après « sans »." },
    { tokens: [{ label: "content" }, { label: "de" }, { label: "aller", verb: "aller" }], ctx: { tense: "present" }, expect: "content d'aller", rule: "Infinitif après « de » + élision (d'aller)." },
    { tokens: [{ label: "quelque chose" }, { label: "à" }, { label: "manger", verb: "manger" }], ctx: { tense: "present" }, expect: "quelque chose à manger", rule: "Infinitif après « à » (quelque chose à manger)." },
    { tokens: [{ label: "je", subject: "je" }, { label: "manger", verb: "manger" }, { label: "pour" }, { label: "vivre", verb: "vivre" }], ctx: { tense: "imparfait" }, expect: "je mangeais pour vivre", rule: "L'infinitif après préposition est invariant même quand la principale est à l'imparfait." },
    // --- Accord du participe passé (forme isolée, boutons féminin/pluriel) ---
    { tokens: [{ label: "aller", verb: "aller", fem: true }], ctx: { tense: "participepasse" }, expect: "allée", rule: "participe passé accordé au féminin : allée." },
    { tokens: [{ label: "aller", verb: "aller", plural: true }], ctx: { tense: "participepasse" }, expect: "allés", rule: "participe passé accordé au pluriel : allés." },
    { tokens: [{ label: "aller", verb: "aller", fem: true, plural: true }], ctx: { tense: "participepasse" }, expect: "allées", rule: "participe passé féminin pluriel : allées." },
    { tokens: [{ label: "ouvrir", verb: "ouvrir", fem: true, plural: true }], ctx: { tense: "participepasse" }, expect: "ouvertes", rule: "participe passé irrégulier accordé : ouvertes." },
    // --- Gérondif au niveau phrase : le sujet pronom est absorbé (en + participe présent) ---
    { tokens: [{ label: "je", subject: "je" }, { label: "manger", verb: "manger" }], ctx: { tense: "gerondif" }, expect: "en mangeant", rule: "gérondif : pas de sujet explicite (en mangeant)." },
    // --- Pronom TONIQUE après préposition (avec moi, pour toi, de lui, à eux) ---
    { tokens: [{ label: "avec" }, { label: "je", subject: "je" }], ctx: { tense: "present" }, expect: "avec moi", rule: "je → moi après « avec »." },
    { tokens: [{ label: "pour" }, { label: "tu", subject: "tu" }], ctx: { tense: "present" }, expect: "pour toi", rule: "tu → toi après « pour »." },
    { tokens: [{ label: "chez" }, { label: "il", subject: "il" }], ctx: { tense: "present" }, expect: "chez lui", rule: "il → lui après « chez »." },
    { tokens: [{ label: "à" }, { label: "ils", subject: "ils" }], ctx: { tense: "present" }, expect: "à eux", rule: "ils → eux après « à »." },
    { tokens: [{ label: "avec" }, { label: "elle", subject: "elle" }], ctx: { tense: "present" }, expect: "avec elle", rule: "elle reste elle (forme tonique identique)." },
    { tokens: [{ label: "je", subject: "je" }, { label: "vouloir", verb: "vouloir" }], ctx: { tense: "present" }, expect: "je veux", rule: "Non-régression : « je » sujet (hors préposition) reste « je »." },
    // --- Pronom ORPHELIN (rien à gouverner après) → tonique : « je » seul → « moi » ---
    { tokens: [{ label: "je", subject: "je" }], ctx: { tense: "present" }, expect: "moi", rule: "« je » seul (orphelin) → « moi »." },
    { tokens: [{ label: "tu", subject: "tu" }], ctx: { tense: "present" }, expect: "toi", rule: "« tu » seul → « toi »." },
    { tokens: [{ label: "il", subject: "il" }], ctx: { tense: "present" }, expect: "lui", rule: "« il » seul → « lui »." },
    { tokens: [{ label: "je", subject: "je" }, { label: "content", color: "descriptif" }], ctx: { tense: "present" }, expect: "je suis content", rule: "« je » + état → sujet conservé (je suis content), PAS « moi »." },
    { tokens: [{ label: "je", subject: "je" }, { label: "manger", verb: "manger" }], ctx: { tense: "present" }, expect: "je mange", rule: "« je » + verbe → sujet conservé (je mange)." },
    // --- Normalisation : objet tonique après verbe → clitique avant le verbe ---
    { tokens: [{ label: "je", subject: "je" }, { label: "aimer", verb: "aimer" }, { label: "toi" }], ctx: { tense: "present" }, expect: "je t'aime", rule: "objet « toi » après le verbe → « je t'aime »." },
    { tokens: [{ label: "je", subject: "je" }, { label: "aimer", verb: "aimer" }, { label: "moi" }], ctx: { tense: "present" }, expect: "je m'aime", rule: "objet « moi » → « je m'aime »." },
    { tokens: [{ label: "il", subject: "il" }, { label: "voir", verb: "voir" }, { label: "nous" }], ctx: { tense: "present" }, expect: "il nous voit", rule: "objet « nous » → « il nous voit »." },
    // --- Normalisation : négation « pas » autonome → « ne … pas » (écrit) / sans « ne » (oral) ---
    { tokens: [{ label: "je", subject: "je" }, { label: "pas" }, { label: "aimer", verb: "aimer" }, { label: "toi" }], ctx: { tense: "present" }, expect: "je ne t'aime pas", rule: "« je pas aime toi » → « je ne t'aime pas »." },
    { tokens: [{ label: "je", subject: "je" }, { label: "pas" }, { label: "aimer", verb: "aimer" }, { label: "toi" }], ctx: { tense: "present", registre: "oral" }, expect: "je t'aime pas", rule: "même entrée en registre oral → « je t'aime pas »." },
    { tokens: [{ label: "je", subject: "je" }, { label: "pas" }, { label: "manger", verb: "manger" }], ctx: { tense: "present" }, expect: "je ne mange pas", rule: "« je pas manger » → « je ne mange pas »." },
    { tokens: [{ label: "il", subject: "il" }, { label: "plus" }, { label: "manger", verb: "manger" }], ctx: { tense: "present" }, expect: "il ne mange plus", rule: "« plus » → « ne … plus »." },
    // --- Non-régression : « toi » après préposition reste tonique (pas d'objet) ---
    { tokens: [{ label: "je", subject: "je" }, { label: "aller", verb: "aller" }, { label: "avec" }, { label: "toi" }], ctx: { tense: "present" }, expect: "je vais avec toi", rule: "« toi » après préposition n'est PAS clitiquisé (avec toi)." },
    // --- Impératif NÉGATIF : pronom AVANT le verbe, sans trait d'union (ex-IMP-NEG-001) ---
    { tokens: [{ label: "ne" }, { label: "me" }, { label: "toucher", verb: "toucher" }, { label: "pas" }], ctx: { tense: "imperatif" }, expect: "ne me touche pas", rule: "Impératif négatif : « ne me touche pas » (pronom avant, pas de trait d'union)." },
    { tokens: [{ label: "ne" }, { label: "partir", verb: "partir" }, { label: "pas" }], ctx: { tense: "imperatif" }, expect: "ne pars pas", rule: "Impératif négatif sans pronom : ne pars pas." },
    { tokens: [{ label: "ne" }, { label: "le" }, { label: "faire", verb: "faire" }, { label: "pas" }], ctx: { tense: "imperatif" }, expect: "ne le fais pas", rule: "Impératif négatif : ne le fais pas." },
    { tokens: [{ label: "ne" }, { label: "en" }, { label: "manger", verb: "manger" }, { label: "plus" }], ctx: { tense: "imperatif" }, expect: "n'en mange plus", rule: "Impératif négatif : élision n'en + « plus » (n'en mange plus)." },
    // Non-régression : l'impératif POSITIF garde le pronom après le verbe avec trait d'union.
    { tokens: [{ label: "donner", verb: "donner" }, { label: "le" }, { label: "moi" }], ctx: { tense: "imperatif" }, expect: "donne-le-moi", rule: "Non-régression impératif positif : donne-le-moi." },
  ],
  limitations: [
    // IMP-NEG-001 résolue (build 289) → promue en contrat. Aucune limitation de phrase connue restante.
  ],
};
