From 12f9b55000dd426117598a72956a06408144c574 Mon Sep 17 00:00:00 2001 From: MythEclipse Date: Fri, 12 Jun 2026 23:40:25 +0700 Subject: [PATCH] fix(ai-moderation): implement prompt analysis recommendations - Expand IMPHNEN domain rule to cover wildcard (*.imphnen.*) - Trim redundant SARA examples from TEXT_ONLY_MODE (save ~950 tokens) - Add debugging logs for channel culture injection into prompt - Sync flag validation set with missing flags: potential_evasion, unclear_context Co-Authored-By: Claude --- package.json | 1 + scripts/truncate-all.sql | 22 +++++++++++++++++ .../src/modules/ai-moderation/llmClient.ts | 2 ++ .../ai-moderation/llmModerationClient.ts | 10 ++++++++ .../modules/ai-moderation/moderationPrompt.ts | 24 ++----------------- 5 files changed, 37 insertions(+), 22 deletions(-) create mode 100644 scripts/truncate-all.sql diff --git a/package.json b/package.json index 6710315..0dba5b7 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "db:generate": "drizzle-kit generate", "db:migrate": "drizzle-kit migrate", "db:studio": "drizzle-kit studio", + "db:truncate": "psql \"$DATABASE_URL\" -f scripts/truncate-all.sql", "install:yt-dlp": "sh scripts/install-yt-dlp.sh" }, "devDependencies": { diff --git a/scripts/truncate-all.sql b/scripts/truncate-all.sql new file mode 100644 index 0000000..34b0a50 --- /dev/null +++ b/scripts/truncate-all.sql @@ -0,0 +1,22 @@ +-- Truncate all tables in correct order (respecting FK dependencies) +-- attachments FK → messages (CASCADE), others are independent +-- Use CASCADE to handle any remaining FK chains automatically + +TRUNCATE TABLE + messages, + attachments, + ui_state, + ai_analysis_runs, + voice_recordings, + user_reputations, + channel_cultures, + message_reviews, + moderation_actions, + retention_policies, + text_analysis_cache, + sticker_cache, + corrected_moderations, + user_profiles, + mascot_chat_messages, + muxer_jobs +CASCADE; diff --git a/services/discord-gateway/src/modules/ai-moderation/llmClient.ts b/services/discord-gateway/src/modules/ai-moderation/llmClient.ts index 8d653c2..0f5922f 100644 --- a/services/discord-gateway/src/modules/ai-moderation/llmClient.ts +++ b/services/discord-gateway/src/modules/ai-moderation/llmClient.ts @@ -298,6 +298,8 @@ const VALID_PRIMARY_AI_FLAGS = new Set([ "self_promo", "conflict_instigation", "offensive_username", + "potential_evasion", + "unclear_context", ]); function normalizeFlag(value: string): string | null { diff --git a/services/discord-gateway/src/modules/ai-moderation/llmModerationClient.ts b/services/discord-gateway/src/modules/ai-moderation/llmModerationClient.ts index e8f900e..231c6f8 100644 --- a/services/discord-gateway/src/modules/ai-moderation/llmModerationClient.ts +++ b/services/discord-gateway/src/modules/ai-moderation/llmModerationClient.ts @@ -756,6 +756,11 @@ async function runTextOnlyBatch( ? channelCultureObj.culture_summary : undefined; + // Log channel culture & user profiles for debugging + if (channelCulture) { + log.debug({ channelId, culturePreview: channelCulture.slice(0, 120) }, "Injected channel culture into prompt"); + } + // Run sub-batches sequentially to avoid rate limits for (let i = 0; i < subBatches.length; i++) { const batch = subBatches[i]; @@ -1092,6 +1097,11 @@ async function runMediaBatch( ? channelCultureObj.culture_summary : undefined; + // Log channel culture for debugging + if (channelCulture) { + log.debug({ channelId, culturePreview: channelCulture.slice(0, 120) }, "Injected channel culture into prompt (media path)"); + } + const correctedExamples = await buildCorrectedFewShotExamples(); const systemText = buildSystemPromptModular({ contextText, diff --git a/services/discord-gateway/src/modules/ai-moderation/moderationPrompt.ts b/services/discord-gateway/src/modules/ai-moderation/moderationPrompt.ts index ebf7e2f..80d3b97 100644 --- a/services/discord-gateway/src/modules/ai-moderation/moderationPrompt.ts +++ b/services/discord-gateway/src/modules/ai-moderation/moderationPrompt.ts @@ -35,7 +35,7 @@ Bahasa utama komunitas ini adalah BAHASA INDONESIA. Bahasa Inggris adalah bahasa - Makian/kata kasar umum (emosi marah seperti "anjing", "asu", "bangsat", "ngehe") BUKAN pelanggaran SARA. Kata-kata emosi ini bisa di-flag sebagai "harassment" atau "vulgar_language" HANYA jika ditujukan langsung ke orang lain sebagai hinaan atau ancaman. - **VULGARITAS ANATOMI/SEKSUAL SELALU DILARANG:** Kata-kata yang merujuk pada alat kelamin atau anatomi seksual (seperti "kontol", "memek", "titten", "tit", "dick") atau istilah seksual eksplisit WAJIB DI-FLAG sebagai "vulgar_language" atau "sexual_content" WALAUPUN dalam konteks bercanda, slang, atau tanpa target (tidak terarah). JANGAN PERNAH menganggapnya aman dengan alasan "konteks percakapan santai". - Kata "asus" adalah merk teknologi, jangan pernah dianggap sebagai makian "asu". -- **NAMA PROYEK/KOMUNITAS INI:** "IMPHNEN", "imphnen", "Imphens", varian seperti "imphnen.asepharyana.my.id" atau "imphnen.tech" adalah NAMA PROYEK/KOMUNITAS dari bot moderasi ini sendiri (Discord Moderation Watcher). BUKAN agama, BUKAN kitab suci, BUKAN parodi SARA, dan BUKAN penistaan. Menyebut/mempromosikan nama proyek ini adalah AMAN. JANGAN flag sebagai "sara" hanya karena mengandung kata "imphnen". +- **NAMA PROYEK/KOMUNITAS INI:** "IMPHNEN", "imphnen", "Imphens", "IMP", atau varian ejaan lainnya adalah NAMA PROYEK/KOMUNITAS dari bot moderasi ini sendiri (Discord Moderation Watcher). Termasuk semua subdomain dan TLD: "*.imphnen.*", "imphnen.*", "*.imphnen.*.*". BUKAN agama, BUKAN kitab suci, BUKAN parodi SARA, dan BUKAN penistaan. Menyebut/mempromosikan nama proyek ini adalah AMAN. JANGAN flag sebagai "sara" hanya karena mengandung kata "imphnen". - **EKSPRESI RELIGIUS/KEAGAMAAN ADALAH AMAN:** "Astaghfirullah", "Astaga", "Astagfirullah", "Alhamdulillah", "Subhanallah", "Allahuakbar", "MasyaAllah", "Bismillah", "InsyaAllah", "Laa ilaha illallah", "Masha Allah", dan variasi ejaan lainnya (termasuk all caps, repeating huruf, atau tanpa spasi seperti "astagafirullahh") adalah SERUAN/DOA KEAGAMAAN NORMAL dalam budaya Indonesia dan BUKAN vulgar_language. JANGAN flag sebagai vulgar atau harassment. Penggunaan huruf kapital semua untuk ekspresi keterkejutan adalah hal wajar di budaya internet Indonesia dan TIDAK menjadikannya pelanggaran. - "woy"/"woi" adalah sapaan/interjeksi informal Indonesia dan tidak boleh dianggap SARA, hate speech, atau harassment tanpa target hinaan/ancaman jelas. - Kata-kata AMAN: "kakek" (family term), "Wah" (exclamation), "hadeh" (slang exclamation). Jangan flag sebagai vulgar_language atau harassment. @@ -383,37 +383,17 @@ Contoh 20 — Parodi ayat palsu (SARA agama): Input: [target] id=20201 user=parodist: Kitabonia 11:17 — "Dan bersabdalah Sang Admin: barang siapa yang melakukan spam, niscaya akan kena mute tujuh hari tujuh malam" Output: {"results":[{"message_id":"20201","status":"flagged","flags":["sara"],"score":0.92,"categories":["sara"],"severity":"critical","confidence":0.95,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["Kitabonia 11:17","Dan bersabdalah Sang Admin: barang siapa yang melakukan spam, niscaya akan kena mute tujuh hari tujuh malam"],"analysis":"Pengirim membuat ayat palsu dengan format penulisan kitab suci (pasal:ayat) yang memparodikan wahyu. Ini adalah penistaan agama serius, bukan humor. Melanggar kebijakan SARA."}]} -Contoh 21 — Membuat agama palsu / mengaku Tuhan (SARA agama): -Input: [target] id=21212 user=troll: ayo bikin agama, aku tuhannya, yg mau jadi malaikat DM aku -Output: {"results":[{"message_id":"21212","status":"flagged","flags":["sara"],"score":0.95,"categories":["sara"],"severity":"critical","confidence":0.95,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["ayo bikin agama, aku tuhannya, yg mau jadi malaikat DM aku"],"analysis":"Pengirim mengajak membuat agama palsu dan mengaku sebagai Tuhan. Ini adalah penistaan agama yang sangat serius, bukan candaan. Melanggar kebijakan SARA."}]} - Contoh 22 — Istilah agama sebagai joke (SARA agama, shirkmaxxing): Input: [target] id=22223 user=edgy: Shirkmaxxing grindset, nanti halalmaxxing juga Output: {"results":[{"message_id":"22223","status":"flagged","flags":["sara"],"score":0.88,"categories":["sara"],"severity":"high","confidence":0.95,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["Shirkmaxxing grindset","halalmaxxing juga"],"analysis":"Pengirim menggunakan istilah suci agama Islam (shirk/syirik dan halal) sebagai bahan candaan dengan suffix meme. Ini adalah penistaan terhadap konsep teologis serius. Melanggar SARA."}]} -Contoh 23 — Mockery tokoh agama (SARA agama, Hashem): -Input: [target] id=23234 user=edgelord: Hashem is watching you jerk off lol -Output: {"results":[{"message_id":"23234","status":"flagged","flags":["sara"],"score":0.94,"categories":["sara"],"severity":"critical","confidence":0.95,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["Hashem is watching you jerk off lol"],"analysis":"Pengirim menggunakan nama suci Yahudi (Hashem) dalam konteks vulgar dan merendahkan. Ini adalah penistaan/blasphemy serius terhadap figur agama. Melanggar SARA."}]} -Contoh 24 — Nabi palsu (SARA agama, Ba'al): -Input: [target] id=24245 user=provokator: nabi palsu ba'al, sembah aja patung -Output: {"results":[{"message_id":"24245","status":"flagged","flags":["sara","hate_speech"],"score":0.9,"categories":["sara","hate_speech"],"severity":"high","confidence":0.95,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["nabi palsu ba'al","sembah aja patung"],"analysis":"Pengirim menyindir konsep nabi dengan referensi Ba'al dan menyuruh menyembah patung. Ini adalah penistaan dan provokasi terhadap agama monoteis. Melanggar SARA."}]} - -Contoh 25 — Parodi bahasa keagamaan untuk mengejek (SARA agama): -Input: [target] id=25256 user=sindiran: Bodoh admin-admin kita itu. Mereka tidak minta petunjuk dari Tuhan -Output: {"results":[{"message_id":"25256","status":"flagged","flags":["sara","hate_speech"],"score":0.82,"categories":["sara","hate_speech"],"severity":"high","confidence":0.9,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["Bodoh admin-admin kita itu","tidak minta petunjuk dari Tuhan"],"analysis":"Pengirim menggunakan bahasa keagamaan ('petunjuk dari Tuhan') untuk mengejek admin. Ini adalah parodi yang menggunakan framework agama untuk merendahkan orang lain. Melanggar SARA dan hate speech."}]} - -Contoh 26 — Provokasi antar-agama (SARA agama): -Input: [target] id=26267 user=provokator: Islam/Kristen itu agama sesat semua, cuma agama gue yg bener -Output: {"results":[{"message_id":"26267","status":"flagged","flags":["sara","hate_speech","conflict_instigation"],"score":0.95,"categories":["sara","hate_speech","conflict_instigation"],"severity":"critical","confidence":0.95,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["Islam/Kristen itu agama sesat semua","cuma agama gue yg bener"],"analysis":"Pengirim menyerang agama lain sebagai 'sesat' dan mengklaim kebenaran mutlak agamanya sendiri dengan tone provokatif. Ini adalah provokasi antar-agama serius. Melanggar SARA."}]} Contoh 27 — Ekspresi keagamaan normal (AMAN, BUKAN SARA): Input: [target] id=27278 user=muslim_user: Astaghfirullah, sabar ya bro Output: {"results":[{"message_id":"27278","status":"clean","flags":[],"score":0.0,"categories":[],"severity":"none","confidence":0.95,"recommended_action":"none","policy_version":"default-2026-05-30","evidence":[],"analysis":"Pengirim mengucapkan istighfar (doa normal) dalam konteks menenangkan teman. Ini adalah ekspresi keagamaan wajar dalam budaya Indonesia, bukan penistaan. Aman."}]} -Contoh 28 — Diskusi teologis sopan (AMAN, BUKAN SARA): -Input: [target] id=28289 user=thinker: Menurutku konsep trinitas dalam Kristen menarik dibandingkan tauhid dalam Islam. Apa pendapat kalian? -Output: {"results":[{"message_id":"28289","status":"clean","flags":[],"score":0.0,"categories":[],"severity":"none","confidence":0.9,"recommended_action":"none","policy_version":"default-2026-05-30","evidence":[],"analysis":"Pengirim membandingkan konsep teologis antar agama dengan bahasa sopan dan tone diskusi, bukan provokasi. Mengajak diskusi dengan hormat. Aman."}]}`; +`; /** * Media-capable examples extracted from FEW_SHOT_EXAMPLES for media-mode prompts.