> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sertifikasitrainer.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Prompt trainer (section)

> 4 gelombang AI yang mengisi masterJson sebelum 15 dokumen trainer di-render.

Trainer flow punya **15 file output**, tapi AI utama jalan di **section generator** — satu prompt per *section* `masterJson`, bukan per file DOCX.

File: `apps/api/src/generation/trainer-section-generator.service.ts`\
Fungsi prompt: `buildPrompt(sectionName, context)`

## System prompt (semua section)

```
You are a BNSP document generator for Indonesian vocational training.
Output ONLY valid JSON matching the requested schema.
No markdown, no explanation, no extra text.
```

Model: `env.AI_MODEL` (default `deepseek-v4-flash`), `temperature: 0.3`, `max_tokens: 4000`, `response_format: json_object`.

## Empat gelombang generate

| Gelombang | Sections                                                                               | Ketergantungan                                       |
| --------- | -------------------------------------------------------------------------------------- | ---------------------------------------------------- |
| **1**     | `organizer`, `document`, `people`, `requirements`, `time_allocation`, `training_needs` | Data chat + unit                                     |
| **2**     | `curriculum`, `resources`, `safety`                                                    | Butuh wave 1 (organizer, curriculum untuk resources) |
| **3**     | `lesson_plan`, `pretest`, `posttest`, `evaluations`                                    | Butuh curriculum                                     |
| **4**     | `assessment`, `certification`, `signatures`, `test`                                    | Butuh unit KUK + training                            |

Gelombang berjalan berurutan; section dalam satu gelombang bisa paralel.

## Section tanpa panggilan AI

| Section           | Cara isi                                                |
| ----------------- | ------------------------------------------------------- |
| `time_allocation` | Hitung deterministik dari JP (`total_jp`, `jp_minutes`) |
| `signatures`      | JSON statis + nomor MET acak                            |
| `test`            | Template jawaban kosong                                 |

## Ringkasan prompt per section

### Wave 1

**organizer** — JSON: `name`, `letterhead_text`, `logo_placeholder`\
Nama lembaga realistis sesuai bidang keahlian.

**document** — JSON: `city`, `date_text`, `prepared_by`, `validator`\
Kota dari konteks (bukan placeholder `<kota>`).

**people** — JSON: `trainer`, `assessor`, `assessee`

**requirements** — JSON: persyaratan peserta & instruktur (pendidikan, pengalaman, kesehatan)

**training\_needs** — JSON: `items[]` analisis kebutuhan (1–2 baris pekerjaan)

### Wave 2

**curriculum** — JSON: `items`, `modules` (teori/praktik, topik per modul)\
Membaca elemen unit dari WSP.

**resources** — JSON: `materials[]`, `equipment[]` (min. 2–3 masing-masing)\
Hint peralatan dari `variable_constraints` WSP bila ada.

**safety** — JSON: `jsa.items[]` (5 item Job Safety Analysis, dominan risiko peralatan)

### Wave 3

**lesson\_plan** — JSON: `sections[]` pembukaan, inti (sesuai modul), penutup + durasi JP

**pretest** — JSON: `question_bank` 5–10 soal PG, `question_id` format `PRE-X`

**posttest** — sama struktur, `POST-X`, topik sama pretest soal berbeda

**evaluations** — JSON: pertanyaan evaluasi trainer (8–10), materi (4–6), penyelenggara (4–6), format Ya/Tidak

### Wave 4

**assessment** — JSON besar: aturan asesmen, observasi per elemen/KUK, demonstrasi, pertanyaan lisan\
`pretest_scoring.items` **wajib kosong** — diisi otomatis dari soal pre-test di doc 09.

**certification** — JSON: skema sertifikasi, LSP, `scheme_number` dari referensi WSP

## Setelah masterJson lengkap

Tiap `trainer-*` composer membaca section yang relevan + **unit content deterministik**:

`apps/api/src/generation/composers/trainer/trainer-unit-content.ts`

* Soal pre/post test bisa di-generate dari teks KUK
* FR.IA.01–03 mengisi checklist dari elemen unit
* Evaluasi rubric dari bank soal pretest

Jadi **15 dokumen** mayoritas `aiMode: none` di registry — AI sudah "habis" di tahap section.

## Context yang disuntik ke setiap prompt

Dari `ctxFields()` / canonical state:

* `trainingName`, `unitName`, `unitCode`
* `trainerName`, `expertise`, `audience`, `outcome`
* `totalJp`, `jpMinutes`, `deliveryMethod`, `city`
* Section sebelumnya di `existingSections` (untuk kurikulum → resources → lesson plan)

## Retry & parse

* Max **2 retry** per section
* Parser: `tryParseJson` + perbaikan trailing comma, single quote, unquoted keys (sama pola generate job utama)

## Mengedit prompt trainer

1. Buka `trainer-section-generator.service.ts` → `buildPrompt()` → case section yang ingin diubah
2. Untuk aturan global JSON, ubah system message di `callAI()`
3. Deploy API worker

Untuk mengubah **isi template DOCX** (bukan prompt), edit composer per dokumen di `apps/api/src/generation/composers/trainer/`.
