# Combot Automation Compact v3 : instructions LLM et référence du format

Donnez ce fichier entier au modèle avec votre demande de règle. Il décrit le format importé par l'éditeur Automation. Le langage est JSON Compact v3, pas Python, YAML, JavaScript, l'ancien Triggers v2 ni un pseudocode « si → alors » libre.
Les libellés de l’interface sont traduits, mais pas les valeurs JSON. Par exemple, `Known Combot links` correspond à « Liens d'invitation Combot » et `Combot custom admins` à « Administrateurs Combot » dans l’éditeur. Ne remplacez jamais ces valeurs JSON par les libellés de l’interface.

Révision : 9 septembre 2026. La référence a été comparée à l'éditeur et au traitement Automation. Les vérifications d'importation et Telegram figurent séparément à la fin : lire le code ne prouve pas la version d'un service en cours d'exécution.

## 1. Instructions pour le modèle

Traduisez la demande en règle Automation sans en modifier le sens.

1. Établissez événement, conditions, exclusions, action, destinataire et destination de réponse. Pour un planning, précisez le fuseau ; pour une commande, si elle est indépendante ou en réponse. N'ajoutez modération, récompense, hasard ou suppression que sur demande.
2. Ne devinez pas identifiants, sujets, adresses de groupes, invitations, rangs ou fonctions actives. Un nom de sujet n'est pas son identifiant. Posez des questions si des informations essentielles manquent. Vous pouvez proposer séparément une formulation, mais pas présenter une règle incomplète comme solution exacte.
3. Générez toujours les nouvelles règles avec `en: false`. C'est une convention de préparation prudente, pas une limite d'Automation. Omettre `en` signifie activée.
4. Utilisez seulement les champs documentés. Pour les filtres imbriqués portant « utiliser un export », demandez un véritable export similaire ; n'inventez pas la structure. Si un scénario n'est pas pris en charge, expliquez la limite plutôt que retirer silencieusement des conditions.
5. Répondez par une courte explication → un bloc JSON importable → les réglages et contrôles manuels. Le JSON ne doit contenir ni commentaires, points de suspension, identifiants de remplacement, explications hors champs, virgules finales ou clés inventées comme `when`, `if`, `then`, `conditions`, `actions` ou `event`.
6. Avant de rendre le résultat, raisonnez sur un cas correspondant et un cas non correspondant. Pour une commande en réponse, vérifiez séparément son auteur et celui du message original. N'affirmez pas avoir testé dans Combot si ce n'est pas le cas.

Le JSON Schema associé aide à générer de nouvelles règles désactivées. Ses champs obligatoires sont volontairement plus stricts que l'import, et il n'accepte pas tous les anciens exports. Les filtres imbriqués complexes ne sont vérifiés que comme objets. Respecter le schéma ne prouve ni compatibilité des conditions, disponibilité des ressources, respect de l'offre ou réussite dans Telegram.

## 2. Quoi coller dans Import

La racine est un objet avec `v: 3` numérique et un tableau de règles `t`. Renvoyez généralement une règle. Pas de tableau seul ni de `{"triggers": [...]}` : ce n'est pas le format du dialogue.

Exemple minimal complet :

```json
{
  "v": 3,
  "t": [
    {
      "n": "Commande d'information sur le cours",
      "en": false,
      "k": "c",
      "ctm": "p",
      "cm": ["/course_info"],
      "a": {
        "m": "a",
        "r": [
          {
            "i": "course_reply",
            "t": "s",
            "v": {
              "tx": "Les enregistrements du cours sont dans le message épinglé du groupe.",
              "rp": "r"
            }
          }
        ]
      }
    }
  ]
}
```

`dv: "t3.compact.3"` est une indication facultative de schéma. Les nouveaux résultats n'ont besoin que de `v` et `t`. L'import actuel reconnaît une enveloppe `bundle`, inutile pour la génération.

N'ajoutez pas de champs serveur `id`, `revision`, `chat_id`, de valeur calculée `ck` ou de `$schema` dans le paquet. Le serveur attribue un nouvel identifiant de règle. Le `i` d'action est différent : identifiant local de ligne, comme `course_reply`, unique dans les actions de la règle, de 1 à 80 lettres latines, chiffres, `_` ou `-`.

Une même clé courte change de sens selon le niveau : `t` racine est la liste des règles ; `a.r[].t`, le type d'action ; `a.r[].v`, les paramètres. Ne mélangez pas les niveaux.

## 3. Champs principaux

| Champ | Sens |
| --- | --- |
| `n` | Nom non vide, jusqu'à 80 caractères dans l'éditeur |
| `d` | Description facultative, jusqu'à 280 caractères |
| `en` | `false` pour une nouvelle règle désactivée |
| `e` | Tableau de codes d'événements, sauf commande |
| `k`, `cm`, `ctm` | Mode de commande ; voir plus bas |
| `a` | Plan d'actions : `{"m":"a","r":[...]}` ou `{"m":"r","r":[...]}` |
| `s`, `ti` | Où vérifier : groupe source, Général ou sujets sélectionnés |
| `at` | Quand une correspondance est autorisée ; filtre temporel, pas minuterie |
| `wh`, `wx`, `wm` | Auteur de l'événement : groupes inclus, exclusions et combinaison |
| `cgr` | Conditions numériques : présence, messages, avertissements, XP, réputation |
| `ua`, `ux`, `uar`, `ul`, `ulx` | Attributs, valeurs de profil et langue |
| `twh`, `twx`, `tcg`, `tua`, `tux`, `tur`, `tlg`, `tlx` | Autre personne de l'événement, comme l'auteur du message sélectionné ou le membre entrant |
| `tv`, `tr`, `ty`, `cs`, `lmin`, `lmax` | Conditions textuelles |
| `mti`, `mtx`, `me`, `mex` | Types de messages et entités textuelles |
| `il`, `ilc`, `ilx` | Invitations pour les demandes d'adhésion |
| `rct`, `rnt`, `rnx`, `rcy`, `rcx`, `rcn`, `rcm` | Conditions de réactions |
| `chl` | Lien direct d'une liste précise pour ses changements de tâches |
| `cl` | Nettoyage par défaut de la réponse précédente : `n` ou `ps` |
| `ov` | Ensembles alternatifs OU ; utiliser un export pour les cas complexes |

Ne remplissez pas tout. Ajoutez seulement les conditions demandées et pertinentes. Une arrivée n'a pas besoin de mots-clés et un compteur agrégé ne fournit pas de personne à récompenser automatiquement.

## 4. Événements

| `e` | Déclenchement |
| --- | --- |
| `["m"]` | Nouveau message du groupe |
| `["em"]` | Modification d'un message |
| `["m","em"]` | Nouveau message ou modification |
| `["lc"]`, `["el"]`, `["lc","el"]` | Commentaire lié, modification ou les deux |
| `["cp"]`, `["ec"]`, `["cp","ec"]` | Publication dans le contexte du canal lié, modification ou les deux |
| `["jr"]` | Demande d'adhésion |
| `["nm"]` | Arrivée d'un membre |
| `["ml"]` | Départ ou retrait d'un membre |
| `["cb"]`, `["rb"]` | Boost ajouté ou retiré |
| `["mr"]` | Changement de réactions d'un utilisateur précis |
| `["rc"]` | Actualisation des compteurs anonymes agrégés dans le contexte du canal lié |
| `["ck"]` | Nouvelle liste de tâches |
| `["cd"]` | Tâches marquées terminées |
| `["ca"]` | Tâches ajoutées |

Ne combinez pas des événements indépendants comme `["m","nm"]` ; créez des règles séparées. Les paires nouveau-plus-modifié indiquées sont permises. Ne générez pas le mode caché de bot invité `gm`.

Une modification est un déclenchement séparé. Ne l'ajoutez pas automatiquement aux XP, réputation, avertissements ou actions attendues une seule fois.

## 5. Commandes simples et commandes en réponse

Une commande simple d'information :

```json
{"k":"c","ctm":"p","cm":["/course_info"]}
```

Une commande de modérateur en réponse à un membre :

```json
{"k":"c","cm":["/team_pause"]}
```

Ce sont des fragments de champs, pas des paquets complets.

N'ajoutez pas `e` à une commande. Fournissez dans `cm` une liste non vide de commandes personnalisées en minuscules avec barre oblique, lettres latines, chiffres et `_`. Ne présentez pas un nom inventé comme intégré à Combot. Pour les réponses, omettez `ctm` ; n'écrivez ni `reply_target`, `r` ni nom de personne.

Une commande simple n'a pas de destinataire d'action utilisateur. Utilisez un envoi et, seulement sur demande explicite, la suppression de la commande. Restrictions, avertissements, XP et autres actions personnelles nécessitent une commande en réponse.

Dans une telle commande, `wh` vérifie son auteur ; `twh` et les autres `t...` vérifient l'auteur du message choisi. Utilisez `v.tg: "t"` pour agir sur ce dernier. Si Anna répond `/team_pause` à Ilya, restreignez Ilya, pas Anna.

Vérifier uniquement `twh` ne limite pas les personnes autorisées à appeler la commande. Une commande de modération doit avoir `wh` selon la demande. L'action `d` supprime la commande, pas le message d'Ilya.

Ne remplacez pas le mode de commande par une recherche de `/team_pause` dans `tv`. Sans export vérifié, n'ajoutez pas de conditions cachées par l'éditeur pour les commandes, comme un planning.

## 6. Membres et exclusions

`wh` et `wx` utilisent ces valeurs exactes, non traduites :

`New members`, `Regular members`, `Ex-members`, `Whitelisted users`, `Admins`, `Telegram admins`, `Combot custom admins`, `Owner`.

Une liste d'inclusion vide n'impose aucune restriction de groupe. `Anyone` peut généralement être omis. `wm: "o"` exige un groupe correspondant ; `wm: "a"`, tous les groupes choisis. `wx` empêche la correspondance indépendamment des groupes positifs.

Exemple : tout le monde sauf les administrateurs peut envoyer le message correspondant :

```json
{"wx":["Telegram admins","Combot custom admins","Owner"]}
```

Exemple : seuls administrateurs Telegram ou propriétaire peuvent lancer la commande :

```json
{"wh":["Telegram admins","Owner"],"wm":"o"}
```

Ne confondez pas les rôles. `Combot custom admins` décrit des droits Combot, pas Telegram. Le traitement de `Admins`, comme `Telegram admins`, vérifie les administrateurs Telegram, propriétaire inclus, sans ajouter les administrateurs Combot. Pour autoriser les deux groupes, listez `Telegram admins` et `Combot custom admins` avec `wm: "o"`. `Regular members` signifie membres actuels connus, pas anciens ou très actifs. `New members` reprend les réglages et exemptions existants, pas des « sept premiers jours » fixes. Utilisez `cgr` pour une durée exacte.

Ne générez pas `Core members` ou `Non-members` : leurs définitions fiables ne sont pas fournies pour les nouvelles règles. Des informations absentes ne prouvent pas qu'une personne n'a jamais appartenu au groupe.

Pour la cible, utilisez `twh`, `twx` et `twm`. Prenez les valeurs contextuelles `Target self`, `Target bots`, `Target Combot` ou `Target linked channel post` dans un export adapté ; ne les devinez pas dans les filtres de l'expéditeur.

Pour `nm` et `ml`, `wh`/`wx` décrivent qui a initié l'arrivée ou le retrait ; `twh`/`twx`, le membre au statut modifié. Si Anna ajoute Ilya, les conditions de nouveau membre concernent Ilya via `t...`. Choisir `v.tg` ne permute pas ces conditions.

`am: "o"` vérifie un administrateur Telegram ; `am: "n"` l'exclut. Cela ne remplace pas les rôles de `wh`/`wx`. Préférez des groupes explicites pour les nouvelles règles.

## 7. Présence, activité, XP et réputation

Les conditions numériques vont dans `cgr`, ou `tcg` pour la cible. Ce fragment signifie au plus une heure de présence et cinq messages enregistrés :

```json
{
  "cgr": {
    "logic": "All",
    "statistics": {
      "rules": [
        {"metric":"joinedDays","unit":"h","op":"lte","value":"1"},
        {"metric":"messageCount","unit":"c","join":"and","op":"lte","value":"5"}
      ]
    }
  }
}
```

Opérateurs : `eq` égal, `gte` au moins, `lte` au plus. Indiquez-les toujours. « Moins de cinq » n'est pas `lte: 5` : pour un compteur entier, c'est `lte: 4`. N'utilisez pas une durée exacte `eq` pour « au moins » : le temps continue de passer.

Métriques statistiques :

- `joinedDays` : temps depuis l'arrivée ici, pas âge du compte ni âge personnel. Unités : `s`, `m`, `h`, `d`, `w`, `mo`. Un jour vaut 24 heures, une semaine 7 jours et un mois ici 30 jours. Toute nouvelle règle doit préciser une unité.
- `messageCount` : messages enregistrés dans ce groupe ; unité `c`.
- `warns` : avertissements actifs ; unité `c`.

« Un message enregistré » est `{"metric":"messageCount","unit":"c","op":"eq","value":"1"}`. Cela ne garantit pas l'exécution unique : compteurs et événements peuvent être traités séparément.

Autres sections :

```json
{
  "cgr": {
    "logic": "All",
    "xp": {
      "xp": {"rules":[{"op":"gte","value":"100"}]}
    },
    "reputation": {
      "reputation": {"rules":[{"op":"gte","value":"5"}]}
    }
  }
}
```

Les seuils de rang utilisent `cgr.xp.rank.rules`, avec les vrais rangs du groupe, pas des noms inventés. Les lignes acceptent `join: "and" | "or"` et `mode: "include" | "exclude"`. Utilisez ET explicite pour les cas simples et un export pour les chaînes complexes. `cgr.logic: "All" | "Any"` combine les sections. Une ligne numérique excluante est une interdiction : une correspondance positive dans une autre section de la même variante ne la contourne pas.

Ne créez pas de conditions de temps depuis le premier message ou la première autre activité : `firstMessageAge` et `firstOtherActivityAge` sont indisponibles. Ne promettez pas « l'activité de la semaine passée » avec le `messageCount` total. Une donnée indisponible ne devient pas automatiquement zéro.

## 8. Attributs et champs utilisateur

`ua` exige les attributs, `ux` les exclut. Valeurs exactes : `Any username`, `Telegram Premium`, `Bot account`, `Any last name`. Par exemple, `{"ux":["Bot account"]}` exclut les bots.

`ul` et `ulx` incluent et excluent les codes de langue fournis par Telegram. Ce n'est pas la langue du message ni la nationalité. Ne déduisez pas la langue du nom.

Les valeurs précises se vérifient dans `uar`, ou `tur` pour la cible. Champs : `user_id`, `name`, `username`, `last_name`, `bio`. La bio appartient au contexte de demande d'adhésion ; elle n'est pas disponible en permanence pour chaque membre.

Une condition de nom d'utilisateur :

```json
{
  "uar": {
    "username": {
      "rules": [
        {"mode":"include","matchType":"Exact match","values":["example_member"]}
      ]
    }
  }
}
```

Cet exemple illustre la structure, pas un membre réel. Pour une demande concrète, utilisez seulement le nom fourni, sans `@`, et demandez-le s'il manque. Fournissez les identifiants comme chaînes dans `values`. Pour l'accès, préférez un identifiant explicitement fourni : les noms peuvent changer.

Ici `matchType` emploie `Exact match`, `Partial match` et `Regular expression`, pas les codes textuels `f`, `p`, `r`. Les valeurs d'une ligne sont des alternatives ; les lignes ont `join`. N'inventez pas `Starts with` ou `Ends with` pour ces champs.

`ual` et `tul` : `a` signifie toutes les règles ; `o`, un groupe quelconque. Utilisez un export pour `uag` et `tug` dans ce profil de génération.

## 9. Texte et types de messages

Utilisez `tv`, un tableau de chaînes, pour chercher des expressions. Une correspondance suffit. Exemple :

```json
{"tv":["où est l'enregistrement","enregistrement du cours"],"tr":"p","ty":"p","cs":false}
```

`tr` : `p` expressions, `w` mots, `r` expressions régulières. Le mode mots n'exige pas tous les mots listés. La recherche partielle ordinaire ne garantit pas non plus les limites de mots : « chat » peut correspondre dans « chaton ».

`ty` : `f` tout le texte, `p` une partie, `s` le début, `e` la fin, `r` une expression régulière. `cs: true` distingue la casse ; `false` ou omission l'ignore. Une FAQ simple n'a besoin que de `tv` : la recherche d'expressions insensible à la casse est le défaut.

`lmin` et `lmax` limitent la longueur. Une borne vide ou nulle ne limite pas ce côté. Ne confondez pas longueur et nombre de mots.

Utilisez les expressions régulières seulement si nécessaire. Fournissez le motif comme chaîne JSON, en échappant les barres inverses ; n'ajoutez pas automatiquement les délimiteurs JavaScript `/.../i`. Expliquez cas correspondants et non correspondants pour les mots exacts ou négations complexes.

`mti` inclut les types ; `mtx` les exclut. Valeurs : `photo`, `video`, `animation`, `audio`, `document`, `sticker`, `voice`, `video_note`, `contact`, `location`, `poll`, `dice`, `game`, `paid_media`. `{"mti":["voice"]}` signifie messages vocaux ; `{"mti":["photo","video"]}`, photo OU vidéo, pas deux pièces jointes simultanées.

L'éditeur possède aussi `text` et `caption`. Ils participent aux réglages textuels ; `caption` n'est pas un type de pièce jointe Telegram indépendant. Pour « seulement les légendes de photos » ou une distinction stricte, obtenez un export. Le codec peut omettre des défauts, dont `text` seul : sa présence dans le JSON d'entrée ne prouve pas la conservation de cette restriction à l'import.

`me` et `mex` exigent ou excluent des entités : `bot_command`, `url`, `text_link`, `mention`, `hashtag`, `cashtag`, `email`, `phone_number`, `emoji`, `custom_emoji`, `bold`, `italic`, `underline`, `strikethrough`, `code`, `pre`, `spoiler`, `blockquote`, `expandable_blockquote`. `mel: "a"` exige toutes les inclusions ; `"o"`, au moins une. Tout lien visible ou masqué : `{"me":["url","text_link"],"mel":"o"}`.

`mef` précise liens, commandes et entités ; `mmo`, les médias ; `mtg` et `mog`, les groupes de conditions ; `csx`/`cse`, les jeux de caractères. Générez ces champs complexes depuis un vrai export. N'inventez pas `max_file_size`, `allowed_domains`, `mime`, `language` ou `contains_all`.

## 10. Horaires et sujets

`s` : `sc` groupe source, `gn` Général, `st` sujets sélectionnés. Dans ce dernier cas, `ti` contient des identifiants positifs.

L'import réinitialise les sujets sources à tout le groupe et les sujets d'envoi au sujet actuel. Cela vaut même avec les bons identifiants et pour les variantes OU. Si le scénario dépend d'un sujet, indiquez-le dans l'explication et les réglages manuels obligatoires. Ne dites pas « prêt à activer » avant resélection.

`at` fixe l'heure autorisée de l'événement, pas un envoi indépendant. « Répondre le soir » est possible. « Publier chaque jour à 19:00 sans événement entrant » nécessite un planificateur.

Le bot vérifie l'heure actuelle au traitement, pas l'horodatage original. Une modification matinale utilise les heures du matin même si le message initial était nocturne.

Créneau hebdomadaire du lundi au vendredi, 09:00–18:00 UTC :

```json
{"at":{"m":"w","wd":[0,1,2,3,4],"tw":[{"startMinute":540,"endMinute":1080}]}}
```

`wd` : 0 lundi, 6 dimanche. Les heures sont des minutes entières depuis minuit UTC, de 0 à 1439. Le dernier instant en minutes est inclus. Une plage nocturne peut commencer au-delà de sa fin ; le jour suit la date UTC actuelle, pas le début du « service ». Vérifiez les deux côtés de minuit.

Moscou 09:00 et 18:00 correspondent à 06:00 et 15:00 UTC, soit 360 et 900 minutes. Pour arrêter exactement à 18:00, la dernière minute est 14:59 UTC, `endMinute: 899`. Pour les autres fuseaux, prenez en compte décalage et changements saisonniers. N'entrez pas une heure locale en UTC sans conversion.

Intervalle de dates :

```json
{"at":{"m":"d","s":"2026-10-01T00:00:00Z","e":"2026-10-07T23:59:59Z"}}
```

Ce sont des exemples de structure, pas les dates de campagne du demandeur. Le début doit précéder la fin. Les deux bornes sont incluses ici. `Z` signifie UTC.

Les heures de fermeture reprennent le groupe : `{"at":{"m":"c"}}` ; en dehors : `{"at":{"m":"c","i":true}}`. Le mode fermeture inclut le début et exclut la fin. Le déclencheur ne configure pas les horaires du groupe. Sans planning valide, ne promettez pas le fonctionnement de la condition directe ou inversée.

## 11. Invitations, réactions et listes

### Invitations

Pour `["jr"]`, `il` accepte `Known Combot links`, `External invite link` ou `Any source`. Omettez-le sans restriction.

`Known Combot links` signifie les liens du catalogue du groupe. `ilc` et `ilx` listent les codes inclus et exclus dans ce catalogue ; prenez les codes exacts d'un export ou des données fournies. Des listes vides laissent active la vérification de catégorie générale.

`External invite link` signifie un lien identifié absent de tout le catalogue, pas « tous sauf mes deux liens ». Une source inconnue ou un catalogue indisponible ne devient pas externe. Ne promettez pas de capturer toute demande sans invitation connue.

### Réactions utilisateur

Événement `["mr"]`. `rct` contient `added` et/ou `removed`. `rnt` et `rnx` incluent et excluent les réactions du nouvel état. Si l'un est renseigné, `rct` doit inclure `added`.

Le traitement n'exécute `mr` que si Telegram fournit `user`. Une réaction comme canal ou administrateur anonyme avec `actor_chat` ne le déclenche pas. Ce n'est pas le compteur agrégé `rc`.

```json
{"e":["mr"],"rct":["added"],"rnt":["👍"]}
```

Les valeurs sont emoji ordinaires, identifiants d'emoji personnalisés sous forme de chaînes ou `paid`. `rnt` vérifie tout le nouvel état, pas seulement la différence. Si 👍 était déjà présent et qu'une autre réaction s'ajoute, la condition peut correspondre encore. La cible `u` est la personne qui change la réaction ; elle ne récompense pas automatiquement l'auteur du message.

### Compteurs agrégés

Événement `["rc"]`. `rcy`/`rcx` choisissent les types comptés. `rcn`/`rcm` définissent les bornes basse et haute, entiers non négatifs. Zéro ou omission ne fixe pas de borne de ce côté.

```json
{"e":["rc"],"rcy":["👍"],"rcn":10}
```

Cela vérifie la valeur actuelle à la mise à jour, pas « atteint dix pour la première fois ». Une nouvelle mise à jour peut relancer. Le compteur anonyme n'identifie aucun participant précis.

### Listes de tâches

Pour `["cd"]` et `["ca"]`, `chl` limite à une liste. Si une liste précise est demandée, exigez son lien direct de message. Pour toutes les listes correspondantes du groupe ou sujet, n'ajoutez pas `chl`.

Les liens directs Telegram, sujets inclus, sont acceptés ; ceux avec `?comment=` ne le sont pas. N'inventez pas d'adresse. Pour un lien public, le traitement doit connaître le nom d'utilisateur du groupe ; une URL apparemment correcte ne prouve pas une correspondance.

## 12. Actions

`a.m: "a"` exécute toutes les lignes dans l'ordre. `a.m: "r"` exécute celles marquées `fr: 1` et exactement une ligne non marquée au hasard, s'il en existe. L'ordre original est conservé. Utilisez `a` sauf demande de hasard ; pas de `fr` hors mode aléatoire.

| Code `a.r[].t` | Action | Paramètres `v` |
| --- | --- | --- |
| `s` | Envoyer un message | `tx` et présentation ; voir ci-dessous |
| `d` | Supprimer le message déclencheur | Aucun paramètre |
| `w` | Ajouter des avertissements | `tg`, `c` positif, généralement 1 |
| `rw` | Retirer des avertissements | `tg`, `c` positif, généralement 1 |
| `m` | Restreindre l'écriture | `tg`, durée `du` en secondes |
| `b` | Bannir | `tg`, durée `du` en secondes |
| `k` | Expulser en permettant le retour | `tg` |
| `um` | Lever la restriction d'écriture | `tg` |
| `ub` | Lever le bannissement | `tg` |
| `du` | Supprimer les messages utilisateur stockés et disponibles | `tg` |
| `x` | Modifier les XP | `tg`, entier non nul `v` de −99999 à 99999 |
| `r` | Modifier la réputation | `tg`, entier non nul `v` de −999 à 999 |
| `ja` | Accepter une adhésion | Événement `jr` uniquement, aucun paramètre |
| `jd` | Refuser une adhésion | Événement `jr` uniquement, aucun paramètre |

Ne confondez pas action `du` et durée `v.du`. La durée est en secondes, pas minutes : une heure vaut 3600. Zéro signifie aucune fin prévue pour une restriction ou un bannissement ; ne l'utilisez jamais pour une durée inconnue. Une raison peut figurer dans un message séparé si demandé ; ne promettez pas un motif de sanction personnalisable via un champ non documenté.

Destinataire `v.tg` :

- `u` : personne à l'origine de l'événement.
- `t` : cible contextuelle, comme l'auteur du message choisi. Pas un identifiant littéral.
- `l` : créateur du lien enregistré chez Combot, dans une demande d'adhésion.
- `b` : les deux personnes disponibles dans le contexte. Pas « tout le groupe ».

Indiquez toujours la cible. Les commandes simples n'ont pas d'actions utilisateur. Les commandes en réponse acceptent auteur, cible et les deux. Pour une demande, utilisez deux actions pour demandeur (`u`) et créateur (`l`) si nécessaire : `b` ne les associe pas. L'éditeur propose le créateur pour les demandes, pas comme choix à présenter dans les instructions d'arrivée de membres. Ailleurs, utilisez seulement les cibles disponibles pour l'événement.

Une cible inconnue ne transforme pas une action en punition de l'auteur de commande. Ne promettez pas de personne de remplacement. `du` ne garantit pas l'effacement de tout l'historique : messages disponibles et Telegram limitent le bot.

Avertissements, niveaux et réputation doivent être activés si nécessaires ; la modération exige les permissions du bot. Lever le silence, lever le bannissement et accepter une adhésion sont des actions distinctes.

Les demandes permettent envois, actions sur utilisateurs disponibles et `ja`/`jd` ; la suppression `d` n'est pas appropriée. Pour les événements sans message, n'ajoutez ni suppression ni réponse à un message inexistant.

## 13. Texte de réponse et destination

Paramètres de `s` :

| Champ | Sens |
| --- | --- |
| `tx` | Texte non vide jusqu'à 4096 caractères ; HTML Telegram pris en charge autorisé |
| `d` | `sc` : source ; `lg` : journal configuré ; défaut `sc` |
| `tp` | `ct` : actuel ; `gn` : Général ; `st` : sélection ; défaut `ct` |
| `to` | Identifiants positifs des sujets choisis ; réinitialisés à l'import |
| `rp` | `r` : réponse au message déclencheur ; omission : message indépendant |
| `cl` | `n` : garder la réponse précédente ; `ps` : supprimer celle de cette ligne |
| `bt` | Lignes de boutons URL : tableau de tableaux d'objets `text` et `url` |
| `ph` | Tableau d'URL d'images pour aperçus |
| `pa` | `true` : aperçu au-dessus du texte |

`rp: "r"` est conservé pour source et sujet actuel. Ne promettez pas la même liaison dans les journaux ou d'autres sujets. N'insérez pas de groupes, canaux ou messages privés externes arbitraires dans `d`.

Si `cl` manque dans la ligne, elle hérite de la règle. `cl: "ps"` sur la règle active le nettoyage ; `cl: "n"` explicite dans la ligne l'annule. Le nettoyage appartient à une règle, une ligne et une destination précises. Les lignes aléatoires ne partagent pas une « dernière bienvenue » unique.

Pour une réponse normale : `<b>Informations du cours</b>\nLes enregistrements sont dans le message épinglé.` Ne fournissez pas du Markdown en tant qu'HTML. Échappez correctement liens et texte. N'ajoutez boutons et images qu'avec de vraies URL fournies ; `ph` n'envoie pas d'album.

Variables confirmées en contexte de message : `{name}`, `{uid}`, `{name_link}`, `{from.id}`, `{from.title}`, `{from.username}`, `{chat.id}`, `{chat.title}`, `{chat.username}`, `{message.id}`, `{message.timestamp}`, `{timestamp}`, `{group_name}`, `{reply_to_uid}`, `{reply_to_name}`, `{reply_to_name_link}`. Elles dépendent de l'événement. N'inventez pas `{target.name}`, `{user.first_name}`, `{reaction_count}` ou semblables.

En commande de réponse, `{from.title}` décrit son auteur, pas la personne punie ou récompensée. `tg: "t"` ne change pas le sens des variables. Si la disponibilité du nom est incertaine, choisissez une formulation neutre.

À l'arrivée, `{from.title}` ne garantit pas non plus le nom du nouveau : si Anna ajoute Ilya, Anna est à l'origine de l'action. Utilisez « Bienvenue dans {chat.title} ! » sans nom personnel.

Les actions ne sont pas une transaction. Un message après une restriction ne prouve pas que Telegram l'a appliquée. Ne formulez pas une confirmation inconditionnelle comme un résultat vérifié : aucune condition distincte de réussite n'est documentée ici.

## 14. Variantes, limites et promesses non prises en charge

`ov` contient les conditions alternatives d'une règle. Elles partagent événement et actions de la règle principale, sans former des scénarios indépendants. Une exclusion dans une variante n'est pas globale. Conservez chaque interdiction générale dans toutes les variantes. Une variante `en: false` ne participe pas.

Utilisez des exports réels pour les structures complexes `ov`, `mtg`, `mog`, `uag`, `tug`, `mef` et `mmo`. Ne créez pas d'arbres OU récursifs ni de chaînes d'actions propres aux variantes en espérant une exécution indépendante.

Les champs de compatibilité `mt`, `mtl`, `t`, `rmi`, `rme` peuvent apparaître. Ne les ajoutez pas sans raison à la place des réglages principaux. Pour les restrictions simples de réponse, utilisez `rm` : `a` tout message, `r` réponses seulement, `rb` à un bot, `rc` à Combot, `nr` sans réponse. N'utilisez pas `rm: "cr"` à la place des nouveaux champs de commande.

Ne générez pas les anciens champs ou champs internes `lf`, `fc`, `lo`, ni les champs d'interface `actions`, `destination`, `topic`, `applyTarget`, `alwaysRun`. Compact les représente autrement et certains ne sont pas des fonctions actives.

Limites de préparation :

- Free : 2 règles ; Pro : 50 ; Business : 100. Les désactivées comptent aussi. Tenez compte des règles déjà présentes pour les places restantes.
- Variantes OU supplémentaires par règle : Free 0, Pro 2, Business 5.
- Jusqu'à 100 lignes d'actions, avec un budget calculé distinct de 20 par exécution du plan.
- Un envoi coûte 1 par destination unique, ou 2 avec nettoyage. Les actions Telegram personnelles comptent par cible, donc `b` peut réserver le double. XP et réputation coûtent 0 dans ce calcul. Le hasard compte les obligations plus le choix le plus coûteux.
- C'est un calcul interne, pas la promesse de vingt requêtes réseau exactes comprenant les opérations auxiliaires. Si la prochaine ligne dépasse le budget restant, l'exécution s'arrête ; les actions terminées ne sont pas annulées.

Ne promettez pas de déclenchement temporel sans événement, « au plus une fois par heure », récompense unique de réaction, protection contre les récompenses répétées, seul premier franchissement de seuil, exécution exactement unique, traitement de groupes externes arbitraires, âge de compte ou statistiques sur une période passée quelconque. Si cela est essentiel, expliquez que la règle décrite ne suffit pas.

L'import ajoute de nouvelles copies ; il ne migre pas Triggers v2. Vous pouvez réécrire le sens d'une ancienne règle en Compact v3, pas présenter son ancien JSON comme directement importable.

## 15. Scénarios d'acceptation des exemples

Le dossier `examples` contient six paquets indépendants avec une règle désactivée chacun :

| Fichier | Cas correspondant | Vérifications supplémentaires |
| --- | --- | --- |
| `01-course-command.json` | Un membre saisit `/course_info` | Du texte sans commande ne doit pas répondre |
| `02-recording-faq.json` | Le texte contient « où est l'enregistrement » | Une autre question ne doit pas répondre ; la recherche partielle peut correspondre dans une phrase longue |
| `03-random-welcome.json` | Un nouveau rejoint le groupe | Un accueil doit être choisi, pas les trois |
| `04-moderator-reply-mute.json` | Administrateur Telegram ou propriétaire répond `/team_pause` à un membre | Les membres ordinaires ne peuvent pas appeler ; les cibles administratrices sont exclues ; sans réponse, l'auteur ne doit pas être restreint |
| `05-known-link-join-request.json` | Une demande utilise un lien du catalogue | Sources externes ou inconnues exclues ; tous les liens connus correspondent sans sélection précise |
| `06-thumbs-up-reaction.json` | Une réaction est ajoutée et le nouvel état contient 👍 | Le retrait de 👍 ne correspond pas ; des changements répétés peuvent renvoyer |

Ce sont des scénarios à vérifier dans votre groupe, pas l'affirmation qu'ils ont tous été exécutés. Les contrôles réalisés suivent. Chaque exemple demande une vérification locale des réglages et capacités avant activation.

## 16. Sources du format et contrôles réalisés

Le format a été comparé à Rails `0d80ce4788ef5adc5c7c1b79e85c6b8be27cc00e` et au bot `ddc1a8a6b6ab99bd2517d783870495990c7058e5`. Ces révisions de branche principale contiennent les corrections coordonnées de l'éditeur et d'Automation. Les fusions Rails PR #78 et bot PR #56 ont été confirmées sur Codeberg ; les versions exactes des processus déployés n'ont pas été établies indépendamment.

Sources principales : `trigger_compact_codec_helpers.js`, `trigger_import_export_helpers.js`, `trigger_validation_helpers.js`, registres d'événements et d'actions, `user_attribute_model_helpers.js`, `AutomationController`, contrat détaillé dans `docs/MONGODB.md` et traitement des conditions/actions dans `automation.py`.

Les six exemples originaux ont été vérifiés en mémoire avec le codec source de l'éditeur : décodage, reconstruction, nouveau décodage et stabilité du résultat normalisé. Actions et désactivation ont été conservées. Le codec omettant certains défauts, la comparaison portait sur les résultats normalisés plutôt que l'identité octet par octet avec l'entrée.

Le 8 septembre, la désactivation des six originaux a été vérifiée après import dans l'éditeur de production combot.org, sauvegarde serveur et rechargement. Cela ne remplace pas la vérification de chaque condition et action dans Telegram.

Commande et FAQ ont été essayées dans Telegram : les demandes correspondantes recevaient les bonnes réponses, pas les contrôles. Seul `/course_info` a été remplacé par un nom de test unique autorisé par les garde-fous du testeur ; les autres réglages sont restés. Cela ne démontre pas automatiquement les autres événements et actions.

Pour `06-thumbs-up-reaction.json`, ajouter 👍 depuis un profil personnel a produit une réponse attendue ; le retirer, aucune. Identité et anciens/nouveaux ensembles ont été confirmés par un observateur Bot API séparé. L'accueil aléatoire à l'arrivée, l'application d'une restriction et l'acceptation d'une demande réelle n'ont pas été testés dans ce passage ; importer ne prouve pas l'exécution.

Les règles de test ont été retirées et la liste initiale rétablie et vérifiée ; les messages de résultat restent dans le groupe de test. Le JSON Schema est une documentation associée, non reliée au produit et non présentée comme un validateur intégré existant.

Le 9 septembre, la référence éditoriale a été comparée à Rails `0d80ce4788ef5adc5c7c1b79e85c6b8be27cc00e` et au bot `0a491a6ee50c57e98c1d9de04819253d15214506`. Les précisions concernent limite de nom, groupes d'administrateurs, participants, destinataires et liens de listes facultatifs. Il s'agit d'une revue documentaire du code, pas d'un nouvel essai Telegram. La formulation localisée des exemples n'a pas été testée indépendamment en conditions réelles.
