# Combot Automation Compact v3: LLM-Anweisungen und Formatreferenz

Gib diese gesamte Datei zusammen mit deiner Regelanfrage an ein Modell. Sie beschreibt das vom Automation-Editor importierte Format. Die Regelsprache ist Compact-v3-JSON, nicht Python, YAML, JavaScript, das ältere Triggers v2 oder beliebiger „wenn → dann“-Pseudocode.
Die Oberfläche ist übersetzt, JSON-Werte bleiben unverändert. `Known Combot links` entspricht im Editor „Combot-Einladungslinks“, `Combot custom admins` entspricht „Combot-Admins“. Ersetze JSON-Werte niemals durch die Bezeichnungen der Oberfläche.

Dokumentstand: 9. September 2026. Die Referenz wurde mit Automation-Editor und Verarbeitung abgeglichen. Abgeschlossene Import- und Telegram-Prüfungen stehen getrennt am Ende: Eine Quellcodeprüfung belegt nicht die Version eines laufenden Dienstes.

## 1. Anweisungen für das Modell

Übertrage den Wunsch der Person in eine Automation-Regel, ohne seine Bedeutung zu verändern.

1. Kläre Ereignis, Bedingungen, Ausnahmen, Aktion, Aktionsempfänger und Antwortziel. Kläre bei einem Zeitplan die Zeitzone, bei einem Befehl den eigenständigen Versand oder die Verwendung als Antwort. Ergänze Moderation, Belohnungen, Zufall oder Löschen nur auf Wunsch.
2. Errate keine Nutzer-IDs, Themen, Chatadressen, Einladungen, Ränge oder aktivierten Funktionen. Ein Themenname ist keine ID. Frage nach, wenn wesentliche Angaben fehlen. Annahmen zur Antwortformulierung darfst du separat vorschlagen, eine unvollständige Regel aber nicht als genaue Lösung ausgeben.
3. Erzeuge neue Regeln immer mit `en: false`. Das ist eine Konvention für sichere Vorbereitung, keine Automation-Einschränkung. Ohne `en` ist die Regel aktiviert.
4. Verwende nur dokumentierte Felder. Fordere für verschachtelte Filter mit dem Hinweis „Export verwenden“ einen echten Export einer ähnlichen Einstellung an; erfinde keine Struktur. Wird ein Szenario nicht unterstützt, erkläre die Grenze, statt sie durch Entfernen von Bedingungen zu verdecken.
5. Antworte mit kurzer Erklärung → einem importierbaren JSON-Block → manuellen Einstellungen und Prüfungen. Das JSON darf keine Kommentare, Auslassungszeichen, Platzhalter-IDs, Erklärzeilen außerhalb von Feldern, nachgestellten Kommas oder erfundenen Schlüssel wie `when`, `if`, `then`, `conditions`, `actions` oder `event` enthalten.
6. Gehe vor der Ausgabe einen passenden und einen unpassenden Fall gedanklich durch. Prüfe bei Antwortbefehlen den Befehlsverfasser getrennt vom Verfasser der ursprünglichen Nachricht. Behaupte keine Prüfung in Combot, wenn sie nicht tatsächlich stattgefunden hat.

Das beiliegende JSON Schema unterstützt die Erstellung neuer deaktivierter Regeln. Seine Pflichtfelder sind absichtlich strenger als der Import; es akzeptiert nicht jeden älteren Export. Komplexe verschachtelte Filter werden nur als Objekte geprüft. Ein passendes Schema beweist weder vereinbare Bedingungen noch verfügbare Ressourcen, Tarifkonformität oder erfolgreiche Telegram-Aktionen.

## 2. Was in Import eingefügt wird

Die Wurzel ist ein Objekt mit numerischem `v: 3` und dem Regelarray `t`. Gib normalerweise eine Regel zurück. Kein bloßes Array und kein `{"triggers": [...]}`: Das ist nicht das Format des Importdialogs.

Ein vollständiges Minimalbeispiel:

```json
{
  "v": 3,
  "t": [
    {
      "n": "Befehl mit Kursinformationen",
      "en": false,
      "k": "c",
      "ctm": "p",
      "cm": ["/course_info"],
      "a": {
        "m": "a",
        "r": [
          {
            "i": "course_reply",
            "t": "s",
            "v": {
              "tx": "Die Kursaufzeichnungen findest du in der angehefteten Chatnachricht.",
              "rp": "r"
            }
          }
        ]
      }
    }
  ]
}
```

`dv: "t3.compact.3"` ist eine optionale Schemamarkierung. Neue Ergebnisse benötigen nur `v` und `t`. Der bestehende Import erkennt eine `bundle`-Hülle, die bei der Erzeugung nicht erforderlich ist.

Füge dem Importpaket keine Serverfelder `id`, `revision`, `chat_id`, berechnetes `ck` oder `$schema` hinzu. Der Server vergibt eine neue Regel-ID. Das Aktionsfeld `i` ist etwas anderes: eine lokale Zeilenkennung wie `course_reply`. Sie muss innerhalb der Aktionen dieser Regel eindeutig sein und 1–80 lateinische Buchstaben, Ziffern, `_` oder `-` enthalten.

Derselbe Kurzschlüssel hat je Ebene andere Bedeutungen: An der Wurzel ist `t` die Regelliste, `a.r[].t` ist der Aktionstyp, und `a.r[].v` enthält Aktionsparameter. Verwechsle die Ebenen nicht.

## 3. Hauptfelder einer Regel

| Feld | Bedeutung |
| --- | --- |
| `n` | Nicht leerer Name, im Editor bis zu 80 Zeichen |
| `d` | Optionale Beschreibung, im Editor bis zu 280 Zeichen |
| `en` | `false` für eine neue deaktivierte Regel |
| `e` | Array mit Ereigniscodes, außer bei einem Befehl |
| `k`, `cm`, `ctm` | Befehlsmodus; siehe unten |
| `a` | Aktionsplan: `{"m":"a","r":[...]}` oder `{"m":"r","r":[...]}` |
| `s`, `ti` | Wo das Ereignis geprüft wird: Quellchat, Allgemein oder ausgewählte Themen |
| `at` | Wann Treffer erlaubt sind; Zeitfilter, kein Timer |
| `wh`, `wx`, `wm` | Ausführende Person: eingeschlossene Gruppen, Ausnahmen und Gruppenverknüpfung |
| `cgr` | Zahlenbedingungen: Zeit im Chat, Nachrichten, Verwarnungen, XP, Reputation |
| `ua`, `ux`, `uar`, `ul`, `ulx` | Mitgliedsmerkmale, Feldwerte und Sprache |
| `twh`, `twx`, `tcg`, `tua`, `tux`, `tur`, `tlg`, `tlx` | Prüfungen für die andere Ereignisperson, etwa den Verfasser der beantworteten Nachricht oder das beitretende Mitglied |
| `tv`, `tr`, `ty`, `cs`, `lmin`, `lmax` | Textbedingungen |
| `mti`, `mtx`, `me`, `mex` | Nachrichtentypen und Textelemente |
| `il`, `ilc`, `ilx` | Einladungslinks für Beitrittsanfragen |
| `rct`, `rnt`, `rnx`, `rcy`, `rcx`, `rcn`, `rcm` | Reaktionsbedingungen |
| `chl` | Direktlink zu einer bestimmten Checkliste für Aufgabenänderungen |
| `cl` | Standardbereinigung der vorherigen Antwort: `n` oder `ps` |
| `ov` | Alternative ODER-Bedingungsgruppen; bei komplexen Fällen Export verwenden |

Fülle nicht jedes Feld. Ergänze nur gewünschte Bedingungen, die zum Ereignis passen. Ein Beitritt braucht beispielsweise keine Nachrichtenschlüsselwörter, und ein zusammengefasster Reaktionszähler hat keinen konkreten Nutzer für eine automatische Belohnung.

## 4. Ereignisse

| `e` | Wann die Regel läuft |
| --- | --- |
| `["m"]` | Neue Chatnachricht |
| `["em"]` | Nachrichtenbearbeitung |
| `["m","em"]` | Neue oder bearbeitete Nachricht |
| `["lc"]`, `["el"]`, `["lc","el"]` | Kommentar im verknüpften Kanal, Bearbeitung oder beides |
| `["cp"]`, `["ec"]`, `["cp","ec"]` | Beitrag im Kontext des verknüpften Kanals, Bearbeitung oder beides |
| `["jr"]` | Beitrittsanfrage |
| `["nm"]` | Mitglied ist beigetreten |
| `["ml"]` | Mitglied hat den Chat verlassen oder wurde entfernt |
| `["cb"]`, `["rb"]` | Boost hinzugefügt oder entfernt |
| `["mr"]` | Reaktionen eines bestimmten Nutzers haben sich geändert |
| `["rc"]` | Zusammengefasste anonyme Reaktionszähler im Kontext des verknüpften Kanals aktualisiert |
| `["ck"]` | Neue Checkliste |
| `["cd"]` | Checklistenaufgaben als erledigt markiert |
| `["ca"]` | Checklistenaufgaben hinzugefügt |

Kombiniere keine unabhängigen Ereignistypen wie `["m","nm"]`; verwende getrennte Regeln. Die aufgeführten Paare aus neu und bearbeitet sind erlaubt. Erzeuge nicht den verborgenen Gastbot-Modus `gm`.

Eine Bearbeitung ist ein eigener Auslöser. Füge sie nicht automatisch zu XP, Reputation, Verwarnungen oder anderen als einmalig erwarteten Aktionen hinzu.

## 5. Einfache Befehle und Antwortbefehle

Ein einfacher Befehl, etwa eine Informationsantwort:

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

Ein Befehl, den ein Moderator als Antwort auf eine Mitgliedernachricht sendet:

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

Das sind Ausschnitte von Regelfeldern, keine eigenständigen Importpakete.

Füge einem Befehl kein `e` hinzu. Liefere in `cm` eine nicht leere Liste eigener Slash-Befehle in Kleinbuchstaben aus lateinischen Buchstaben, Ziffern und `_`. Stelle einen erfundenen Befehl nicht als eingebaut dar. Lass bei Antwortbefehlen `ctm` weg; schreibe dort weder `reply_target`, `r` noch einen Personennamen.

Ein einfacher Befehl hat keinen Empfänger für Nutzeraktionen. Verwende eine Sendung und, nur auf ausdrücklichen Wunsch, das Löschen der Befehlsnachricht. Stummschaltung, Verwarnungen, XP und andere personenbezogene Aktionen benötigen einen Antwortbefehl.

Bei einem Antwortbefehl prüft `wh` den Befehlsverfasser; `twh` und andere `t...`-Felder prüfen den Verfasser der beantworteten Nachricht. Verwende `v.tg: "t"`, um auf Letzteren einzuwirken. Antwortet Anna Ilya mit `/team_pause`, schränke Ilya ein, nicht Anna.

Nur `twh` zu prüfen beschränkt nicht, wer den Befehl ausführen darf. Ein Moderatorenbefehl muss entsprechend der Anfrage `wh` enthalten. Aktion `d` löscht den Befehl selbst, nicht Ilyas Nachricht.

Ersetze den Befehlsmodus nicht durch eine Suche nach `/team_pause` in `tv`. Ergänze ohne geprüften Export keine vom Editor verborgenen Befehlsbedingungen wie Zeitpläne.

## 6. Mitglieder und Ausnahmen

`wh` und `wx` verwenden genau diese Zeichenfolgen, keine übersetzten Bezeichnungen:

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

Eine leere Einschlussliste beschränkt keine Gruppe. `Anyone` kann normalerweise entfallen. `wm: "o"` verlangt eine passende Gruppe; `wm: "a"` alle ausgewählten Gruppen. Ausnahmen in `wx` verhindern einen Treffer unabhängig von positiven Gruppen.

Beispiel: Alle außer Administratoren dürfen die passende Nachricht senden:

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

Beispiel: Nur Telegram-Administratoren oder der Inhaber dürfen den Befehl ausführen:

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

Verwechsle Rollen nicht. `Combot custom admins` bezeichnet Combot-Berechtigungen, keine Telegram-Administratoren. In der Verarbeitung prüft `Admins` ebenso wie `Telegram admins` Telegram-Administratoren einschließlich Inhaber und ergänzt keine Combot-Administratoren. Für beide Gruppen liste `Telegram admins` und `Combot custom admins` mit `wm: "o"` auf. `Regular members` meint bekannte aktuelle Mitglieder, nicht Personen mit langer Mitgliedschaft oder vielen Nachrichten. `New members` verwendet bestehende Neue-Mitglieder-Einstellungen und Ausnahmen des Chats, keine festen „ersten sieben Tage“. Verwende für eine genaue Dauer `cgr`.

Erzeuge weder `Core members` noch `Non-members`: Für neue Regeln sind keine zuverlässigen Definitionen angegeben. Fehlende Mitgliedsinformationen beweisen keine frühere Nichtmitgliedschaft.

Verwende für das Ziel `twh`, `twx` und `twm`. Übernimm zusätzliche Kontextwerte wie `Target self`, `Target bots`, `Target Combot` und `Target linked channel post` aus einem passenden Export; errate sie nicht in Absenderfiltern.

Bei `nm` und `ml` beschreiben `wh`/`wx`, wer Beitritt oder Entfernung veranlasst hat; `twh`/`twx` das Mitglied mit geändertem Status. Fügt Anna Ilya hinzu, gehören Neue-Mitglieder-Bedingungen über `t...` zu Ilya, nicht Anna. Die Auswahl von `v.tg` einer Aktion vertauscht diese Bedingungen nicht.

`am: "o"` prüft auf einen Telegram-Administrator; `am: "n"` schließt ihn aus. Das ersetzt nicht die Rollenverknüpfung in `wh`/`wx`. Bevorzuge bei neuen Regeln ausdrückliche Gruppen.

## 7. Zeit im Chat, Aktivität, XP und Reputation

Zahlenbedingungen stehen in `cgr`, für das Ziel in `tcg`. Dieser Ausschnitt bedeutet: höchstens eine Stunde im Chat und höchstens fünf erfasste Nachrichten:

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

Operatoren: `eq` bedeutet gleich, `gte` mindestens und `lte` höchstens. Gib den Operator immer ausdrücklich an. Übersetze „weniger als fünf“ nicht mit `lte: 5`: Bei einem ganzzahligen Zähler ist es `lte: 4`. Verwende keine genaue Dauer mit `eq`, wenn „mindestens“ gemeint ist: Die Zeit läuft weiter.

Statistikwerte:

- `joinedDays`: Zeit seit Beitritt zu diesem Chat, nicht Konto- oder Lebensalter. Einheiten: `s`, `m`, `h`, `d`, `w`, `mo`. Ein Tag hat 24 Stunden, eine Woche 7 Tage, ein Monat hier 30 Tage. Neue Regeln müssen immer eine Einheit angeben.
- `messageCount`: erfasste Nachrichten in diesem Chat; Einheit `c`.
- `warns`: aktive Verwarnungen; Einheit `c`.

„Eine erfasste Nachricht“ ist `{"metric":"messageCount","unit":"c","op":"eq","value":"1"}`. Das garantiert keine exakt einmalige Ausführung: Zähleraktualisierung und Ereignisverarbeitung können getrennt stattfinden.

Andere Bereiche:

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

Rangschwellen verwenden `cgr.xp.rank.rules`, ihre Werte müssen aber aus echten Chaträngen stammen, nicht aus erfundenen Namen. Zeilen unterstützen `join: "and" | "or"` und `mode: "include" | "exclude"`. Verwende ausdrückliches UND für einfache Bedingungen und einen echten Export für komplexe UND/ODER-Ketten. `cgr.logic: "All" | "Any"` verknüpft Bereiche. Eine ausschließende Zahlenzeile ist ein Verbot: Ein positiver Treffer in einem anderen Bereich derselben Bedingungsvariante umgeht es nicht.

Erzeuge keine Prüfungen für Zeit seit erster Nachricht oder erster sonstiger Aktivität: `firstMessageAge` und `firstOtherActivityAge` sind nicht verfügbar. Versprich mit gesamtem `messageCount` keine „Aktivität letzter Woche“. Nicht verfügbare Daten dürfen nicht automatisch null werden.

## 8. Nutzermerkmale und Felder

`ua` verlangt Merkmale; `ux` schließt sie aus. Genaue Werte: `Any username`, `Telegram Premium`, `Bot account`, `Any last name`. Beispielsweise schließt `{"ux":["Bot account"]}` Bots aus.

`ul` und `ulx` schließen Nutzersprachcodes ein oder aus, sofern Telegram sie liefert. Das ist weder Nachrichtensprache noch Nationalität. Leite die Sprache nicht aus einem Mitgliedsnamen ab.

Bedingungen für konkrete Werte stehen in `uar`, für das Ziel in `tur`. Unterstützte Felder: `user_id`, `name`, `username`, `last_name`, `bio`. Bio gehört zum Kontext einer Beitrittsanfrage und ist kein jederzeit verfügbares Profilfeld jedes Mitglieds.

Eine Nutzernamenbedingung hat diese Form:

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

Das zeigt die Struktur, kein echtes Mitglied. Verwende bei einer tatsächlichen Anfrage nur den angegebenen Nutzernamen ohne `@`; frage bei fehlender Angabe nach. IDs stehen als Zeichenfolgen in `values`. Bevorzuge für Zugriffskontrolle eine ausdrücklich angegebene ID: Namen und Nutzernamen können sich ändern.

`matchType` verwendet hier die vollständigen Zeichenfolgen `Exact match`, `Partial match` und `Regular expression`, nicht die Nachrichtentextcodes `f`, `p` und `r`. Werte einer Zeile sind Alternativen; Zeilen haben `join`. Erfinde für diese Felder kein `Starts with` oder `Ends with`.

`ual` und `tul`: `a` bedeutet alle Regeln, `o` eine beliebige Gruppe. Verwende in diesem Erzeugungsprofil für Gruppenstrukturen `uag` und `tug` einen Export.

## 9. Text und Nachrichtentyp

Verwende `tv`, ein Array von Zeichenfolgen, für Formulierungssuchen. Eine passende Zeichenfolge genügt. Zum Beispiel:

```json
{"tv":["wo ist die Aufzeichnung","Kursaufzeichnung"],"tr":"p","ty":"p","cs":false}
```

`tr`: `p` bedeutet Formulierungen, `w` Wörter und `r` reguläre Ausdrücke. Der Wortmodus verlangt nicht jedes aufgelistete Wort. Auch normale Teilsuche garantiert keine Wortgrenzen: „Hund“ kann in „Hundert“ passen.

`ty`: `f` bedeutet gesamter Text, `p` Textteil, `s` Anfang, `e` Ende und `r` regulärer Ausdruck. `cs: true` beachtet Groß- und Kleinschreibung; `false` oder Weglassen ignoriert sie. Eine einfache FAQ benötigt nur `tv`: Die schreibungsunabhängige Formulierungssuche ist Standard.

`lmin` und `lmax` begrenzen die Textlänge. Eine leere Grenze oder null begrenzt diese Seite nicht. Verwechsle Textlänge nicht mit Wortanzahl.

Verwende reguläre Ausdrücke nur, wenn einfache Suche nicht reicht. Gib das Muster als JSON-Zeichenfolge mit maskierten Rückwärtsschrägstrichen an; ergänze nicht automatisch JavaScript-Begrenzer `/.../i`. Erkläre bei exakten Wörtern oder komplexer Verneinung passende und unpassende Beispiele.

`mti` schließt Nachrichtentypen ein, `mtx` aus. Hauptwerte: `photo`, `video`, `animation`, `audio`, `document`, `sticker`, `voice`, `video_note`, `contact`, `location`, `poll`, `dice`, `game`, `paid_media`. `{"mti":["voice"]}` bedeutet etwa Sprachnachrichten; `{"mti":["photo","video"]}` Foto ODER Video, nicht beide Anhänge gleichzeitig.

Der Editor hat außerdem `text` und `caption`. Sie gehören zu Textinhaltseinstellungen; behandle `caption` nicht als eigenen Telegram-Anhangtyp. Beschaffe für „nur Fotobeschriftungen“ oder strenge Trennung von Text und Beschriftung einen Export dieser Einstellung. Der Codec kann Standardwerte einschließlich eines alleinigen `text` weglassen; dieser Wert im Eingabe-JSON allein beweist nicht, dass die Begrenzung den Import überlebt.

`me` und `mex` verlangen oder verbieten Textelemente. Werte: `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"` verlangt alle eingeschlossenen Elemente; `"o"` mindestens eines. Für einen beliebigen sichtbaren oder verborgenen Link: `{"me":["url","text_link"],"mel":"o"}`.

`mef` grenzt konkrete Links, Befehle und andere Elemente ein; `mmo` beschreibt Medieneigenschaften; `mtg` und `mog` sind Bedingungsgruppen; `csx`/`cse` Zeichensätze. Erzeuge diese komplexen Felder aus einem echten Export. Erfinde keinen Ersatz wie `max_file_size`, `allowed_domains`, `mime`, `language` oder `contains_all`.

## 10. Zeit und Chat-Themen

`s`: `sc` bedeutet Quellchat, `gn` Allgemein und `st` ausgewählte Themen. Bei Letzterem enthält `ti` positive Themen-IDs.

Der Import setzt ausgewählte Quellthemen auf den gesamten Quellchat und ausgewählte Sendeziele auf das aktuelle Thema zurück. Das gilt auch mit richtigen IDs und für ODER-Varianten. Hängt das Szenario von einem Thema ab, nenne es in der Erklärung und den verpflichtenden manuellen Einstellungen. Bezeichne das Ergebnis erst nach erneuter Themenauswahl als aktivierbar.

`at` legt die erlaubte Ereigniszeit fest und plant keine unabhängige Sendung. „Abends eine Frage beantworten“ ist möglich. „Täglich um 19:00 ohne eingehendes Ereignis posten“ benötigt einen Planer, nicht diesen Trigger.

Der Bot prüft die aktuelle Zeit während der Ereignisverarbeitung, nicht den ursprünglichen Nachrichtenzeitstempel. Eine Bearbeitung morgens prüft Morgenstunden, auch wenn die ursprüngliche Nachricht nachts geschrieben wurde.

Ein Wochenfenster, Montag–Freitag, 09:00–18:00 UTC:

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

`wd`: 0 ist Montag, 6 Sonntag. Zeiten sind ganze Minuten seit Mitternacht UTC von 0 bis 1439. Wochenfenster schließen die letzte Minute ein. Ein Nachtfenster kann einen Anfang größer als sein Ende haben; der Wochentag verwendet das aktuelle UTC-Datum, nicht den Tag des „Schichtbeginns“. Prüfe beide Seiten von Mitternacht, statt die Tage zu erraten.

09:00 und 18:00 Uhr in Moskau entsprechen 06:00 und 15:00 UTC: Minuten 360 und 900. Soll die Bedingung genau um 18:00 enden, ist die letzte erlaubte Minute 14:59 UTC, also `endMinute: 899`. Berücksichtige in anderen Zeitzonen die Verschiebung und mögliche Sommerzeitwechsel. Gib Ortszeit nicht ohne Umrechnung als UTC ein.

Ein Datumsintervall:

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

Das zeigt die Form, nicht die Aktionsdaten der Person. Der Anfang muss vor dem Ende liegen. Beide Grenzen sind in diesem Modus enthalten. `Z` bedeutet UTC.

Schließzeiten verwenden vorhandene Chateinstellungen: `{"at":{"m":"c"}}`; außerhalb dieser Stunden: `{"at":{"m":"c","i":true}}`. Der Schließzeitenmodus schließt den Anfang ein und das Ende aus. Der Trigger konfiguriert die Schließzeiten des Chats nicht. Versprich ohne gültigen Zeitplan weder die Funktion der direkten noch der umgekehrten Bedingung.

## 11. Einladungslinks, Reaktionen und Checklisten

### Einladungen

Bei Beitrittsanfragen `["jr"]` akzeptiert `il` die Werte `Known Combot links`, `External invite link` oder `Any source`. Lass es weg, wenn keine Beschränkung nötig ist.

`Known Combot links` bedeutet Links im Combot-Katalog dieses Chats. `ilc` und `ilx` enthalten eingeschlossene und ausgeschlossene Linkcodes dieses Katalogs; übernimm genaue Codes aus einem Export oder angegebenen Daten. Leere Listen lassen die Prüfung der Gesamtkategorie bestehen.

`External invite link` bedeutet einen identifizierten Link außerhalb des gesamten Combot-Katalogs, nicht „alles außer meinen zwei ausgewählten Links“. Eine unbekannte Quelle oder ein nicht verfügbarer Katalog darf nicht als externer Link gelten. Versprich nicht, damit jede Anfrage ohne bekannte Einladung zu erfassen.

### Nutzerreaktionen

Ereignis `["mr"]`. `rct` enthält `added` und/oder `removed`. `rnt` und `rnx` schließen Reaktionen im neuen Nutzerzustand ein oder aus. Ist eines gefüllt, muss `rct` `added` enthalten.

Die Verarbeitung führt `mr` nur aus, wenn Telegram `user` liefert. Eine Reaktion als Kanal oder anonymer Administrator mit `actor_chat` löst dieses Ereignis nicht aus. Das unterscheidet sich von zusammengefassten Reaktionsanzahlen `rc`.

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

Reaktionswerte sind gewöhnliche Emoji, benutzerdefinierte Emoji-IDs als Zeichenfolge oder `paid`. `rnt` prüft den gesamten neuen Zustand, nicht nur die Änderung. War 👍 bereits vorhanden und wird eine andere Reaktion ergänzt, kann die Bedingung erneut passen. Aktionsziel `u` ist hier die Person, die die Reaktion geändert hat; der Nachrichtenverfasser wird nicht automatisch belohnt.

### Zusammengefasste Reaktionsanzahlen

Ereignis `["rc"]`. `rcy`/`rcx` wählen gezählte Reaktionstypen. `rcn`/`rcm` setzen Unter- und Obergrenzen als nicht negative ganze Zahlen. Null oder Weglassen bedeutet auf dieser Seite keine Grenze.

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

Das prüft den aktuellen Wert bei einer Aktualisierung, nicht „erstmals zehn erreicht“. Eine weitere passende Aktualisierung kann die Aktion erneut ausführen. Der zusammengefasste anonyme Zähler hat keinen konkreten reagierenden Nutzer.

### Checklisten

Bei `["cd"]` und `["ca"]` begrenzt `chl` die Regel auf eine Checkliste. Frage für eine bestimmte Liste nach ihrem direkten Nachrichtenlink. Sollen alle passenden Checklisten eines Chats oder Themas erfasst werden, füge kein `chl` hinzu.

Direkte Telegram-Links einschließlich Themennummern werden unterstützt; Links mit `?comment=` nicht. Erfinde keine Adresse. Bei öffentlichen Links muss die Ereignisverarbeitung den Chat-Nutzernamen kennen; eine oberflächlich gültige URL allein beweist keinen Treffer.

## 12. Aktionen

`a.m: "a"` führt alle Zeilen der Reihe nach aus. `a.m: "r"` führt alle mit `fr: 1` markierten Zeilen und genau eine zufällige unmarkierte Zeile aus, sofern vorhanden. Ausgewählte Zeilen behalten ihre ursprüngliche Reihenfolge. Verwende Modus `a`, sofern kein Zufall gewünscht ist; füge außerhalb des Zufallsmodus kein `fr` hinzu.

| Code `a.r[].t` | Aktion | Parameter `v` |
| --- | --- | --- |
| `s` | Nachricht senden | `tx` und Formatierung; siehe unten |
| `d` | Nachricht löschen, die die Regel auslöste | Keine Parameter |
| `w` | Verwarnungen hinzufügen | `tg`, positives `c`, meist 1 |
| `rw` | Verwarnungen entfernen | `tg`, positives `c`, meist 1 |
| `m` | Schreiben einschränken | `tg`, Dauer `du` in Sekunden |
| `b` | Sperren | `tg`, Dauer `du` in Sekunden |
| `k` | Aus dem Chat entfernen, Rückkehr erlaubt | `tg` |
| `um` | Schreibbeschränkungen aufheben | `tg` |
| `ub` | Sperre aufheben | `tg` |
| `du` | Gespeicherte, für den Bot verfügbare Nutzernachrichten löschen | `tg` |
| `x` | XP ändern | `tg`, ganze Zahl `v` ungleich null von −99999 bis 99999 |
| `r` | Reputation ändern | `tg`, ganze Zahl `v` ungleich null von −999 bis 999 |
| `ja` | Beitrittsanfrage genehmigen | Nur Ereignis `jr`, keine Parameter |
| `jd` | Beitrittsanfrage ablehnen | Nur Ereignis `jr`, keine Parameter |

Verwechsle Aktionscode `du` nicht mit Dauerfeld `v.du`. Dauer wird in Sekunden angegeben, nicht Minuten: Eine Stunde ist 3600. Null bei Stummschaltung oder Sperre bedeutet kein festgelegtes Ende; ersetze damit niemals eine unbekannte Dauer. Ein Grund kann auf Wunsch in einer separaten Nachricht stehen; versprich keinen frei anpassbaren Sanktionsgrund über ein undokumentiertes Feld.

Empfänger einer Nutzeraktion `v.tg`:

- `u`: die Person, die das Ereignis verursacht hat.
- `t`: das kontextbestimmte Ziel, etwa der Verfasser der beantworteten Nachricht. Keine wörtliche ID.
- `l`: der im Combot-Katalog erfasste Einladungslink-Ersteller bei einer Beitrittsanfrage.
- `b`: beide verfügbaren Personen im jeweiligen Kontext. Nicht „alle im Chat“.

Gib den Empfänger immer an. Einfache Befehle unterstützen keine Nutzeraktionen. Antwortbefehle unterstützen Absender, Ziel und beide. Verwende bei einer Beitrittsanfrage getrennte Aktionen für Antragsteller (`u`) und bekannten Linkersteller (`l`), falls beide benötigt werden: `b` bedeutet nicht Antragsteller plus Linkersteller. Der Editor bietet Linkersteller bei Beitrittsanfragen; biete diese Auswahl nicht in Schrittanleitungen für Mitgliederbeitritte an. Verwende bei anderen Ereignissen nur dort verfügbare Empfänger.

Ein unbekanntes Ziel darf keine Aktion zur Strafe für den Befehlsverfasser machen. Versprich keinen Ersatzempfänger. Aktion `du` garantiert keine vollständige Löschung der Mitgliedshistorie: Verfügbare Nachrichten und Telegram-Funktionen begrenzen den Bot.

Verwarnungen, Level und Reputation müssen aktiviert sein, wenn das Szenario sie braucht; Moderation benötigt passende Bot-Rechte. Stummschaltung aufheben, Sperre aufheben und Beitrittsanfrage genehmigen sind getrennte Aktionen.

Beitrittsanfragen erlauben Sendungen, Aktionen für verfügbare Nutzer und `ja`/`jd`; Nachrichtenlöschen `d` ist ungeeignet. Ergänze bei Ereignissen ohne Nachricht weder Löschen noch eine Antwort auf eine nicht vorhandene Nachricht.

## 13. Antworttext und Ziel

Parameter der Aktion `s`:

| Feld | Bedeutung |
| --- | --- |
| `tx` | Nicht leerer Text bis 4096 Zeichen; unterstütztes Telegram-HTML ist erlaubt |
| `d` | `sc`: Quellchat; `lg`: eingerichteter Protokollkanal; Standard `sc` |
| `tp` | `ct`: aktuelles Thema; `gn`: Allgemein; `st`: ausgewählte Themen; Standard `ct` |
| `to` | Positive IDs ausgewählter Themen; beim Import zurückgesetzt |
| `rp` | `r`: Antwort auf auslösende Nachricht; weggelassen: eigenständige Nachricht |
| `cl` | `n`: vorherige Antwort behalten; `ps`: vorherige Antwort dieser Zeile löschen |
| `bt` | URL-Schaltflächenreihen: Array von Arrays mit Objekten aus `text` und `url` |
| `ph` | Array mit Bild-URLs für Linkvorschauen |
| `pa` | `true`: Vorschau oberhalb des Texts anzeigen |

`rp: "r"` bleibt für Quellchat und aktuelles Thema erhalten. Versprich dieselbe Antwortverknüpfung nicht in Protokollen oder anderen Themen. Trage in `d` keine beliebigen externen Chats, Kanäle oder privaten Nachrichten ein.

Fehlt `cl` auf Zeilenebene, wird die Regeleinstellung übernommen. `cl: "ps"` auf Regelebene aktiviert die Bereinigung; ausdrückliches `cl: "n"` in der Zeile überschreibt sie. Die Bereinigung gehört zu einer bestimmten Regel, Aktionszeile und einem Ziel. Unterschiedliche Zufallszeilen werden nicht zu einer gemeinsamen „letzten Begrüßung“.

Für eine normale Antwort kannst du `<b>Kursinformationen</b>\nDie Aufzeichnungen stehen in der angehefteten Nachricht.` verwenden. Liefere Markdown nicht als HTML. Maskiere Links und Text korrekt. Ergänze Schaltflächen und Bilder nur mit echten angegebenen URLs; `ph` sendet kein Fotoalbum.

Bestätigte Variablen im Nachrichtenkontext: `{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}`. Die Verfügbarkeit hängt vom Ereignis ab. Erfinde keine Variablen wie `{target.name}`, `{user.first_name}` oder `{reaction_count}`.

Bei einem Antwortbefehl beschreibt `{from.title}` den Befehlsverfasser, nicht das bestrafte oder belohnte Mitglied. `tg: "t"` ändert die Variablenbedeutung nicht. Bist du unsicher, ob das Ereignis den benötigten Namen liefert, formuliere neutral.

Auch beim Beitritt garantiert `{from.title}` nicht den Namen des neuen Mitglieds: Fügt Anna Ilya hinzu, ist Anna die ausführende Person. Verwende eine allgemeine Begrüßung wie „Willkommen bei {chat.title}!“ ohne Personennamen.

Aktionen sind keine Transaktion. Eine Nachricht nach einer Stummschaltung beweist nicht, dass Telegram die Stummschaltung angewendet hat. Formuliere eine unbedingte Sanktionsbestätigung nicht als geprüftes Ergebnis: Eine eigene Erfolgsbedingung ist hier nicht dokumentiert.

## 14. Varianten, Grenzen und nicht unterstützte Versprechen

`ov` enthält alternative Bedingungen derselben Regel. Sie teilen Ereignis und Aktionen der Hauptregel und definieren keine unabhängigen Szenarien. Eine Ausnahme in einer Variante gilt nicht global. Soll ein Verbot immer gelten, behalte es in jeder Variante. Eine Variante mit `en: false` nimmt nicht an der Trefferprüfung teil.

Verwende für neue komplexe `ov`, `mtg`, `mog`, `uag`, `tug`, `mef` und `mmo` echte Editorexporte. Erstelle keine rekursiven ODER-Bäume und keine eigenen Aktionsketten innerhalb von Varianten in Erwartung unabhängiger Ausführung.

Kompatibilitätsfelder `mt`, `mtl`, `t`, `rmi` und `rme` können in Exporten stehen. Ergänze sie nicht ohne Grund anstelle dokumentierter Haupteinstellungen. Verwende für einfache Antwortbeschränkungen `rm`: `a` beliebige Nachricht, `r` nur Antworten, `rb` Antworten auf einen Bot, `rc` Antworten auf Combot, `nr` keine Antworten. Verwende `rm: "cr"` nicht statt neuer Befehlsfelder.

Erzeuge keine alten oder internen Felder `lf`, `fc`, `lo` oder UI-Felder `actions`, `destination`, `topic`, `applyTarget` und `alwaysRun`. Compact stellt sie anders dar; manche Einstellungen sind überhaupt keine aktiven Funktionen.

Planungsgrenzen:

- Free: bis zu 2 gespeicherte Regeln; Pro: bis zu 50; Business: bis zu 100. Deaktivierte Regeln zählen ebenfalls. Berücksichtige vorhandene Regeln bei freien Plätzen.
- Zusätzliche ODER-Varianten je Regel: Free 0, Pro 2, Business 5.
- Bis zu 100 Aktionszeilen je Regel, dazu ein getrennt berechnetes Aktionsbudget von 20 je Planausführung.
- Eine Sendung kostet 1 je eindeutigem Ziel, mit Bereinigung der vorherigen Antwort 2. Personenbezogene Telegram-Aktionen zählen je Empfänger; `b` kann daher doppelt reservieren. XP und Reputation kosten in dieser Berechnung 0. Der Zufallsmodus zählt Pflichtzeilen plus teuerste Zufallswahl.
- Das ist eine interne Berechnung, kein Versprechen von genau zwanzig Netzwerkanfragen einschließlich aller Hilfsoperationen. Übersteigt die nächste Zeile das Restbudget, stoppt die Ausführung; fertige Aktionen werden nicht rückgängig gemacht.

Versprich keine reine Timerausführung ohne Ereignis, „höchstens einmal pro Stunde“, einmalige Reaktionsbelohnung, Schutz vor Belohnungsmissbrauch durch wiederholte Ereignisse, nur den ersten Schwellenübertritt, exakt einmalige Ausführung, Verarbeitung beliebiger externer Chats, Kontoalter oder Aktivitätsstatistiken eines beliebigen vergangenen Zeitraums. Ist eines davon wesentlich, erkläre, dass die beschriebene Regel allein nicht ausreicht.

Import fügt neue Regelkopien hinzu und migriert keine alten Triggers v2. Du darfst die Bedeutung einer alten Regel in Compact v3 nachbilden, ihr altes JSON aber nicht als fertigen Import darstellen.

## 15. Abnahmeszenarien für die Beispiele

Das zugehörige Verzeichnis `examples` enthält sechs unabhängige Pakete mit je einer deaktivierten Regel:

| Datei | Passender Fall | Zusätzliche Prüfungen |
| --- | --- | --- |
| `01-course-command.json` | Ein Mitglied gibt `/course_info` ein | Einfacher Text ohne Befehl darf keine Antwort auslösen |
| `02-recording-faq.json` | Text enthält „wo ist die Aufzeichnung“ | Eine sachfremde Frage darf keine Antwort auslösen; Teilsuche kann in einer längeren Formulierung passen |
| `03-random-welcome.json` | Ein neues Mitglied tritt bei | Eine Begrüßung sollte gewählt werden, nicht alle drei |
| `04-moderator-reply-mute.json` | Telegram-Administrator oder Inhaber antwortet einem Mitglied mit `/team_pause` | Normale Mitglieder dürfen den Befehl nicht nutzen; Administratoren als Ziel sind ausgeschlossen; ohne Antwort darf der Befehl seinen Verfasser nicht einschränken |
| `05-known-link-join-request.json` | Eine Anfrage nutzt einen Link aus dem Combot-Katalog | Externe oder unbekannte Quellen dürfen nicht passen; ohne konkrete Auswahl passen alle bekannten Links |
| `06-thumbs-up-reaction.json` | Ein Nutzer ergänzt eine Reaktion und der neue Zustand enthält 👍 | Entfernen von 👍 passt nicht; wiederholte passende Änderungen können erneut senden |

Das sind Abnahmeszenarien für deinen Chat, keine Behauptung, dass sie alle ausgeführt wurden. Abgeschlossene Prüfungen folgen unten. Jedes Beispiel braucht vor dem Aktivieren eine Prüfung von Einstellungen und Möglichkeiten deines Chats.

## 16. Formatquellen und abgeschlossene Prüfungen

Das Format wurde mit Rails `0d80ce4788ef5adc5c7c1b79e85c6b8be27cc00e` und Bot `ddc1a8a6b6ab99bd2517d783870495990c7058e5` abgeglichen. Diese Hauptzweigstände enthalten die abgestimmten Editor- und Automation-Korrekturen. Die Zusammenführungen von Rails-PR #78 und Bot-PR #56 wurden auf Codeberg bestätigt; die genauen Revisionen der bereitgestellten Prozesse wurden nicht unabhängig festgestellt.

Hauptquellen: `trigger_compact_codec_helpers.js`, `trigger_import_export_helpers.js`, `trigger_validation_helpers.js`, Ereignis- und Aktionsregister, `user_attribute_model_helpers.js`, `AutomationController`, der detaillierte Automation-Vertrag in `docs/MONGODB.md` und die Bedingungs-/Aktionsverarbeitung in `automation.py`.

Die sechs ursprünglichen Beispiele wurden im Speicher mit dem Quellcodec des Editors geprüft: dekodieren, neu aufbauen, erneut dekodieren und Stabilität des normalisierten Ergebnisses. Aktionen und deaktivierter Zustand blieben erhalten. Der Codec lässt einige Standardwerte weg; verglichen wurden daher normalisierte Ergebnisse statt bytegenauer Gleichheit mit dem Eingabe-JSON.

Am 8. September wurde der deaktivierte Zustand aller sechs ursprünglichen Beispiele nach Import im Produktionseditor auf combot.org, Serverspeicherung und Neuladen geprüft. Das ersetzt nicht die Prüfung jeder Bedingung und Aktion in Telegram.

Befehl und FAQ wurden in Telegram geprüft: Passende Anfragen erhielten die vorgesehenen Antworten, Kontrollfälle nicht. Nur `/course_info` wurde wegen der Schutzvorgaben des Testers auf einen eindeutigen Testnamen geändert; die übrigen Beispieleinstellungen blieben erhalten. Diese Ergebnisse belegen nicht automatisch andere Ereignisse und Aktionen.

Bei `06-thumbs-up-reaction.json` führte das Hinzufügen von 👍 durch ein persönliches Profil zu einer erwarteten Antwort, das Entfernen zu keiner. Identität und alte/neue Reaktionszustände wurden durch einen separaten Bot-API-Beobachter bestätigt. Zufallsbegrüßung beim Beitritt, tatsächliche Stummschaltung und Genehmigung einer echten Beitrittsanfrage wurden in diesem Durchlauf nicht getestet; Import beweist keine Aktionsausführung.

Erstellte Testregeln wurden entfernt und die Wiederherstellung der ursprünglichen Liste geprüft; Ergebnisnachrichten bleiben in der Testgruppe. Das JSON Schema ist Begleitdokumentation, nicht an das Produkt angeschlossen und nicht als bestehender eingebauter Validator dargestellt.

Am 9. September wurde die redaktionelle Referenz mit Rails `0d80ce4788ef5adc5c7c1b79e85c6b8be27cc00e` und Bot `0a491a6ee50c57e98c1d9de04819253d15214506` abgeglichen. Präzisierungen betreffen die Namensgrenze des Editors, Administratorgruppen, Ereignispersonen, Aktionsempfänger und optionale Checklistenlinks. Das ist eine Dokumentationsprüfung anhand des Quellcodes, kein neuer Telegram-Durchlauf. Die lokalisierten Beispielformulierungen wurden nicht unabhängig live getestet.
