# Combot Automation Compact v3: instruksi LLM dan referensi format

Berikan seluruh berkas ini kepada model bersama permintaan aturan Anda. Dokumen menjelaskan format yang diimpor editor Automation. Bahasa aturannya adalah JSON Compact v3, bukan Python, YAML, JavaScript, Triggers v2 lama, atau pseudokode “jika → maka” sembarang.
Label antarmuka diterjemahkan, tetapi nilai JSON tetap sama. Misalnya, `Known Combot links` sesuai dengan “Tautan undangan Combot” dan `Combot custom admins` dengan “Admin Combot” di editor. Jangan mengganti nilai JSON tersebut dengan label antarmuka.

Revisi dokumen: 9 September 2026. Referensi diperiksa terhadap editor dan penangan Automation. Pemeriksaan impor dan Telegram yang sudah dilakukan dicatat terpisah di bagian akhir: pemeriksaan kode sumber tidak membuktikan versi layanan yang sedang berjalan.

## 1. Instruksi untuk model

Ubah permintaan pengguna menjadi aturan Automation tanpa mengubah maknanya.

1. Tentukan peristiwa, kondisi, pengecualian, tindakan, penerima tindakan, dan tujuan balasan. Untuk jadwal, tentukan zona waktu; untuk perintah, tentukan apakah dikirim mandiri atau sebagai balasan. Jangan tambahkan moderasi, hadiah, keacakan, atau penghapusan jika tidak diminta.
2. Jangan menebak ID pengguna, topik, alamat grup, undangan, peringkat, atau fitur aktif. Nama topik bukan ID-nya. Tanyakan jika informasi penting belum tersedia. Anda boleh mengusulkan asumsi teks balasan secara terpisah, tetapi jangan menyajikan aturan belum lengkap sebagai solusi tepat.
3. Selalu buat aturan baru dengan `en: false`. Ini konvensi persiapan aman, bukan keterbatasan Automation. Tidak mencantumkan `en` berarti aktif.
4. Gunakan hanya kolom terdokumentasi. Untuk filter bersarang bertanda “gunakan ekspor”, minta ekspor nyata pengaturan serupa; jangan mengarang struktur. Jika skenario tidak didukung, jelaskan batasannya alih-alih menyembunyikannya dengan menghapus kondisi.
5. Jawab dengan penjelasan singkat → satu blok JSON yang dapat diimpor → pengaturan dan pemeriksaan manual. JSON tidak boleh memuat komentar, elipsis, ID pengganti, baris penjelasan di luar kolom, koma penutup berlebih, atau kunci rekaan seperti `when`, `if`, `then`, `conditions`, `actions`, atau `event`.
6. Sebelum memberikan hasil, telusuri satu kasus cocok dan satu tidak cocok. Untuk perintah balasan, periksa pengirim perintah terpisah dari penulis pesan asli. Jangan mengaku telah menguji aturan di Combot jika tidak benar-benar dilakukan.

JSON Schema pendamping membantu pembuatan aturan baru yang nonaktif. Kolom wajibnya sengaja lebih ketat daripada impor dan tidak menerima setiap ekspor lama. Filter bersarang kompleks hanya diperiksa sebagai objek. Lolos skema tidak membuktikan kompatibilitas kondisi, ketersediaan sumber daya, kepatuhan batas paket, atau keberhasilan tindakan Telegram.

## 2. Isi yang ditempel ke Import

Akar berupa objek dengan `v: 3` numerik dan larik aturan `t`. Biasanya kembalikan satu aturan. Jangan kembalikan larik saja atau `{"triggers": [...]}`: keduanya bukan format dialog impor.

Contoh minimal lengkap:

```json
{
  "v": 3,
  "t": [
    {
      "n": "Perintah informasi kursus",
      "en": false,
      "k": "c",
      "ctm": "p",
      "cm": ["/course_info"],
      "a": {
        "m": "a",
        "r": [
          {
            "i": "course_reply",
            "t": "s",
            "v": {
              "tx": "Rekaman kelas ada di pesan tersemat grup.",
              "rp": "r"
            }
          }
        ]
      }
    }
  ]
}
```

`dv: "t3.compact.3"` adalah penanda skema opsional. Hasil baru cukup memakai `v` dan `t`. Impor yang ada mengenali pembungkus `bundle`, tetapi pembuatan tidak memerlukannya.

Jangan tambahkan `id` server, `revision`, `chat_id`, `ck` hasil perhitungan, atau `$schema` ke dalam paket impor. Server memberikan ID aturan baru. `i` tindakan berbeda: ini pengenal baris lokal seperti `course_reply`. Nilainya harus unik dalam tindakan aturan tersebut dan terdiri dari 1–80 huruf Latin, angka, `_`, atau `-`.

Kunci pendek yang sama memiliki arti berbeda pada tingkat berbeda: `t` akar adalah daftar aturan, `a.r[].t` adalah jenis tindakan, dan `a.r[].v` berisi parameter tindakan. Jangan campur tingkatnya.

## 3. Kolom utama aturan

| Kolom | Makna |
| --- | --- |
| `n` | Nama tidak kosong, hingga 80 karakter di editor |
| `d` | Deskripsi opsional, hingga 280 karakter di editor |
| `en` | `false` untuk aturan baru yang nonaktif |
| `e` | Larik kode peristiwa, kecuali untuk perintah |
| `k`, `cm`, `ctm` | Mode perintah; lihat di bawah |
| `a` | Rencana tindakan: `{"m":"a","r":[...]}` atau `{"m":"r","r":[...]}` |
| `s`, `ti` | Tempat memeriksa peristiwa: grup sumber, General, atau topik pilihan |
| `at` | Waktu pencocokan diizinkan; filter waktu, bukan pengatur waktu |
| `wh`, `wx`, `wm` | Pelaku peristiwa: kelompok disertakan, pengecualian, dan cara penggabungan |
| `cgr` | Kondisi numerik: lama di grup, pesan, peringatan, XP, reputasi |
| `ua`, `ux`, `uar`, `ul`, `ulx` | Atribut anggota, nilai kolom, dan bahasa |
| `twh`, `twx`, `tcg`, `tua`, `tux`, `tur`, `tlg`, `tlx` | Pemeriksaan pengguna lain dalam peristiwa, seperti penulis pesan yang dibalas atau anggota yang bergabung |
| `tv`, `tr`, `ty`, `cs`, `lmin`, `lmax` | Kondisi teks |
| `mti`, `mtx`, `me`, `mex` | Jenis pesan dan entitas teks |
| `il`, `ilc`, `ilx` | Tautan undangan untuk permintaan bergabung |
| `rct`, `rnt`, `rnx`, `rcy`, `rcx`, `rcn`, `rcm` | Kondisi reaksi |
| `chl` | Tautan langsung ke daftar tugas tertentu untuk peristiwa perubahan tugas |
| `cl` | Pembersihan balasan sebelumnya secara bawaan: `n` atau `ps` |
| `ov` | Kumpulan kondisi alternatif OR; gunakan ekspor untuk kasus kompleks |

Jangan isi semua kolom. Tambahkan hanya kondisi yang diminta dan relevan dengan peristiwa pilihan. Misalnya, bergabung tidak memerlukan kata kunci pesan, dan penghitung reaksi gabungan tidak memiliki pengguna tertentu untuk diberi hadiah otomatis.

## 4. Peristiwa

| `e` | Kapan berjalan |
| --- | --- |
| `["m"]` | Pesan grup baru |
| `["em"]` | Edit pesan |
| `["m","em"]` | Pesan baru atau edit |
| `["lc"]`, `["el"]`, `["lc","el"]` | Komentar saluran tertaut, edit, atau keduanya |
| `["cp"]`, `["ec"]`, `["cp","ec"]` | Postingan dalam konteks saluran tertaut, edit, atau keduanya |
| `["jr"]` | Permintaan bergabung |
| `["nm"]` | Anggota bergabung |
| `["ml"]` | Anggota keluar atau dikeluarkan |
| `["cb"]`, `["rb"]` | Boost ditambah atau dihapus |
| `["mr"]` | Reaksi pengguna tertentu berubah |
| `["rc"]` | Penghitung reaksi anonim gabungan diperbarui dalam konteks saluran tertaut |
| `["ck"]` | Daftar tugas baru |
| `["cd"]` | Tugas daftar ditandai selesai |
| `["ca"]` | Tugas daftar ditambahkan |

Jangan gabungkan jenis peristiwa tidak terkait seperti `["m","nm"]`; gunakan aturan terpisah. Pasangan baru-plus-edit yang tercantum diizinkan. Jangan buat mode bot tamu tersembunyi `gm`.

Edit adalah pemicu terpisah. Jangan otomatis menambahkannya pada XP, reputasi, peringatan, atau tindakan yang diharapkan hanya sekali.

## 5. Perintah biasa dan perintah balasan

Perintah biasa, misalnya balasan informasi:

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

Perintah yang dikirim moderator sebagai balasan pesan anggota:

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

Ini potongan kolom aturan, bukan paket impor mandiri.

Jangan tambahkan `e` ke perintah. Berikan daftar perintah garis miring khusus yang tidak kosong dalam `cm`, memakai huruf Latin kecil, angka, dan `_`. Jangan sajikan perintah rekaan sebagai bawaan Combot. Untuk perintah balasan, hilangkan `ctm`; jangan isi `reply_target`, `r`, atau nama orang.

Perintah biasa tidak memiliki penerima tindakan pengguna. Gunakan pengiriman pesan dan, hanya jika diminta secara eksplisit, penghapusan pesan perintah. Pembisuan, peringatan, XP, dan tindakan lain terhadap seseorang memerlukan perintah balasan.

Dalam perintah balasan, `wh` memeriksa pengirim perintah, sedangkan `twh` dan kolom `t...` lainnya memeriksa penulis pesan yang dibalas. Gunakan `v.tg: "t"` untuk bertindak pada penulis tersebut. Jika Anna membalas Ilya dengan `/team_pause`, batasi Ilya, bukan Anna.

Memeriksa `twh` saja tidak membatasi siapa yang dapat menjalankan perintah. Perintah moderator harus menyertakan `wh` sesuai permintaan. Tindakan `d` menghapus perintah itu sendiri, bukan pesan Ilya.

Jangan ganti mode perintah dengan pencarian teks `/team_pause` di `tv`. Jangan tambahkan kondisi perintah yang disembunyikan editor, seperti jadwal, tanpa ekspor yang sudah diverifikasi.

## 6. Anggota dan pengecualian

`wh` dan `wx` memakai string persis berikut, bukan label terjemahan:

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

Daftar penyertaan kosong tidak membatasi kelompok. `Anyone` biasanya boleh dihilangkan. `wm: "o"` mensyaratkan satu kelompok cocok; `wm: "a"` mensyaratkan semua kelompok pilihan. Pengecualian dalam `wx` mencegah kecocokan terlepas dari kelompok positif.

Contoh: siapa pun kecuali administrator dapat mengirim pesan yang cocok:

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

Contoh: hanya administrator Telegram atau pemilik boleh menjalankan perintah:

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

Jangan samakan peran. `Combot custom admins` menjelaskan izin Combot, bukan administrator Telegram. Dalam penangan, `Admins`, seperti `Telegram admins`, memeriksa administrator Telegram termasuk pemilik; tidak mencakup administrator Combot. Untuk mengizinkan kedua kelompok, cantumkan `Telegram admins` dan `Combot custom admins` dengan `wm: "o"`. `Regular members` berarti anggota saat ini yang diketahui, bukan orang yang lama bergabung atau banyak pesannya. `New members` memakai pengaturan anggota baru dan pengecualian grup yang ada; bukan “tujuh hari pertama” yang tetap. Gunakan `cgr` untuk durasi tepat.

Jangan buat `Core members` atau `Non-members`: definisi yang andal tidak tersedia untuk aturan baru. Informasi anggota yang hilang tidak membuktikan seseorang belum pernah menjadi anggota grup.

Untuk target, gunakan `twh`, `twx`, dan `twm`. Ambil nilai kontekstual tambahan seperti `Target self`, `Target bots`, `Target Combot`, dan `Target linked channel post` dari ekspor sesuai; jangan menebaknya dalam filter pengirim.

Untuk `nm` dan `ml`, `wh`/`wx` menjelaskan orang yang memulai penambahan atau pengeluaran; `twh`/`twx` menjelaskan anggota yang statusnya berubah. Jika Anna menambahkan Ilya, kondisi anggota baru ditujukan kepada Ilya melalui `t...`, bukan Anna. Memilih `v.tg` pada tindakan tidak menukar kondisi ini.

`am: "o"` memeriksa administrator Telegram; `am: "n"` mengecualikannya. Ini bukan pengganti penggabungan peran di `wh`/`wx`. Untuk aturan baru, utamakan kelompok eksplisit.

## 7. Lama di grup, aktivitas, XP, dan reputasi

Kondisi numerik ditempatkan di `cgr`, atau `tcg` untuk target. Potongan berikut berarti anggota sudah berada di grup paling lama satu jam dan memiliki paling banyak lima pesan tercatat:

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

Operator: `eq` berarti sama dengan, `gte` minimal, dan `lte` maksimal. Selalu tentukan operator secara eksplisit. Jangan terjemahkan “kurang dari lima” menjadi `lte: 5`: untuk penghitung bulat, gunakan `lte: 4`. Jangan gunakan pemeriksaan durasi tepat `eq` ketika maksudnya “minimal”: waktu terus berjalan.

Metrik statistik:

- `joinedDays`: waktu sejak bergabung ke grup ini, bukan usia akun atau umur orang. Satuan: `s`, `m`, `h`, `d`, `w`, `mo`. Satu hari 24 jam, satu minggu 7 hari, dan satu bulan di sini 30 hari. Aturan baru harus selalu mencantumkan satuan.
- `messageCount`: pesan tercatat dalam grup ini; satuan `c`.
- `warns`: peringatan aktif; satuan `c`.

“Satu pesan tercatat” adalah `{"metric":"messageCount","unit":"c","op":"eq","value":"1"}`. Ini tidak menjamin eksekusi tepat sekali: pembaruan penghitung dan pemrosesan peristiwa dapat berlangsung terpisah.

Bagian lain:

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

Ambang peringkat memakai `cgr.xp.rank.rules`, tetapi nilainya harus berasal dari peringkat nyata grup, bukan nama rekaan. Baris mendukung `join: "and" | "or"` dan `mode: "include" | "exclude"`. Gunakan AND eksplisit untuk kondisi sederhana dan ekspor nyata untuk rantai AND/OR kompleks. `cgr.logic: "All" | "Any"` menggabungkan bagian. Baris numerik pengecualian adalah larangan: kecocokan positif di bagian lain dalam varian kondisi yang sama tidak dapat melewatinya.

Jangan buat pemeriksaan waktu sejak pesan atau aktivitas pertama lainnya: `firstMessageAge` dan `firstOtherActivityAge` tidak tersedia. Jangan menjanjikan “aktivitas minggu lalu” memakai total `messageCount`. Data yang tidak tersedia tidak boleh otomatis menjadi nol.

## 8. Atribut dan kolom pengguna

`ua` mewajibkan atribut; `ux` mengecualikannya. Nilai persis: `Any username`, `Telegram Premium`, `Bot account`, `Any last name`. Misalnya, `{"ux":["Bot account"]}` mengecualikan bot.

`ul` dan `ulx` menyertakan dan mengecualikan kode bahasa pengguna jika diberikan Telegram. Ini bukan bahasa pesan atau kewarganegaraan. Jangan simpulkan bahasa dari nama anggota.

Kondisi nilai tertentu berada di `uar`, atau `tur` untuk target. Kolom yang didukung: `user_id`, `name`, `username`, `last_name`, `bio`. Bio berlaku dalam konteks permintaan bergabung; bukan kolom profil yang terus tersedia untuk setiap anggota.

Bentuk kondisi nama pengguna:

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

Ini menunjukkan struktur, bukan anggota nyata. Untuk permintaan sebenarnya, gunakan hanya nama pengguna yang diberikan, tanpa `@`; tanyakan jika belum ada. Berikan ID sebagai string dalam `values`. Untuk kontrol akses, utamakan ID yang diberikan secara eksplisit: nama dan nama pengguna bisa berubah.

Di sini `matchType` memakai string lengkap `Exact match`, `Partial match`, dan `Regular expression`, bukan kode teks pesan `f`, `p`, dan `r`. Nilai dalam satu baris adalah alternatif; baris memiliki `join`. Jangan mengarang `Starts with` atau `Ends with` untuk kolom ini.

`ual` dan `tul`: `a` berarti semua aturan; `o` berarti salah satu kelompok. Untuk struktur kelompok `uag` dan `tug` dalam profil pembuatan ini, gunakan ekspor.

## 9. Teks dan jenis pesan

Gunakan `tv`, larik string, untuk mencari frasa. Satu string cocok sudah cukup. Misalnya:

```json
{"tv":["di mana rekamannya","rekaman kelas"],"tr":"p","ty":"p","cs":false}
```

`tr`: `p` berarti frasa, `w` kata, dan `r` ekspresi reguler. Mode kata tidak mewajibkan setiap kata dalam daftar. Pencocokan sebagian biasa juga tidak menjamin batas kata: “kucing” dapat cocok di dalam “kucingan”.

`ty`: `f` berarti seluruh teks, `p` bagian teks, `s` awal, `e` akhir, dan `r` ekspresi reguler. `cs: true` membuat pencocokan peka kapitalisasi; `false` atau penghilangan menonaktifkannya. FAQ sederhana hanya membutuhkan `tv`: pencarian frasa tanpa membedakan huruf besar/kecil adalah bawaan.

`lmin` dan `lmax` membatasi panjang teks. Batas kosong atau nol tidak membatasi sisi itu. Jangan samakan panjang teks dengan jumlah kata.

Gunakan ekspresi reguler hanya jika pencocokan sederhana tidak cukup. Berikan pola sebagai string JSON, dengan escape untuk garis miring terbalik; jangan otomatis menambahkan pembatas JavaScript `/.../i`. Untuk syarat kata persis atau negasi kompleks, jelaskan contoh yang cocok dan tidak cocok.

`mti` menyertakan jenis pesan; `mtx` mengecualikannya. Nilai utama: `photo`, `video`, `animation`, `audio`, `document`, `sticker`, `voice`, `video_note`, `contact`, `location`, `poll`, `dice`, `game`, `paid_media`. Misalnya, `{"mti":["voice"]}` berarti pesan suara; `{"mti":["photo","video"]}` berarti foto ATAU video, bukan kedua lampiran sekaligus.

Editor juga memiliki `text` dan `caption`. Keduanya berperan dalam pengaturan isi teks; jangan perlakukan `caption` sebagai jenis lampiran Telegram mandiri. Untuk “hanya keterangan foto” atau pembedaan ketat teks dan keterangan, minta ekspor pengaturan tersebut. Codec bisa menghilangkan nilai bawaan, termasuk `text` tunggal; nilai itu di JSON masukan saja tidak membuktikan pembatasan bertahan setelah impor.

`me` dan `mex` mewajibkan atau mengecualikan entitas teks. Nilai: `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"` mewajibkan semua entitas disertakan; `"o"` minimal satu. Untuk tautan terlihat atau tersembunyi apa pun: `{"me":["url","text_link"],"mel":"o"}`.

`mef` mempersempit tautan, perintah, dan entitas tertentu; `mmo` menjelaskan sifat media; `mtg` dan `mog` adalah kelompok kondisi; `csx`/`cse` adalah kumpulan karakter. Buat kolom kompleks ini dari ekspor nyata. Jangan mengarang pengganti seperti `max_file_size`, `allowed_domains`, `mime`, `language`, atau `contains_all`.

## 10. Waktu dan topik grup

`s`: `sc` berarti grup sumber, `gn` General, dan `st` topik pilihan. Untuk yang terakhir, `ti` memuat ID topik positif.

Impor mereset topik sumber pilihan ke seluruh grup sumber dan topik pengiriman pilihan ke topik saat ini. Ini terjadi meski ID benar dan juga berlaku untuk alternatif OR. Jika skenario bergantung pada topik, sebutkan dalam penjelasan dan pengaturan manual wajib. Jangan menyatakan hasil siap diaktifkan sebelum topik dipilih kembali.

`at` menetapkan waktu peristiwa yang diizinkan; bukan menjadwalkan pengiriman mandiri. “Jawab pertanyaan pada malam hari” memungkinkan. “Kirim setiap hari pukul 19:00 tanpa peristiwa masuk” membutuhkan penjadwal, bukan pemicu ini.

Bot memeriksa waktu saat memproses peristiwa, bukan waktu pesan asli. Edit pada pagi hari memeriksa jam pagi walaupun pesan asli ditulis malam hari.

Rentang mingguan, Senin–Jumat, 09:00–18:00 UTC:

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

`wd`: 0 adalah Senin dan 6 Minggu. Waktu berupa menit bulat sejak tengah malam UTC, dari 0 hingga 1439. Rentang mingguan mencakup menit terakhir. Rentang melewati tengah malam dapat memiliki awal lebih besar dari akhir; hari menggunakan tanggal UTC saat ini, bukan hari “giliran” dimulai. Periksa kedua sisi tengah malam alih-alih menebak hari yang dibutuhkan.

Pukul 09:00 dan 18:00 Moskow setara 06:00 dan 15:00 UTC: menit 360 dan 900. Untuk berhenti cocok tepat pukul 18:00, menit terakhir yang diizinkan adalah 14:59 UTC, atau `endMinute: 899`. Untuk zona lain, perhitungkan selisih waktu dan kemungkinan perubahan waktu musim panas. Jangan masukkan waktu lokal sebagai UTC tanpa konversi.

Interval tanggal:

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

Ini contoh bentuk, bukan tanggal kampanye pengguna. Awal harus mendahului akhir. Kedua batas termasuk dalam mode ini. `Z` berarti UTC.

Jam tutup memakai pengaturan grup yang ada: `{"at":{"m":"c"}}`; di luar jam itu: `{"at":{"m":"c","i":true}}`. Mode jam tutup mencakup awal dan mengecualikan akhir. Pemicu tidak mengatur jadwal penutupan grup. Tanpa jadwal valid, jangan menjanjikan kondisi langsung maupun terbalik akan bekerja.

## 11. Tautan undangan, reaksi, dan daftar tugas

### Undangan

Untuk permintaan bergabung `["jr"]`, `il` menerima `Known Combot links`, `External invite link`, atau `Any source`. Hilangkan jika tidak perlu pembatasan.

`Known Combot links` berarti tautan dalam katalog Combot grup ini. `ilc` dan `ilx` memuat kode tautan disertakan dan dikecualikan dalam katalog; ambil kode persis dari ekspor atau data yang diberikan. Daftar kosong tetap mempertahankan pemeriksaan kategori keseluruhan.

`External invite link` berarti tautan teridentifikasi di luar seluruh katalog Combot, bukan “semua kecuali dua tautan pilihan saya”. Sumber tidak diketahui atau katalog tidak tersedia tidak boleh dianggap tautan eksternal. Jangan menjanjikan kondisi ini menangkap setiap permintaan tanpa undangan yang dikenal.

### Reaksi pengguna

Peristiwa `["mr"]`. `rct` memuat `added` dan/atau `removed`. `rnt` dan `rnx` menyertakan dan mengecualikan reaksi dalam keadaan baru pengguna. Jika salah satunya terisi, `rct` harus menyertakan `added`.

Penangan menjalankan `mr` hanya ketika Telegram memberikan `user`. Reaksi atas nama saluran atau administrator anonim dengan `actor_chat` tidak memicu peristiwa ini. Ini berbeda dari jumlah reaksi gabungan `rc`.

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

Nilai reaksi berupa emoji biasa, string ID emoji khusus, atau `paid`. `rnt` memeriksa seluruh keadaan baru, bukan hanya selisihnya. Jika 👍 sudah ada dan pengguna menambahkan reaksi lain, kondisi bisa cocok lagi. Penerima tindakan `u` di sini adalah orang yang mengubah reaksi; penulis pesan tidak otomatis menerima hadiah.

### Jumlah reaksi gabungan

Peristiwa `["rc"]`. `rcy`/`rcx` memilih jenis reaksi yang dihitung. `rcn`/`rcm` menetapkan batas bawah dan atas sebagai bilangan bulat nonnegatif. Nol atau penghilangan berarti tanpa batas pada sisi itu.

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

Ini memeriksa nilai saat pembaruan, bukan “pertama kali mencapai sepuluh”. Pembaruan cocok berikutnya dapat menjalankan tindakan lagi. Penghitung anonim gabungan tidak memiliki pengguna pemberi reaksi tertentu.

### Daftar tugas

Untuk `["cd"]` dan `["ca"]`, `chl` membatasi aturan ke satu daftar. Jika pengguna menginginkan daftar tertentu, minta tautan langsung pesannya. Jika menginginkan semua daftar yang cocok di grup atau topik, jangan tambahkan `chl`.

Tautan Telegram langsung, termasuk tautan dengan nomor topik, didukung; tautan dengan `?comment=` tidak. Jangan mengarang alamat. Untuk tautan publik, penangan peristiwa harus mengetahui nama pengguna grup; URL yang tampak valid saja tidak membuktikan kecocokan.

## 12. Tindakan

`a.m: "a"` menjalankan semua baris berurutan. `a.m: "r"` menjalankan semua baris bertanda `fr: 1` dan tepat satu baris acak tanpa tanda, jika ada. Baris pilihan mempertahankan urutan asli. Gunakan mode `a` kecuali keacakan diminta; jangan tambahkan `fr` di luar mode acak.

| Kode `a.r[].t` | Tindakan | Parameter `v` |
| --- | --- | --- |
| `s` | Kirim pesan | `tx` dan format; lihat di bawah |
| `d` | Hapus pesan yang memicu aturan | Tanpa parameter |
| `w` | Tambahkan peringatan | `tg`, `c` positif, biasanya 1 |
| `rw` | Hapus peringatan | `tg`, `c` positif, biasanya 1 |
| `m` | Batasi pengiriman pesan | `tg`, durasi `du` dalam detik |
| `b` | Blokir | `tg`, durasi `du` dalam detik |
| `k` | Keluarkan dari grup dengan izin bergabung kembali | `tg` |
| `um` | Cabut pembatasan pengiriman pesan | `tg` |
| `ub` | Cabut pemblokiran | `tg` |
| `du` | Hapus pesan pengguna tersimpan yang tersedia bagi bot | `tg` |
| `x` | Ubah XP | `tg`, bilangan bulat bukan nol `v` dari −99999 hingga 99999 |
| `r` | Ubah reputasi | `tg`, bilangan bulat bukan nol `v` dari −999 hingga 999 |
| `ja` | Setujui permintaan bergabung | Hanya peristiwa `jr`, tanpa parameter |
| `jd` | Tolak permintaan bergabung | Hanya peristiwa `jr`, tanpa parameter |

Jangan samakan kode tindakan `du` dengan kolom durasi `v.du`. Durasi dalam detik, bukan menit: satu jam adalah 3600. Nol untuk pembisuan atau pemblokiran berarti tanpa akhir yang ditentukan; jangan pernah menggantikan durasi tidak diketahui dengannya. Alasan dapat ditulis dalam pesan terpisah jika diminta; jangan menjanjikan alasan sanksi khusus melalui kolom yang tidak terdokumentasi.

Penerima tindakan pengguna `v.tg`:

- `u`: peserta yang menyebabkan peristiwa.
- `t`: target yang ditentukan konteks, seperti penulis pesan yang dibalas. Bukan ID literal.
- `l`: pembuat tautan undangan dalam katalog Combot, pada konteks permintaan bergabung.
- `b`: kedua peserta yang tersedia dalam konteks terkait. Bukan “semua orang di grup”.

Selalu tentukan penerima. Perintah biasa tidak mendukung tindakan pengguna. Perintah balasan mendukung pengirim, target, dan keduanya. Untuk permintaan bergabung, gunakan tindakan terpisah untuk pemohon (`u`) dan pembuat tautan yang diketahui (`l`) jika keduanya diperlukan: `b` bukan pemohon ditambah pembuat tautan. Editor menawarkan pembuat tautan untuk permintaan bergabung; jangan tawarkan pilihan yang sama dalam instruksi langkah demi langkah anggota bergabung. Untuk peristiwa lain, gunakan hanya penerima yang tersedia dalam peristiwa tersebut.

Target tidak diketahui tidak boleh mengubah tindakan menjadi hukuman bagi pengirim perintah. Jangan menjanjikan pengalihan ke orang lain. Tindakan `du` tidak menjamin penghapusan seluruh riwayat anggota: bot dibatasi pesan yang tersedia dan kemampuan Telegram.

Peringatan, level, dan reputasi harus aktif jika skenario bergantung padanya, dan moderasi memerlukan izin bot yang sesuai. Mencabut pembisuan, membuka blokir, dan menyetujui permintaan bergabung adalah tindakan terpisah.

Peristiwa permintaan bergabung mengizinkan pengiriman pesan, tindakan terhadap pengguna tersedia, dan `ja`/`jd`; penghapusan pesan `d` tidak sesuai. Untuk peristiwa tanpa pesan, jangan tambahkan penghapusan atau balasan terhadap pesan yang tidak ada.

## 13. Teks dan tujuan balasan

Parameter tindakan `s`:

| Kolom | Makna |
| --- | --- |
| `tx` | Teks tidak kosong hingga 4096 karakter; HTML Telegram yang didukung diizinkan |
| `d` | `sc`: grup sumber; `lg`: saluran log terkonfigurasi; bawaan `sc` |
| `tp` | `ct`: topik saat ini; `gn`: General; `st`: topik pilihan; bawaan `ct` |
| `to` | ID positif topik pilihan; direset saat impor |
| `rp` | `r`: balas pesan pemicu; jika dihilangkan: pesan mandiri |
| `cl` | `n`: simpan balasan sebelumnya; `ps`: hapus balasan sebelumnya dari baris ini |
| `bt` | Baris tombol URL: larik berisi larik objek dengan `text` dan `url` |
| `ph` | Larik URL gambar untuk pratinjau tautan |
| `pa` | `true`: letakkan pratinjau di atas teks |

`rp: "r"` dipertahankan untuk grup sumber dan topik saat ini. Jangan janjikan hubungan balasan yang sama di log atau topik lain. Jangan isi `d` dengan sembarang grup eksternal, saluran, atau pesan pribadi.

Jika `cl` tingkat baris tidak ada, pengaturan aturan diwarisi. `cl: "ps"` tingkat aturan mengaktifkan pembersihan balasan sebelumnya; `cl: "n"` eksplisit tingkat baris mengesampingkannya. Pembersihan terikat pada aturan, baris tindakan, dan tujuan tertentu. Baris acak berbeda tidak menjadi satu “sambutan terakhir” bersama.

Untuk balasan biasa, gunakan misalnya `<b>Informasi kursus</b>\nRekaman ada di pesan tersemat.` Jangan berikan Markdown sebagai HTML. Escape tautan dan teks dengan benar. Tambahkan tombol dan gambar hanya dengan URL nyata yang diberikan pengguna; `ph` tidak mengirim album foto.

Variabel konteks pesan yang terkonfirmasi: `{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}`. Ketersediaan bergantung pada peristiwa. Jangan mengarang `{target.name}`, `{user.first_name}`, `{reaction_count}`, atau variabel serupa.

Dalam perintah balasan, `{from.title}` menjelaskan pengirim perintah, bukan anggota yang dihukum atau diberi hadiah. Memilih `tg: "t"` tidak mengubah makna variabel. Jika tidak yakin peristiwa menyediakan nama yang diperlukan, gunakan kalimat netral.

Saat bergabung, `{from.title}` juga tidak menjamin nama anggota baru: jika Anna menambahkan Ilya, Anna adalah pelaku. Gunakan sambutan umum seperti “Selamat datang di {chat.title}!” tanpa nama.

Tindakan bukan transaksi. Pesan setelah pembisuan tidak membuktikan Telegram menerapkan pembisuan. Jangan menulis konfirmasi sanksi tanpa syarat seolah hasilnya sudah diverifikasi: kondisi pemeriksaan keberhasilan terpisah tidak didokumentasikan di sini.

## 14. Alternatif, batas, dan janji yang tidak didukung

`ov` memuat kondisi alternatif untuk aturan yang sama. Alternatif berbagi peristiwa dan tindakan induk, bukan mendefinisikan skenario mandiri. Pengecualian dalam satu alternatif tidak bersifat global. Jika larangan harus selalu berlaku, pertahankan di setiap alternatif. Alternatif dengan `en: false` tidak ikut pencocokan.

Gunakan ekspor editor nyata untuk `ov`, `mtg`, `mog`, `uag`, `tug`, `mef`, dan `mmo` baru yang kompleks. Jangan buat pohon OR rekursif atau menaruh rantai tindakan terpisah di dalam alternatif dengan harapan eksekusi mandiri.

Kolom kompatibilitas `mt`, `mtl`, `t`, `rmi`, dan `rme` mungkin muncul dalam ekspor. Jangan menambahkannya sebagai pengganti pengaturan utama terdokumentasi tanpa alasan. Untuk pembatasan balasan sederhana, gunakan `rm`: `a` pesan apa pun, `r` hanya balasan, `rb` balasan ke bot, `rc` balasan ke Combot, `nr` bukan balasan. Jangan gunakan `rm: "cr"` sebagai pengganti kolom perintah baru.

Jangan buat kolom lama atau internal `lf`, `fc`, `lo`, atau kolom UI `actions`, `destination`, `topic`, `applyTarget`, dan `alwaysRun`. Format Compact merepresentasikannya berbeda, dan sebagian pengaturan bukan fitur aktif.

Batas perencanaan:

- Free: hingga 2 aturan tersimpan; Pro: hingga 50; Business: hingga 100. Aturan nonaktif juga dihitung. Perhitungkan aturan yang sudah ada saat menilai slot tersisa.
- Alternatif OR tambahan per aturan: Free 0, Pro 2, Business 5.
- Hingga 100 baris tindakan per aturan, dengan anggaran tindakan terhitung terpisah sebesar 20 per eksekusi rencana.
- Pengiriman bernilai 1 per tujuan unik, atau 2 dengan pembersihan balasan sebelumnya. Tindakan Telegram terhadap pengguna dihitung per penerima, sehingga `b` dapat mencadangkan dua kali lebih banyak. XP dan reputasi bernilai 0 dalam perhitungan ini. Mode acak menghitung baris wajib ditambah pilihan acak termahal.
- Ini perhitungan internal, bukan janji tepat dua puluh permintaan jaringan termasuk semua operasi pembantu. Jika baris berikutnya melebihi anggaran tersisa, eksekusi berhenti; tindakan selesai tidak dibatalkan.

Jangan menjanjikan eksekusi hanya berdasarkan pengatur waktu tanpa peristiwa, “paling sering sekali per jam”, hadiah reaksi sekali saja, perlindungan penyalahgunaan hadiah melalui peristiwa berulang, hanya saat ambang pertama dilewati, eksekusi tepat sekali, pemrosesan sembarang grup eksternal, usia akun, atau statistik aktivitas untuk periode lampau sembarang. Jika salah satunya penting, jelaskan bahwa aturan yang dideskripsikan saja tidak cukup.

Impor menambahkan salinan aturan baru; bukan memigrasikan Triggers v2 lama. Makna aturan lama boleh ditulis ulang dalam Compact v3, tetapi JSON lamanya tidak dapat disajikan sebagai impor siap pakai.

## 15. Skenario penerimaan untuk contoh

Direktori `examples` pendamping memuat enam paket mandiri, masing-masing dengan satu aturan nonaktif:

| Berkas | Kasus cocok | Pemeriksaan tambahan |
| --- | --- | --- |
| `01-course-command.json` | Anggota memasukkan `/course_info` | Teks biasa tanpa perintah tidak boleh memicu balasan |
| `02-recording-faq.json` | Teks mengandung “di mana rekamannya” | Pertanyaan tidak terkait tidak boleh memicu balasan; pencarian sebagian dapat cocok dengan frasa lebih panjang |
| `03-random-welcome.json` | Anggota baru bergabung | Satu sambutan harus dipilih, bukan ketiganya |
| `04-moderator-reply-mute.json` | Administrator Telegram atau pemilik membalas anggota dengan `/team_pause` | Anggota biasa tidak dapat memanggil; target administrator dikecualikan; perintah tanpa balasan tidak boleh membatasi pengirim |
| `05-known-link-join-request.json` | Permintaan memakai tautan katalog Combot | Sumber eksternal atau tidak diketahui tidak boleh cocok; semua tautan dikenal cocok kecuali tautan tertentu dipilih |
| `06-thumbs-up-reaction.json` | Pengguna menambahkan reaksi dan keadaan baru memuat 👍 | Menghapus 👍 tidak cocok; perubahan cocok berulang dapat mengirim pesan lagi |

Ini skenario penerimaan untuk grup Anda, bukan klaim bahwa semuanya sudah dijalankan. Pemeriksaan yang selesai dicatat di bawah. Setiap contoh memerlukan pemeriksaan pengaturan dan kemampuan dalam grup Anda sebelum diaktifkan.

## 16. Sumber format dan verifikasi yang selesai

Format diperiksa terhadap Rails `0d80ce4788ef5adc5c7c1b79e85c6b8be27cc00e` dan bot `ddc1a8a6b6ab99bd2517d783870495990c7058e5`. Revisi cabang main ini mencakup perbaikan editor dan Automation yang terkoordinasi. Penggabungan Rails PR #78 dan bot PR #56 dikonfirmasi di Codeberg; revisi tepat proses yang diterapkan belum ditetapkan secara independen.

Sumber utama: `trigger_compact_codec_helpers.js`, `trigger_import_export_helpers.js`, `trigger_validation_helpers.js`, registri peristiwa dan tindakan, `user_attribute_model_helpers.js`, `AutomationController`, kontrak Automation terperinci dalam `docs/MONGODB.md`, serta penanganan kondisi/tindakan di `automation.py`.

Keenam contoh asli diperiksa dalam memori menggunakan codec sumber editor: decode, susun ulang, decode lagi, lalu periksa kestabilan hasil normalisasi. Tindakan dan status nonaktif dipertahankan. Codec menghilangkan sebagian nilai bawaan, sehingga perbandingan memakai hasil normalisasi, bukan kesamaan byte demi byte dengan JSON masukan.

Pada 8 September, status nonaktif keenam contoh asli diperiksa setelah impor melalui editor produksi combot.org, penyimpanan server, dan pemuatan ulang halaman. Ini tidak menggantikan verifikasi setiap kondisi dan tindakan di Telegram.

Kasus perintah dan FAQ diperiksa di Telegram: permintaan cocok menerima balasan yang dimaksud dan kasus pembanding tidak. Hanya `/course_info` yang diubah menjadi nama uji unik sesuai pengamanan penguji; pengaturan contoh lainnya dipertahankan. Hasil ini tidak otomatis membuktikan peristiwa dan tindakan lain.

Untuk `06-thumbs-up-reaction.json`, penambahan 👍 dari profil pribadi menghasilkan satu balasan yang diharapkan; penghapusan tidak menghasilkan balasan. Identitas dan kumpulan reaksi lama/baru dikonfirmasi melalui pengamat Bot API terpisah. Sambutan acak saat bergabung, penerapan pembisuan, dan persetujuan permintaan bergabung nyata tidak diuji pada percobaan tersebut; impor tidak membuktikan eksekusi tindakan.

Aturan uji yang dibuat sudah dihapus dan pemulihan daftar semula diperiksa; pesan hasil tetap ada di grup uji. JSON Schema adalah dokumentasi pendamping, tidak terhubung ke produk atau disajikan sebagai validator bawaan yang sudah ada.

Pada 9 September, referensi editorial diperiksa terhadap Rails `0d80ce4788ef5adc5c7c1b79e85c6b8be27cc00e` dan bot `0a491a6ee50c57e98c1d9de04819253d15214506`. Penjelasan diperjelas mengenai batas nama editor, kelompok administrator, peserta peristiwa, penerima tindakan, dan tautan daftar tugas opsional. Ini tinjauan dokumentasi berdasarkan sumber, bukan percobaan Telegram baru. Teks contoh yang diterjemahkan belum diuji langsung secara independen.
