# Kriteria Kelulusan JLPT & Kesiapan Project (Asesmen Final Roadmap)

> **Tujuan dokumen:** mendefinisikan kriteria umum kelulusan tiap level JLPT (N5–N1),
> lalu menilai apakah data & fitur Manabou saat ini mampu memenuhinya — sebagai dasar
> membangun fitur **Asesmen Final** pada roadmap (yang saat ini masih placeholder).
>
> **Dibuat:** 2026-06-09 · **Status:** observasi/analisis (belum ada implementasi asesmen)

---

## 1. Bagaimana JLPT yang sebenarnya menilai kelulusan

JLPT resmi (JLPT.jp) menguji **tiga seksi** dan menggabungkannya menjadi skor:

| Seksi | Isi | Catatan |
|---|---|---|
| **言語知識 (Pengetahuan Bahasa)** | Kosakata (文字・語彙) + Tata bahasa (文法) | Di N4/N5 digabung dengan reading dalam satu seksi |
| **読解 (Dokkai / Membaca)** | Pemahaman bacaan | Teks pendek → panjang sesuai level |
| **聴解 (Choukai / Mendengar)** | Pemahaman menyimak audio | Selalu seksi terpisah di semua level |

**Aturan lulus (dua syarat sekaligus):**

1. **Skor total** ≥ ambang lulus, **dan**
2. **Skor tiap seksi** ≥ ambang minimum per-seksi (*sectional pass mark*) — tidak boleh
   ada satu seksi pun yang nol/di bawah minimum, sekalipun total tinggi.

| Level | Total lulus | Skor maksimum | Ambang per-seksi |
|---|---|---|---|
| **N5** | 80 / 180 | 180 | 言語知識+読解: 38/120 · 聴解: 19/60 |
| **N4** | 90 / 180 | 180 | 言語知識+読解: 38/120 · 聴解: 19/60 |
| **N3** | 95 / 180 | 180 | 19/60 tiap seksi (3 seksi) |
| **N2** | 90 / 180 | 180 | 19/60 tiap seksi (3 seksi) |
| **N1** | 100 / 180 | 180 | 19/60 tiap seksi (3 seksi) |

**Intisari yang relevan untuk kita:** kelulusan JLPT **bukan** sekadar "tahu cukup banyak
kata". Ia mensyaratkan keseimbangan **4 kompetensi**: kosakata, tata bahasa, **membaca**,
dan **mendengar**. Asesmen final kita idealnya meniru struktur ini agar bermakna.

---

## 2. Kriteria umum per level (versi praktis untuk Manabou)

Karena kita membangun *asesmen internal* (bukan sertifikasi resmi), kita terjemahkan
standar di atas menjadi target kompetensi yang dapat diukur per level. Angka kosakata/kanji
mengikuti rentang yang lazim dikutip untuk tiap level.

| Level | Kosakata (≈) | Kanji (≈) | Tata bahasa | Membaca | Mendengar |
|---|---|---|---|---|---|
| **N5** | ~800 kata | ~100 kanji | Pola dasar (は/が, です/ます, bentuk-te dasar) | Kalimat & paragraf sangat pendek, topik sehari-hari | Percakapan lambat sehari-hari |
| **N4** | ~1.500 kata | ~300 kanji | Pola sehari-hari (bentuk biasa, ～たり, ～ば, keigo dasar) | Paragraf pendek, tema akrab | Percakapan kecepatan natural-lambat |
| **N3** | ~3.700 kata | ~650 kanji | Pola penghubung & nuansa (～わけ, ～ように, kausatif/pasif) | Artikel pendek, surat, instruksi | Percakapan & pengumuman kecepatan natural |
| **N2** | ~6.000 kata | ~1.000 kanji | Ekspresi formal/idiomatik (～において, ～かねない, ～ぬきで) | Editorial, artikel, teks semi-akademis | Berita, diskusi, monolog panjang |
| **N1** | ~10.000 kata | ~2.000 kanji | Gramatika lanjut/sastra/akademis, ekspresi bernuansa | Teks abstrak/akademis/sastra padat | Kuliah, debat, bahasa idiomatik cepat |

**Definisi "lulus sebuah level di Manabou"** (usulan, meniru aturan dua-syarat JLPT):

> Pelajar dianggap lulus level **L** bila pada asesmen final level L ia mencapai
> **skor total ≥ 60%** **dan** **tiap komponen (kosakata, kanji, tata bahasa, membaca,
> mendengar) ≥ 50%** — sehingga tak ada satu kompetensi pun yang tertinggal jauh.

---

## 3. Kondisi data project saat ini (terukur)

Diambil langsung dari database pada 2026-06-09:

| Domain | N5 | N4 | N3 | N2 | N1 | Sumber |
|---|---:|---:|---:|---:|---:|---|
| **Cards (kosakata)** | 889 | 788 | 1.302 | 1.473 | 2.139 | `cards.jlpt_level` (+207 null) |
| **Kanji** | 82 | 171 | 380 | 579 | 1.268 | `kanjis.jlpt_level` |
| **Grammar points** | 76 | 77 | 99 | 176 | **0** | `grammar_points.jlpt_level` |
| **Deck inti** | ✅ | ✅ | ✅ | ✅ | ✅ | `jlpt-n{1..5}-core` |

Aset pendukung lain:
- **CanDoTarget:** 69 baris (kompetensi "bisa melakukan X") — **tanpa kolom `jlpt_level`**.
- **Materials (bacaan):** 54 baris — kolom: `title, source, file_path, description, order`.
  **Tidak ada kolom level maupun tipe (reading).**
- **Readings (bacaan personal):** ada `type, language, content` — **tanpa `jlpt_level`**.
- **OndokuPassage (baca-nyaring):** 8 baris, punya `level` & `audio_path` — tapi ini
  latihan *produksi/pengucapan* (TTS + transkripsi Whisper), **bukan** soal listening.
- **CardQuizQuestion:** hanya 30 baris (sangat sparse); placement quiz onboarding sengaja
  dibangun **dinamis** dari `cards` (MCQ arti) alih-alih dari tabel ini.

---

## 4. Analisis kesenjangan: bisakah kriteria dipenuhi sekarang?

Legenda: ✅ siap · ⚠️ sebagian / perlu kerja · ❌ belum ada.

### 4.1 Kosakata (語彙) — ✅ **SIAP**
- Kartu tersedia di **semua** level (889→2.139). Cukup untuk membangun MCQ arti-kata
  bergaya JLPT 文字・語彙 di N5–N1.
- Infrastruktur kuis sudah terbukti: `OnboardingController::placement()` sudah men-generate
  MCQ arti dari `cards` per level (3 distraktor selevel). Ini bisa **langsung dipakai ulang**
  untuk komponen kosakata asesmen final.
- **Catatan kualitas:** distraktor saat ini dipilih acak selevel; untuk asesmen "sungguhan"
  sebaiknya distraktor yang lebih menjebak (kelas kata sama / makna berdekatan).

### 4.2 Kanji (漢字) — ⚠️ **SEBAGIAN**
- Data kanji lengkap N5–N1 (`kanjis` punya makna, bacaan on/kun, stroke, dst).
- ✅ **Generator soal kanji SUDAH ADA** (Tahap 2): MCQ karakter→arti dari `kanjis.meaning`.

### 4.3 Tata bahasa (文法) — ✅ **SIAP (N5–N1)**
- `grammar_points` kini lengkap **N5–N1** (76/77/99/176/**15**). N1 di-seed pada Tahap 3
  (`database/data/grammar/n1.json`, 15 pola inti).
- ✅ **Generator soal grammar SUDAH ADA** (Tahap 2): MCQ makna→pola dari `grammar_points`.
- Catatan: N1 hanya 15 pola (set minimal cukup untuk komponen asesmen). Roadmap N1 sengaja
  belum menambah objektif belajar grammar (kurikulum penuh menyusul).

### 4.4 Membaca (読解) — ✅ **SIAP (di asesmen)**
- **Revisi keputusan:** setelah inspeksi, `readings` ternyata konten **personal per-user**
  (AI-generated, terikat `user_id`) — **tidak cocok** sebagai kurikulum bersama. Maka
  dibuat **tabel terpisah** `reading_passages` + `reading_questions` (konten berjenjang,
  sama untuk semua). `materials` tetap diabaikan; `readings` personal dibiarkan.
- ✅ **Komponen reading SUDAH ADA** (Tahap 4): passage berjenjang per level + pertanyaan
  pemahaman MCQ (jawaban+distraktor tersimpan). Di-seed manual via `ReadingAssessmentSeeder`
  (2 passage/level × 3 soal). Generator AI bisa menyusul sebagai sumber tambahan.

### 4.5 Mendengar (聴解) — ❌ **BELUM ADA**
- **Tidak ada** model/tabel untuk soal listening comprehension di seluruh codebase.
- Audio yang ada hanya: TTS kata/kalimat (`audio_word_url`, `audio_sentence_url` pada
  `cards`), audio passage Ondoku, dan **Whisper untuk menilai ucapan pengguna** — semuanya
  *output/produksi*, bukan *soal menyimak*.
- **Perlu dari nol:** klip audio (atau TTS naskah) + transkrip + pertanyaan + jawaban,
  semuanya berjenjang per level. **Ini kesenjangan terbesar.**

### 4.6 Can-Do / Kompetensi bicara — ⚠️ tidak terikat level
- 69 `CanDoTarget` ada dan dipakai roadmap, tapi **tanpa `jlpt_level`**, sehingga tak bisa
  dipetakan otomatis "Can-Do mana untuk asesmen N3". Bukan bagian formal skor JLPT, tapi
  relevan untuk pilar "berbicara" Manabou.

---

## 5. Ringkasan kesiapan per level

> Diperbarui setelah Tahap 1–4 (vocab+kanji+grammar+reading terimplementasi).

| Level | Kosakata | Kanji | Tata bahasa | Membaca | Mendengar | Kesimpulan |
|---|:--:|:--:|:--:|:--:|:--:|---|
| **N5** | ✅ | ✅ | ✅ | ✅ | ✅² | Semua 5 komponen aktif (listening 2 klip, auto-generated) |
| **N4** | ✅ | ✅ | ✅ | ✅ | ⚠️ | listening: tambah file ke config/listening.php lalu generate |
| **N3** | ✅ | ✅ | ✅ | ✅ | ⚠️ | idem N4 |
| **N2** | ✅ | ✅ | ✅ | ✅ | ⚠️ | idem N4 |
| **N1** | ✅ | ✅ | ✅¹ | ✅ | ⚠️ | Grammar N1 = 15 pola inti; listening belum di-generate |

² N5 listening = 2 klip; soal otomatis dari transkrip (Whisper+GPT). N4–N1 tinggal
  daftarkan audio di `config/listening.php` lalu `php artisan nihongo:generate-listening`.

¹ N1 grammar = 15 pola inti (cukup untuk komponen asesmen, bukan kurikulum penuh).

**Kesimpulan umum:** komponen **kosakata, kanji, tata bahasa, dan membaca sudah aktif di
asesmen untuk semua level N5–N1**. Satu-satunya kesenjangan tersisa untuk memenuhi kriteria
JLPT penuh: **mendengar (聴解)** yang belum ada sama sekali (Tahap 5).

---

## 6. Rekomendasi bertahap untuk Asesmen Final

Disusun dari "paling siap & berdampak" ke "paling berat", agar tombol placeholder bisa
diganti fitur nyata secara inkremental tanpa menunggu semuanya selesai.

1. **Tahap 1 — Asesmen Kosakata (MVP).** ✅ **SELESAI.**
   `assessment_attempts` + `AssessmentService` + `AssessmentController`
   (`GET/POST /api/v1/assessments/{level}`). Gerbang: stage TERAKHIR tiap level hanya
   selesai jika asesmen level lulus (`RoadmapService::finalAssessmentPassed`). Halaman kuis
   `app/assessment/[level]/page.tsx`.

2. **Tahap 2 — Tambah Kanji & Tata bahasa.** ✅ **SELESAI.**
   `AssessmentService` kini multi-komponen: **vocab 10 + kanji 10 + grammar 5** (MCQ
   makna; kanji=karakter→arti, grammar=makna→pola dari `grammar_points.pattern`).
   Aturan skor **total ≥60% & tiap komponen ≥50%** diterapkan; komponen tanpa data
   (mis. grammar N1) **dilewati otomatis**. Hasil menampilkan breakdown per komponen.
   *(Komposisi kini +reading dari Tahap 4 → 10+10+5+5.)*

3. **Tahap 3 — Seed grammar N1.** ✅ **SELESAI.**
   `database/data/grammar/n1.json` (15 pola N1 inti, struktur+contoh lengkap) + `'n1'`
   ditambah ke `GrammarSeeder::LEVELS`. Komponen grammar N1 di asesmen kini hidup.
   Catatan: roadmap N1 **tetap** tanpa objektif belajar grammar (15 pola = set minimal untuk
   gerbang asesmen, bukan kurikulum penuh) — `LearningPathSeederTest` `n1_has_no_grammar`
   tetap berlaku.

4. **Tahap 4 — Membaca (読解).** ✅ **SELESAI.**
   Tabel baru `reading_passages` + `reading_questions` (konten kurikulum bersама, terpisah
   dari `readings` personal) + `ReadingAssessmentSeeder` (passage berjenjang N5–N1 +
   pertanyaan MCQ). Komponen **reading 5 soal** ditambah ke asesmen; tiap soal membawa
   konteks passage yang dirender di UI. Komposisi total: **vocab 10 + kanji 10 + grammar 5
   + reading 5**. Di-skip otomatis bila level tak punya passage.

5. **Tahap 5 — Mendengar (聴解).** ✅ **SELESAI (N5 × 2, menunggu validasi lanjut).**
   Tabel `listening_items` (`level`, `audio_path`, `transcript`, `question`,
   `correct_answer`, `distractors`, `sort_order`) + model `ListeningItem`. Audio
   asli di `public/audio/{level}/*.mp3` (di-serve backend via `url()`).
   **Soal TIDAK ditulis manual** — itu menyebabkan pertanyaan tidak sinkron dengan
   audio. `ListeningGeneratorService` membuatnya otomatis & sinkron: **Whisper
   mentranskrip audio → GPT menulis soal 聴解 gaya JLPT (pertanyaan + 4 pilihan dalam
   bahasa Jepang) dari transkrip itu**. Komponen `listening => 3` ditambah ke
   `AssessmentService`. **Generate ulang**: command `php artisan nihongo:generate-listening`
   (`--level`, `--only`, `--regenerate`) + halaman admin `admin/listening`
   (permission `listening.manage`) dengan audio player, transkrip, soal, dan tombol
   **Generate Ulang** per item. Peta level→file di `config/listening.php`.

6. **Tahap 6 — Integrasi gerbang.**
   Hubungkan hasil "lulus" ke `syncProgress`/milestone roadmap, dan tautkan
   `CanDoTarget.jlpt_level` (perlu kolom baru) untuk pilar berbicara.

> **Status implementasi (per 2026-06-09):** Tahap 1 & 2 **sudah berfungsi**. Tombol di
> stage terakhir roadmap kini CTA nyata "Mulai Asesmen Kelulusan {level}" → membuka kuis
> multi-komponen (vocab+kanji+grammar). Lulus = level selesai & naik level. Tahap 3–6
> (seed grammar N1, membaca via `readings`, mendengar dari nol, integrasi Can-Do) masih
> menjadi pekerjaan berikutnya.
