diff --git a/frontend/src/pages/optema-ai.tsx b/frontend/src/pages/optema-ai.tsx index e66d101..24761cc 100644 --- a/frontend/src/pages/optema-ai.tsx +++ b/frontend/src/pages/optema-ai.tsx @@ -96,7 +96,7 @@ type Run = { }; type ProblemKnowledge = { - key: 'pengangguran' | 'kemiskinan'; + key: 'pengangguran' | 'kemiskinan' | 'keluarga_hukum_waris'; label: string; keywords: string[]; severity: 'Tinggi' | 'Kritis'; @@ -237,6 +237,71 @@ const PROBLEM_KNOWLEDGE: ProblemKnowledge[] = [ 'Kemiskinan membutuhkan kombinasi peningkatan pendapatan, pendidikan, keterampilan, dan akses ekonomi.', causeCategories: ['environment', 'people', 'policy', 'process'], }, + { + key: 'keluarga_hukum_waris', + label: 'Hukum keluarga, perceraian, dan warisan', + keywords: [ + 'selingkuh', + 'perselingkuhan', + 'cerai', + 'perceraian', + 'warisan', + 'waris', + 'ahli waris', + 'harta waris', + 'harta bersama', + 'harta gono gini', + 'gono gini', + 'gono-gini', + 'hak asuh', + 'nafkah anak', + 'hak anak', + 'sengketa keluarga', + 'rumah tangga', + 'suami', + 'istri', + ], + severity: 'Kritis', + penyebab: [ + 'Konflik rumah tangga dan dugaan perselingkuhan', + 'Perceraian, hak asuh, dan nafkah anak belum tertata', + 'Pembagian harta bersama dan warisan belum jelas', + 'Hak dan kebutuhan 10 anak berisiko terabaikan', + 'Dokumen keluarga, aset, dan ahli waris belum diinventarisasi', + 'Komunikasi keluarga rentan memanas tanpa mediator netral', + 'Keputusan emosional berisiko memperburuk sengketa hukum', + 'Belum ada rencana perlindungan anak jangka pendek', + 'Potensi pengalihan aset sebelum status hukum jelas', + 'Kebutuhan pendamping hukum dan psikososial belum dipenuhi', + ], + hipotesis: [ + 'Isu perceraian, warisan, harta bersama, nafkah, dan hak anak masih tercampur menjadi satu masalah', + 'Keluarga belum memiliki kronologi, bukti, dan dokumen pendukung yang rapi', + 'Ahli waris, aset, utang, dan status harta perlu dipetakan sebelum mengambil keputusan', + 'Mediasi awal dibutuhkan agar konflik tidak langsung merugikan anak-anak', + 'Konsultasi advokat, pos bantuan hukum, mediator, atau notaris perlu dilakukan sebelum membuat kesepakatan', + 'Anak-anak membutuhkan rencana sementara untuk biaya hidup, sekolah, kesehatan, dan tempat tinggal', + 'Kesepakatan lisan berisiko lemah jika tidak dituangkan dalam dokumen yang benar', + 'Ada risiko aset keluarga dipindahkan atau dipakai tanpa persetujuan pihak yang berhak', + 'Perlu pemisahan antara masalah moral/perselingkuhan dan hak perdata keluarga', + 'Keputusan paling aman adalah langkah hukum bertahap berbasis dokumen', + ], + solusi: [ + 'Konsultasi hukum keluarga dan waris', + 'Mediasi keluarga dengan pihak netral', + 'Inventarisasi aset, utang, dan ahli waris', + 'Rencana hak asuh dan nafkah anak', + 'Pengamanan dokumen keluarga dan aset', + 'Pendampingan psikososial anak', + 'Penyusunan kronologi dan bukti', + 'Opsi penyelesaian damai tertulis', + 'Rujukan advokat atau pos bantuan hukum', + 'Koordinasi notaris/PPAT untuk urusan aset bila diperlukan', + ], + kesimpulan: + 'Kasus perselingkuhan, perceraian, warisan, dan banyak anak harus dipisahkan menjadi isu hukum keluarga, harta/waris, dan perlindungan anak; langkah aman adalah dokumentasi, mediasi, dan konsultasi hukum profesional.', + causeCategories: ['people', 'policy', 'process', 'other'], + }, ]; const uuid = () => @@ -332,11 +397,14 @@ const applyQuestionFitToDrafts = ( }; const findProblemKnowledge = (problem: string) => { - const text = problem.toLowerCase(); + const scoredKnowledge = PROBLEM_KNOWLEDGE.map((knowledge) => ({ + knowledge, + score: keywordFitScore(problem, knowledge.keywords), + })) + .filter((item) => item.score > 0) + .sort((a, b) => b.score - a.score); - return PROBLEM_KNOWLEDGE.find((knowledge) => - knowledge.keywords.some((keyword) => text.includes(keyword)), - ); + return scoredKnowledge[0]?.knowledge; }; const buildKnowledgeCauses = ( @@ -721,6 +789,182 @@ const buildKnowledgeSolutionDrafts = ( ]); } + if (knowledge.key === 'keluarga_hukum_waris') { + return withQuestionFit([ + { + title: 'Konsultasi hukum keluarga dan waris terpadu', + description: + 'Memisahkan isu perselingkuhan, perceraian, hak anak, harta bersama, dan warisan agar keluarga punya langkah hukum yang aman dan tidak merugikan 10 anak.', + rationale: `Diprioritaskan karena penyebab utama adalah ${topCauses}. Hipotesis yang diuji: ${topHypotheses}. Paket solusi dasar: ${allSolutionOptions}. Rekomendasi ini bersifat arahan awal dan perlu divalidasi dengan advokat, pos bantuan hukum, mediator, notaris, atau pejabat berwenang.`, + executionSteps: [ + 'Tulis kronologi singkat kejadian perselingkuhan, konflik rumah tangga, proses cerai, isu warisan, dan posisi 10 anak tanpa menyebarkan tuduhan ke pihak luar.', + 'Kumpulkan dokumen inti: buku nikah/akta cerai bila ada, kartu keluarga, akta kelahiran anak, identitas pihak terkait, sertifikat aset, rekening, surat utang, dan dokumen waris.', + 'Pisahkan masalah menjadi 4 jalur: status perkawinan/perceraian, hak asuh dan nafkah anak, harta bersama, serta warisan/ahli waris.', + 'Buat daftar ahli waris, aset, utang, dan pihak yang menguasai aset saat ini agar pembahasan tidak bercampur dengan emosi konflik.', + 'Jadwalkan konsultasi dengan advokat/pos bantuan hukum/mediator keluarga dan bawa dokumen serta pertanyaan tertulis.', + 'Tentukan langkah aman berikutnya: mediasi tertulis, perlindungan hak anak sementara, pengamanan dokumen, atau jalur pengadilan bila damai tidak memungkinkan.', + ], + kpis: [ + 'Kronologi dan dokumen inti terkumpul', + 'Daftar aset, utang, ahli waris, dan kebutuhan 10 anak tersusun', + 'Jadwal konsultasi hukum atau mediasi ditetapkan', + 'Rencana sementara hak asuh, nafkah, sekolah, kesehatan, dan tempat tinggal anak tersedia', + ], + risks: [ + 'Konflik keluarga memanas; mitigasi: gunakan mediator netral dan hindari keputusan sepihak saat emosi tinggi.', + 'Dokumen atau aset hilang/dialihkan; mitigasi: buat salinan dokumen, catat penguasaan aset, dan konsultasikan langkah pengamanan hukum.', + 'Hak anak terabaikan; mitigasi: dahulukan biaya hidup, sekolah, kesehatan, dan tempat tinggal anak sebelum sengketa harta diperluas.', + ], + resources: [ + 'Dokumen keluarga dan aset', + 'Advokat atau pos bantuan hukum', + 'Mediator keluarga', + 'Notaris/PPAT bila menyangkut aset', + 'Pendamping psikososial anak', + ], + type: 'other', + impact: 94 + urgency, + efficiency: 86, + speed: 82, + lowRisk: 78, + duration: 7, + rootCauseId: causes[0]?.id, + }, + { + title: 'Mediasi keluarga dan rencana perlindungan anak', + description: + 'Menurunkan eskalasi konflik dengan forum mediasi yang fokus pada keselamatan, kebutuhan, hak asuh, nafkah, dan stabilitas 10 anak.', + rationale: + 'Cocok saat konflik rumah tangga dan perceraian mulai memengaruhi anak-anak; mediasi membantu membuat kesepakatan sementara sebelum proses hukum berjalan lebih jauh.', + executionSteps: [ + 'Tentukan pihak yang wajib hadir dan pihak netral yang dipercaya, seperti mediator keluarga, tokoh yang disepakati, konselor, atau pendamping hukum.', + 'Buat agenda mediasi terbatas: kebutuhan anak, jadwal pengasuhan, nafkah sementara, akses sekolah/kesehatan, dan larangan mengalihkan aset tanpa persetujuan.', + 'Pisahkan pembahasan dugaan perselingkuhan dari pembahasan kebutuhan anak agar anak tidak menjadi alat tekanan konflik orang tua.', + 'Tuliskan hasil mediasi sementara secara jelas: siapa membayar apa, kapan, bukti pembayaran, akses komunikasi anak, dan tanggal review.', + 'Jika mediasi gagal atau ada ancaman/kekerasan, eskalasi ke pendamping hukum atau lembaga perlindungan yang berwenang.', + ], + kpis: [ + 'Agenda mediasi dan pihak netral disepakati', + 'Kesepakatan sementara nafkah dan pengasuhan anak tertulis', + 'Kebutuhan sekolah, kesehatan, dan tempat tinggal anak terpetakan', + 'Risiko konflik atau ancaman berkurang', + ], + risks: [ + 'Salah satu pihak menolak hadir; mitigasi: minta mediator mengirim undangan tertulis dan siapkan opsi konsultasi hukum.', + 'Anak terseret konflik; mitigasi: batasi pembicaraan orang dewasa dan libatkan pendamping anak bila perlu.', + 'Kesepakatan tidak dipatuhi; mitigasi: dokumentasikan pelanggaran dan konsultasikan penguatan formalnya.', + ], + resources: [ + 'Mediator keluarga', + 'Daftar kebutuhan anak', + 'Catatan komunikasi para pihak', + 'Pendamping hukum atau konselor', + ], + type: 'other', + impact: 90, + efficiency: 84, + speed: 88, + lowRisk: 82, + duration: 5, + rootCauseId: causes[1]?.id || causes[0]?.id, + }, + { + title: 'Inventarisasi harta bersama, warisan, dan ahli waris', + description: + 'Membuat peta aset, utang, status kepemilikan, ahli waris, dan dokumen pendukung sebelum ada pembagian atau keputusan atas warisan.', + rationale: + 'Cocok ketika perceraian dan warisan bercampur; inventarisasi mencegah aset diperebutkan tanpa data dan membantu menentukan isu mana yang perlu notaris, mediator, atau pengadilan.', + executionSteps: [ + 'Buat tabel aset: tanah, rumah, kendaraan, tabungan, usaha, barang berharga, piutang, dan utang beserta bukti dokumennya.', + 'Tandai status setiap aset: milik pribadi, harta bersama, harta warisan, masih sengketa, atau belum jelas.', + 'Susun daftar calon ahli waris dan hubungan keluarga berdasarkan dokumen resmi, lalu catat pihak yang masih perlu diverifikasi.', + 'Amankan salinan dokumen dan bukti penguasaan aset agar tidak hilang ketika konflik meningkat.', + 'Konsultasikan tabel aset dan ahli waris ke notaris/PPAT atau advokat agar langkah pembagian tidak salah prosedur.', + ], + kpis: [ + 'Tabel aset dan utang selesai', + 'Status harta bersama dan warisan dipisahkan', + 'Daftar ahli waris awal tersusun', + 'Dokumen aset tersalin dan aman', + ], + risks: [ + 'Data aset disembunyikan; mitigasi: kumpulkan bukti dari dokumen resmi, saksi, catatan transaksi, dan konsultasi hukum.', + 'Pembagian dilakukan sebelum status jelas; mitigasi: tahan keputusan pembagian sampai ada validasi pihak berwenang.', + 'Utang tidak dihitung; mitigasi: masukkan semua kewajiban sebelum menghitung bagian bersih.', + ], + resources: [ + 'Sertifikat dan bukti aset', + 'Dokumen ahli waris', + 'Catatan utang/piutang', + 'Notaris/PPAT atau advokat', + ], + type: 'other', + impact: 86, + efficiency: 82, + speed: 76, + lowRisk: 86, + duration: 10, + rootCauseId: causes[2]?.id || causes[0]?.id, + }, + ], [ + { + focus: 'perselingkuhan, perceraian, warisan, hak anak, harta bersama, dan perlindungan 10 anak', + keywords: [ + 'selingkuh', + 'perselingkuhan', + 'cerai', + 'perceraian', + 'warisan', + 'waris', + '10 anak', + 'anak', + 'hak anak', + 'hak asuh', + 'nafkah', + 'nafkah anak', + 'harta bersama', + 'harta gono gini', + 'gono gini', + 'gono-gini', + 'ahli waris', + ], + }, + { + focus: 'mediasi keluarga, konflik rumah tangga, pengasuhan, nafkah, dan stabilitas anak', + keywords: [ + 'mediasi', + 'konflik', + 'keluarga', + 'rumah tangga', + 'suami', + 'istri', + 'anak', + 'hak asuh', + 'nafkah', + 'damai', + 'konselor', + ], + }, + { + focus: 'inventarisasi aset, utang, harta warisan, ahli waris, sertifikat, dan prosedur notaris/pengadilan', + keywords: [ + 'aset', + 'harta', + 'warisan', + 'waris', + 'ahli waris', + 'sertifikat', + 'tanah', + 'rumah', + 'utang', + 'notaris', + 'ppat', + 'pengadilan', + ], + }, + ]); + } + return withQuestionFit([ { title: 'Pendampingan UMKM, modal mikro, dan digitalisasi usaha', @@ -1181,6 +1425,46 @@ const buildTasks = (solution: Solution): PlanTask[] => { const mainRisk = trimSentenceEnd( risks[0] || 'risiko eksekusi yang muncul selama uji coba', ); + const isLegalFamilyCase = Boolean( + `${solution.title} ${solution.description}`.match( + /hukum|waris|cerai|perceraian|hak asuh|nafkah|mediasi keluarga|anak/i, + ), + ); + + if (isLegalFamilyCase) { + return [ + { + id: uuid(), + day: 1, + title: 'Amankan fakta dan dokumen inti', + description: `Kumpulkan fakta dan dokumen awal untuk solusi “${solution.title}”: ${resources.slice(0, 3).join(', ') || 'dokumen keluarga, dokumen aset, dan daftar pihak terkait'}.`, + }, + { + id: uuid(), + day: 2, + title: 'Pisahkan isu hukum utama', + description: `Turunkan kasus menjadi langkah hukum pertama yang jelas: ${firstStep}. Pisahkan isu perceraian, warisan, harta, dan hak anak agar tidak bercampur.`, + }, + { + id: uuid(), + day: 3, + title: 'Mulai konsultasi atau mediasi', + description: `Jalankan langkah awal yang aman: ${secondStep}. Catat posisi tiap pihak, dokumen yang kurang, dan risiko untuk anak.`, + }, + { + id: uuid(), + day: 4, + title: 'Cek perlindungan anak dan aset', + description: `Bandingkan progress dengan indikator utama: ${kpis.slice(0, 3).join(', ') || 'dokumen, mediasi, perlindungan anak, dan status aset'}. Koreksi jika ada hak anak atau aset yang belum terlindungi.`, + }, + { + id: uuid(), + day: 5, + title: 'Putuskan jalur damai atau hukum formal', + description: `Pilih langkah lanjut berdasarkan dokumen, hasil konsultasi/mediasi, dan risiko utama: ${mainRisk}.`, + }, + ]; + } return [ { @@ -1237,6 +1521,10 @@ const buildConclusion = ( ? ` Knowledge base ${knowledge.label} memiliki severity ${knowledge.severity} dan kesimpulan domain: ${knowledge.kesimpulan}` : ''; + if (knowledge?.key === 'keluarga_hukum_waris') { + return `Kesimpulan: kasus ini berada pada prioritas ${priority} (${priorityScore}/100) dan perlu ditangani dengan pendampingan hukum/mediasi bertahap, bukan keputusan emosional atau sepihak. ${evidenceText}, akar masalah paling dominan adalah ${mainCause.toLowerCase()}.${knowledgeConclusion} Rekomendasi utama adalah “${selectedSolution.title}” karena memiliki Decision Score ${selectedSolution.score}/100, estimasi success rate ${selectedSolution.success}%, dan dapat mulai dieksekusi dalam ${selectedSolution.duration} hari. Fokus 5 hari pertama adalah mengamankan dokumen, memetakan perceraian/warisan/harta/hak anak, konsultasi dengan pihak profesional, lalu memilih jalur damai tertulis atau hukum formal.`; + } + return `Kesimpulan: kasus ini berada pada prioritas ${priority} (${priorityScore}/100) dan perlu ditangani dengan eksperimen terukur, bukan keputusan besar tanpa validasi. ${evidenceText}, akar masalah paling dominan adalah ${mainCause.toLowerCase()}.${knowledgeConclusion} Rekomendasi utama adalah “${selectedSolution.title}” karena memiliki Decision Score ${selectedSolution.score}/100, estimasi success rate ${selectedSolution.success}%, dan dapat mulai dieksekusi dalam ${selectedSolution.duration} hari. Fokus 5 hari pertama adalah mengunci baseline, menjalankan eksperimen kecil, mengukur KPI harian, lalu memutuskan scale, iterate, atau stop.`; };