diff --git a/services/discord-gateway/src/modules/ai-moderation/cultureLearner.ts b/services/discord-gateway/src/modules/ai-moderation/cultureLearner.ts
index a3e5863..1161511 100644
--- a/services/discord-gateway/src/modules/ai-moderation/cultureLearner.ts
+++ b/services/discord-gateway/src/modules/ai-moderation/cultureLearner.ts
@@ -44,16 +44,45 @@ async function learnChannelCulture(
.map((m) => `${m.username}: ${m.content}`)
.join("\n");
- const prompt = `Anda adalah AI ahli perilaku sosiologis dan budaya online.
-Tugas Anda adalah merangkum budaya (culture) dari sebuah channel chat berdasarkan riwayat pesan-pesan yang dianggap bersih (clean/tidak melanggar).
+ const prompt = `Anda adalah AI ahli sosiologi digital dan pembaca budaya online.
+Tugas Anda adalah merangkum KEPRIBADIAN SEBUAH CHANNEL — bagaimana "rasanya" berada di channel ini,
+siapa saja anggotanya, dan norma tidak tertulis apa yang berlaku.
-Pesan-pesan terakhir:
+Pesan-pesan terakhir dari channel (hanya pesan bersih/clean):
${messagesText}
-Berdasarkan pesan-pesan di atas, buatlah ringkasan singkat (maksimal 3 paragraf) mengenai gaya bahasa, topik obrolan, dan norma sosial di channel ini. Ringkasan ini akan digunakan oleh sistem AI moderasi untuk memahami konteks dan "inside jokes" yang wajar di channel ini.
-Jangan menambahkan teks basa-basi, langsung berikan ringkasannya.`;
+Berdasarkan pesan-pesan di atas, buatlah ringkasan singkat (maksimal 4 paragraf)
+mengenai:
+
+1. **"VIBE" channel** — Bagaimana suasana channel ini? Serius dan profesional? Santai dan penuh tawa?
+ Campuran? Apakah channel terasa hangat, sarkastik, chaos, atau tertib? Jelaskan "feel"-nya.
+
+2. **Gaya bahasa dan inside jokes** — Bahasa apa yang dominan (Indonesia/Inggris/campuran)?
+ Apakah ada slang, meme, atau referensi yang khas di channel ini? Istilah-istilah teknis atau
+ inside joke yang sering muncul? Apakah orang-orang di sini saling sapa atau langsung ke topik?
+
+3. **Topik utama & aktivitas** — Apa yang biasanya dibahas di channel ini? Coding problem? Ngobrol
+ santai? Sharing berita? Debat? Apakah ada ritual atau rutinitas (misal "pagi bro", "makan siang")?
+
+4. **Dinamika sosial & norma tidak tertulis** — Siapa anggota yang paling aktif? Apakah ada tokoh
+ sentral atau "pengurus" informal? Apakah channel ini ramah ke pendatang baru atau lebih eksklusif?
+ Norma apa yang berlaku (misal: no politics, no NSFW, strict on-topic, atau bebas)?
+
+**GAYA RINGKASAN**: Tulislah seperti seorang antropolog yang sedang mendeskripsikan sebuah desa
+digital dengan bahasa Indonesia yang hidup dan natural. JANGAN gunakan format bullet point dalam
+output — tulis dalam bentuk prosa paragraf yang mengalir. Jangan basa-basi, langsung berikan
+ringkasannya.
+
+Contoh gaya yang baik: "Channel ini adalah pusat komunitas developer dengan vibe santai dan
+kekeluargaan. Bahasa dominan campuran Indonesia-Inggris dengan banyak istilah teknis React dan
+Rust. Inside joke yang sering muncul adalah soal 'production bug' dan 'deploy Friday' — mereka
+punya tradisi saling ledek kalau ada yang nge-deploy pas Jumat sore. Topik utama adalah debug
+help, code review, dan kadang curhat karir. Channel sangat ramah ke pendatang baru — setiap
+pertanyaan baru selalu direspons dengan antusias. Norma tidak tertulis: dilarang keras promosi
+judi/NSFW, tapi selain itu bebas. Ada dua anggota senior yang jadi 'mom' channel—sabar jelasin
+hal dasar ke newbie tanpa judge."`;
try {
const completion = await llmChat({
diff --git a/services/discord-gateway/src/modules/ai-moderation/moderationPrompt.ts b/services/discord-gateway/src/modules/ai-moderation/moderationPrompt.ts
index 0fd00ad..b1a2c21 100644
--- a/services/discord-gateway/src/modules/ai-moderation/moderationPrompt.ts
+++ b/services/discord-gateway/src/modules/ai-moderation/moderationPrompt.ts
@@ -545,8 +545,51 @@ Struktur wajib:
]
}
+## PERSONALITY & MEMORY — Gunakan Profil Pengguna dan Kultur Channel
+Sistem ini memiliki MEMORI tentang setiap pengguna dan channel. Data ini disediakan sebagai bagian dari konteks:
+
+### Profil Pengguna (user_profile)
+Setiap pesan mungkin disertai tag user_profile yang berisi ringkasan kepribadian pengguna — gaya komunikasi, topik favorit, dan cara mereka berinteraksi dengan orang lain. **Gunakan informasi ini untuk personalisasi:**
+
+- **Jika profil menunjukkan pengguna biasanya santai/bercanda**: Analisis bisa menggunakan tone yang lebih memahami konteks — misalnya "Pengirim yang biasanya bercanda tentang coding, kali ini..." jika sesuai.
+- **Jika ada perubahan perilaku mencolok**: Misalnya pengguna yang biasanya teknis/formal tiba-tiba mengirim konten provokatif — ini patut dicatat dalam analysis sebagai perilaku yang tidak sesuai profil mereka.
+- **Jika profil menunjukkan pengguna sering membahas topik tertentu**: Gunakan sebagai konteks. Misal "Pengirim yang hobi coding dan diskusi teknis, sedang bertanya tentang error programming."
+- **JANGAN menghakimi berdasarkan profil**: Profil adalah konteks, bukan bukti. Jika pesan bersih, jangan flag hanya karena profil mencurigakan.
+- **JANGAN overfit**: Jika profil tidak relevan dengan pesan saat ini, jangan paksa referensi. Kadang analysis cukup tanpa menyebut profil.
+
+### Kultur Channel (channel_culture)
+Beberapa channel mungkin menyertakan tag channel_culture yang menjelaskan topik dan vibe channel. **Gunakan untuk konteks:**
+- Jika channel culture menyebut channel ini adalah tempat diskusi coding → lebih mudah menganggap pesan teknis sebagai normal/AMAN.
+- Jika channel culture menyebut channel ini adalah tempat santai/off-topic → slang dan candaan lebih wajar.
+- **JANGAN** gunakan channel culture untuk mengabaikan pelanggaran nyata.
+
+### Prinsip Memory-Aware Moderation
+1. **PERSONALITY**: Jadikan analysis terasa personal — seolah-olah sistem "mengenal" pengguna. Bukan template generik.
+2. **CONTEXT**: Gunakan profil untuk memahami apakah pesan ini TYPICAL atau ANOMALOUS untuk pengguna tersebut.
+3. **FAIRNESS**: Profil tidak pernah menjadi alasan untuk mem-flag pesan yang bersih, atau membersihkan pesan yang melanggar.
+4. **NATURAL**: Jangan paksa referensi profil. Jika tidak relevan, analysis yang natural tanpa profil lebih baik daripada dipaksakan.
+
## FORMAT WAJIB — Field "analysis" HARUS deskriptif berdasarkan konten:
+### Contoh Analysis dengan Personality (baru):
+
+**Contoh A — User profiling membantu:**
+Input: [target] user=dev_ganteng: Gess benerin dong kode error ini [stack trace panjang]
+Profil user: Gaya komunikasi santai dan teknis. Sering coding, React/Node.js. Aktif membantu anggota lain.
+Analysis baik: "Pengirim yang antusias dengan coding sedang meminta bantuan debugging dengan stack trace lengkap. Percakapan teknis yang konstruktif. Sesuai dengan profilnya sebagai developer aktif yang sering berbagi kode. Tidak ada pelanggaran."
+Analysis buruk: "Pesan berisi teks teknis tanpa pelanggaran." (generik, tidak personal)
+
+**Contoh B — Perilaku mencolok (deviasi dari profil):**
+Input: [target] user=santai_bos: Anjing lu pada goblok semua, pada ngerti apa?
+Profil user: Gaya komunikasi sangat santai dan ramah. Sering menggunakan emot. Jarang marah. Topik: gaming, meme.
+Analysis baik: "Pengirim yang biasanya ramah dan santai tiba-tiba melontarkan makian kolektif ke arah anggota lain. Ini adalah perilaku yang tidak sesuai dengan profilnya yang biasanya positif. Harassment terarah dengan kata kasar. Perlu ditindak."
+Analysis buruk: "Pesan mengandung makian. Melanggar aturan." (kehilangan konteks penting bahwa ini tidak biasa untuk user ini)
+
+**Contoh C — Profil tidak relevan (jangan dipaksakan):**
+Input: [target] user=budi99: wkwk ngakak
+Analysis baik: "Pengirim tertawa dengan slang Indonesia 'wkwk' dan 'ngakak'. Ekspresi humor biasa, tidak ada pelanggaran."
+Analysis buruk: "Pengirim yang biasanya membahas coding sedang tertawa. Sesuai dengan profilnya." (dipaksakan)
+
### Jika HANYA TEKS (tidak ada gambar/media):
Tulis: "Pengirim membahas tentang . . ."
Contoh baik: "Pengirim membahas tentang makan siang dengan teman-teman. Percakapan santai menggunakan slang Indonesia. Tidak ada pelanggaran."
@@ -595,7 +638,10 @@ CRITICAL:
- JANGAN PERNAH menyebutkan nama / username pengguna secara langsung. Selalu gunakan kata "Pengirim" atau "Pengguna".
- Selalu sebutkan ISI KONTEN secara spesifik — apa yang dibicarakan, apa yang terlihat di gambar.
- Gunakan informasi dari Media analysis untuk mendeskripsikan gambar.
-- Analisis harus MEMBERI KONTEKS, bukan hanya menyatakan status.`;
+- Analisis harus MEMBERI KONTEKS, bukan hanya menyatakan status.
+- GUNAKAN untuk personalisasi analysis — jadikan analysis terasa seperti sistem "mengenal" pengguna.
+- Jika perilaku pesan menyimpang dari profil yang diketahui, CATAT dalam analysis sebagai informasi kontekstual yang relevan.
+- JANGAN paksa referensi profil jika tidak relevan — analysis natural lebih baik dari yang dipaksakan.`;
// ---------------------------------------------------------------------------
// Composer: assembles all sections with XML delimiters
diff --git a/services/discord-gateway/src/modules/ai-moderation/userProfileLearner.ts b/services/discord-gateway/src/modules/ai-moderation/userProfileLearner.ts
index 12df91b..004bf5d 100644
--- a/services/discord-gateway/src/modules/ai-moderation/userProfileLearner.ts
+++ b/services/discord-gateway/src/modules/ai-moderation/userProfileLearner.ts
@@ -43,25 +43,49 @@ async function learnUserProfile(
.map((m) => m.content)
.join("\n");
- const prompt = `Anda adalah AI ahli psikologi dan analisis perilaku online.
-Tugas Anda adalah merangkum profil kepribadian seorang pengguna berdasarkan
-riwayat pesan-pesan mereka di server Discord.
+ const prompt = `Anda adalah AI ahli psikologi, analisis perilaku online, dan pembaca karakter.
+Tugas Anda adalah merangkum profil kepribadian SEORANG PRIBADI — bukan sekadar statistik
+gaya bicara — berdasarkan riwayat pesan-pesan mereka di server Discord.
+Buatlah ringkasan yang KAYA AKAN PERSONALITAS sehingga pembaca merasa "mengenal" orang ini.
Pesan-pesan terakhir dari user "${userId}":
${messagesText}
-Berdasarkan pesan-pesan di atas, buatlah ringkasan singkat (maksimal 3 paragraf)
+Berdasarkan pesan-pesan di atas, buatlah ringkasan singkat (maksimal 4 paragraf)
mengenai:
-1. Gaya komunikasi (formal/casual/teknis/bercanda/serius)
-2. Topik-topik yang sering dibahas
-3. Kepribadian dan karakter yang terpancar
-4. Cara berinteraksi dengan orang lain
-Ringkasan ini akan digunakan oleh sistem AI moderasi untuk memahami konteks
-dan kebiasaan pengguna saat memoderasi pesan mereka.
-Jangan menambahkan teks basa-basi, langsung berikan ringkasannya.`;
+1. **Gaya komunikasi & ciri khas bicara** — formal/casual/teknis/bercanda/sarkastik/enteng.
+ Apakah orang ini suka pake singkatan, emot, reaksi berlebihan ("WKWKWK"), atau nada datar?
+ Bagaimana mereka memulai dan mengakhiri pembicaraan?
+
+2. **Topik-topik yang sering dibahas** — apa PASSION mereka? Coding, gaming, musik, debat?
+ Apakah mereka inisiator topik atau lebih suka merespon?
+
+3. **Kepribadian dan karakter yang terpancar** — Apakah mereka ramah dan hangat? Kritis dan analitis?
+ Easy going? Gampang marah? Humoris? Supportif? Suka memprovokasi? Suka membantu?
+ Apa "vibe" yang mereka pancarkan secara keseluruhan?
+
+4. **Cara berinteraksi dengan orang lain** — Apakah mereka sering memulai percakapan?
+ Lebih suka 1-on-1 atau grup? Suka nge-tag orang? Gampang akrab atau menjaga jarak?
+ Apakah mereka populer di komunitas? Sering dibalas orang lain?
+
+5. **Kebiasaan unik / signature** — Apakah ada pola bicara khas, kata favorit, atau inside joke
+ yang sering mereka gunakan? Apa yang membedakan mereka dari anggota lain?
+
+**GAYA RINGKASAN**: Tulislah seperti seorang pengamat yang cerdas dan hangat sedang mendeskripsikan
+seorang teman. Gunakan bahasa Indonesia alami. Berikan "rasa" dari orang ini — bukan hanya fakta kering.
+JANGAN gunakan format bullet point dalam output. Tulis dalam bentuk prosa paragraf.
+Jangan menambahkan teks basa-basi seperti "berikut ringkasannya". Langsung berikan ringkasannya.
+
+Contoh gaya yang baik: "Pengirim adalah developer yang sangat teknis dan antusias. Gaya bicaranya santai
+dan penuh dengan inside joke tentang coding. Ia sering membantu anggota lain dengan error programming
+dan punya selera humor yang kering — suka melontarkan sarkasme ringan yang mudah dikenali. Topik
+favoritnya adalah React, Rust, dan game indie. Dalam percakapan, ia cenderung proaktif membahas
+solusi dan jarang terlibat drama. Secara keseluruhan, ia adalah anggota yang konstruktif dan aset
+komunitas, meskipun kadang blak-blakan saat kesal. Bila ia tiba-tiba melontarkan makian personal
+atau konten SARA, itu akan SANGAT tidak sesuai dengan karakternya dan patut dicurigai."`;
try {
const completion = await llmChat({