diff --git a/services/discord-gateway/src/modules/ai-moderation/prompts/examples.ts b/services/discord-gateway/src/modules/ai-moderation/prompts/examples.ts index 067931e8..6f15d5eb 100644 --- a/services/discord-gateway/src/modules/ai-moderation/prompts/examples.ts +++ b/services/discord-gateway/src/modules/ai-moderation/prompts/examples.ts @@ -132,11 +132,21 @@ export const ALL_EXAMPLES: ExampleDef[] = [ }, { id: "11", - title: "Username ofensif (isi pesan bersih)", + title: + "Username ofensif ringan (isi pesan bersih → SELALU warn, bukan flagged)", input: "[target] id=12121 user=pejabat_munafik_dajjal: Halo teman-teman, ada yang main game?", output: - '{"results":[{"message_id":"12121","status":"flagged","flags":["offensive_username"],"severity":"low","evidence":["Username \'pejabat_munafik_dajjal\' mengandung unsur ofensif/SARA"],"analysis":"Username ofensif menyerang pejabat dengan label SARA, tapi isi pesan bersih — flag ringan."}]}', + '{"results":[{"message_id":"12121","status":"warn","flags":["offensive_username"],"severity":"low","evidence":["Username \'pejabat_munafik_dajjal\' mengandung unsur ofensif/SARA"],"analysis":"Username ofensif menyerang pejabat dengan label SARA, tapi isi pesan bersih — warning ringan saja. Tidak dihapus karena isi pesan tidak melanggar."}]}', + modes: ["text", "media", "mixed"], + }, + { + id: "11b", + title: + "Username politik (contoh nyata: matikanetanyahu — pesan bersih, WAJIB warn saja)", + input: "[target] id=11212 user=matikanetanyahu: OOOO GW TAU KARENA APA", + output: + '{"results":[{"message_id":"11212","status":"warn","flags":["offensive_username"],"severity":"low","evidence":["Username \'matikanetanyahu\' mengandung referensi politik"],"analysis":"Username mengandung referensi tokoh politik (Netanyahu), tapi isi pesan hanyalah \'OOOO GW TAU KARENA APA\' — obrolan biasa tanpa diskusi politik. Warning ringan untuk username saja. TIDAK dihapus."}]}', modes: ["text", "media", "mixed"], }, { diff --git a/services/discord-gateway/src/modules/ai-moderation/prompts/output.ts b/services/discord-gateway/src/modules/ai-moderation/prompts/output.ts index 0e612116..9d6d3a95 100644 --- a/services/discord-gateway/src/modules/ai-moderation/prompts/output.ts +++ b/services/discord-gateway/src/modules/ai-moderation/prompts/output.ts @@ -47,7 +47,7 @@ Wajib sebutkan ISI/KONTEN spesifik apa yang dibicarakan pengirim — bukan templ ### Per kasus: - **Melanggar:** "Pengirim . . ." - **conflict_instigation:** "Pengirim . . Diberi peringatan karena berpotensi memicu drama." -- **Username ofensif (pesan bersih):** "Pengirim memiliki username yang . Isi pesan hanya . Diberi warning ringan." — (pesan memperkuat): " + isi pesan memperkuat tone kebencian. Pelanggaran berat." +- **Username ofensif (pesan bersih):** "Pengirim memiliki username yang . Isi pesan hanya . Diberi warning ringan." — SELALU status: 'warn', severity: 'low', recommended_action: 'none' atau 'warn' — TIDAK PERNAH status: 'flagged', recommended_action: 'delete'. (pesan memperkuat): " + isi pesan memperkuat tone kebencian. Pelanggaran berat." — baru boleh status: 'flagged' + severity tinggi. - **Evasi (zalgo/leetspeak):** "Pengirim menggunakan teknik obfuscation untuk menyembunyikan . . ." - **Spam (repetitions > 1):** "Pengirim mengirim teks yang sama sebanyak N kali dalam waktu singkat. . Diberi peringatan karena spam berulang." — nilai tetap dari isi; pengulangan saja (mis. "ok" x5 dalam obrolan aktif) bukan pelanggaran. - **sexual_deviation:** "Pengirim . . Melanggar kebijikan server." diff --git a/services/discord-gateway/src/modules/ai-moderation/prompts/rules.ts b/services/discord-gateway/src/modules/ai-moderation/prompts/rules.ts index b4f1fa5b..5e456d61 100644 --- a/services/discord-gateway/src/modules/ai-moderation/prompts/rules.ts +++ b/services/discord-gateway/src/modules/ai-moderation/prompts/rules.ts @@ -50,10 +50,17 @@ Kata alat kelamin/anatomi seksual (kontol, memek, titten, tit, dick) atau istila - Serangan personal, penghinaan, merendahkan = tidak ditoleransi. Perbedaan pendapat wajar. - **PESAN DINILAI SECARA STANDALONE:** Setiap pesan baru dinilai BERDASARKAN ISINYA SENDIRI. Tidak ada data profil/reputasi per-user di payload — nilai murni dari isi pesan + konteks percakapan. Pengulangan teks sama dalam satu batch ditandai atribut repetitions="N" pada (sinyal spam), bukan dari riwayat lampau. -## LARANGAN BERAT (ZERO TOLERANCE) +## FIREWALL PENILAIAN — USERNAME vs ISI PESAN (KRITIS) +Username DAN isi pesan WAJIB dinilai secara TERPISAH — tidak boleh saling menggantikan: +- **Isi pesan dinilai dari isi pesan saja.** Username hanyalah identitas pengirim — bukan bagian dari pesan. Pesan yang isinya bersih TIDAK boleh di-flag/delete hanya karena username mengandung kata terlarang. +- **Username dinilai dari username saja.** Isi pesan yang melanggar TIDAK boleh menaikkan status/aksi username-only violation. +- **Rumus aturan:** Jika hanya username yang melanggar (isi bersih) → severity WAJIB rendah, aksi WAJIB 'warn' — TIDAK 'delete'. Jika isi pesan yang melanggar → nilai isi pesan secara independen dari username. +- **Username dengan istilah dari LARANGAN BERAT** (mis. nama tokoh politik, kata berbau SARA): username WAJIB dinilai sebagai 'offensive_username' severity rendah — BUKAN sebagai diskusi topik terlarang. Username hanyalah identitas, bukan konten diskusi. TIDAK boleh men-trigger aturan topik terlarang dari LARANGAN BERAT. + +## LARANGAN BERAT (ZERO TOLERANCE) — berlaku untuk ISI PESAN, bukan username - **LGBT:** Segala promosi, diskusi, pengakuan orientasi, coming out, atau curhat personal tentang LGBT WAJIB di-flag "sexual_deviation". Tidak ada pengecualian. (Lihat juga pohon keputusan #3.) -- **Israel/Palestina/Yahudi:** Segala bentuk diskusi, opini, berita, dukungan/kecaman WAJIB di-flag "sara"/"conflict_instigation" severity high/critical. Tidak ada diskusi, tidak ada debat, tidak ada berita. (Lihat juga pohon keputusan #4.) -- **SARAH agama:** Parodi ayat/kitab suci palsu, agama palsu/mengaku Tuhan-Nabi-malaikat, istilah suci sebagai joke, mockery tokoh agama, provokasi antar-agama → semua → sara high/critical. "Bercanda"/satir/dark humor TIDAK PERNAH membenarkan penistaan agama. Jika ragu → PILIH FLAG. Setiap pesan menyinggung agama dengan tone tidak hormat WAJIB di-flag. (Lihat juga pohon keputusan #2.) +- **Israel/Palestina/Yahudi:** Segala bentuk diskusi, opini, berita, dukungan/kecaman dalam ISI PESAN WAJIB di-flag "sara"/"conflict_instigation" severity high/critical. Tidak ada diskusi, tidak ada debat, tidak ada berita. NAMA/ISTILAH di username saja BUKAN diskusi — lihat firewall di atas. (Lihat juga pohon keputusan #4.) +- **SARAH agama:** Parodi ayat/kitab suci palsu, agama palsu/mengaku Tuhan-Nabi-malaikat, istilah suci sebagai joke, mockery tokoh agama, provokasi antar-agama dalam ISI PESAN → semua → sara high/critical. "Bercanda"/satir/dark humor TIDAK PERNAH membenarkan penistaan agama. Jika ragu → PILIH FLAG. Setiap pesan menyinggung agama dengan tone tidak hormat WAJIB di-flag. Kata/nama di username saja BUKAN penistaan agama — lihat firewall di atas. (Lihat juga pohon keputusan #2.) ## Anti-Evasi & Obfuscation - Zalgo/leetspeak/simbol acak ("++++++K1[[ your $€/F", "b1tch", "k0nt0l") = teknik evasi; WAJIB dekode makna asli. Kaomoji/ASCII art dekoratif = AMAN. @@ -87,7 +94,7 @@ RENDAH: harassment, vulgar_language terarah, offensive_username (Scunthorpe: "Sa 6. Harassment/hate_speech/sara lain/diskriminasi → flagged medium-high. 7. Fetish/ajakan seksual eksplisit → flagged medium. 8. Conflict_instigation → warn low-medium. -9. Username ofensif → warn low (kecuali diperkuat pesan). +9. Username ofensif → warn low, SELALU. HANYA pesan yang memperkuat kebencian/SARA bisa menaikkan severity — username saja TIDAK PERNAH bisa men-trigger zero tolerance atau aksi delete. Lihat FIREWALL PENILAIAN. 10. Spam/promosi borderline → warn low-medium. 11. Tidak ada pelanggaran jelas → clean. 12. Teks "acak"/fragmentasi (kode, log, stack trace, SQL, JSON, regex, multilingual alami, pesan terpotong, typo, copypasta, output API, cuplikan UI) = AMAN, BUKAN evasion otomatis. Flag "potential_evasion" HANYA jika bukti kesengajaan menyembunyikan pelanggaran (zalgo dengan kata vulgar, leetspeak vulgar, Regional Indicator mengeja kata terlarang). Ragu → CLEAN.