# RUNBOOK CODEX — 15 iklan 15 detik (TKBGN · EGSP · CKCF)

Paket ini **siap jalan**: naskah sudah lolos gerbang, prompt frame + prompt video
sudah dirakit (`prompts/`), jangkar wajah praktisi sudah dipotong dari LP
(`anchor/`). Codex tinggal menjalankan lima langkah di bawah — **jangan menulis
ulang naskah atau mengarang praktisi baru**.

| Kode | Brand di CTA | LP | Praktisi (wajah dikunci) |
|---|---|---|---|
| TKBGN | Toko Bangunan Praktis | lp-tkbgn.pages.dev | Mas Yusuf Maulana (kacamata, kemeja maroon) |
| EGSP | Egg Supply Playbook | lp-egsp.pages.dev | Mas Hendra Prasetyo (kumis, rompi khaki) |
| CKCF | Crochet Keychain to Fun | tika-rajut.my.id | Mbak Tika Ardiani (hijab navy, kacamata bulat, mustard) |

---

## Aturan yang TIDAK boleh dilanggar

1. **Gambar hanya codex image gen.** Higgsfield untuk video saja. Jalur web/Chrome dilarang.
2. **Wajah dari jangkar LP** (`anchor/<KODE>-anchor.png`) lewat `-i`. Jangan bikin orang baru.
3. **Frame & video POLOS — nol tulisan.** Headline TIDAK dipanggang.
4. **Headline + subtitle dipasang MANUAL sesudah video jadi** (langkah 4), bukan oleh model.
5. **TANPA HARGA.** Tidak ada nominal produk di gambar, suara, maupun teks.
6. **Startframe wajib** (`mode: omni_reference` + `role: start_image`), bukan referensi longgar.
7. **Revisi hanya untuk cacat parah, maksimal 1× per video.**
8. Paralel: frame maks 5 sekaligus, video Seedance maks 10 job sekaligus.

---

## Langkah

### 1. Rakit ulang prompt (opsional, memastikan gerbang masih hijau)
```bash
python build3.py
```
Harus keluar `15 prompt lolos gerbang`. Kalau merah, betulkan naskah dulu — jangan lanjut.

### 2. Startframe codex (15 gambar)
```bash
python gen_frames3.py
```
- ukuran 1080x1920, backend codex, `-i anchor/<KODE>-anchor.png`
- setelah jadi: **lihat mata** tiap frame — pastikan nol tulisan, sepertiga atas lapang,
  wajah sama dengan jangkar, produk terlihat jelas.

### 3. Video Seedance 2.5 (15 video)
```bash
python pararel3.py                 # semua
python pararel3.py CKCF-1 CKCF-2   # sebagian
```
Parameter yang dipakai runner (jangan diubah):
`model seedance_2_5 · duration 15 · resolution 480p · aspect_ratio 9:16 ·
mode omni_reference · medias[0] = {role: start_image, value: <media_id frame>} ·
generate_audio true`

Jebakan yang sudah ditangani runner: **cegatan preset** (jawaban berisi `Preset id:` =
tidak ada job; runner otomatis submit ulang dengan `declined_preset_id`) dan
**akun Higgsfield dipakai bersama** (hanya percaya job id submit sendiri, jangan
memungut generasi terbaru milik orang lain).

Gerbang startframe tiap video:
```bash
python gerbang_startframe.py CKCF-1
```
Lulus kalau selisih frame-0 vs PNG **< 45**. Kalau gagal → 1× regenerate; kalau masih
gagal, pakai take terbaik dan catat di laporan.

### 4. Pasang headline + subtitle MANUAL (inti perintah Roni)
```bash
python retime3.py
```
Yang dikerjakan:
- ASR per kata (faster-whisper `small`) pada video mentah → waktu tiap kata
- **teks selalu dari naskah**, ASR hanya dipakai untuk WAKTU (ejaan mustahil salah)
- headline 2 baris ditempel diam di area atas (style ASS `head`, Alignment 8, 0→15,02)
- subtitle mengikuti mulut (style `sub`), lalu dibakar sekali jalan dengan ffmpeg
- gerbang: durasi 14,8–15,2 dtk, H.264 480x854, nol event lewat batas/tumpang tindih

Verifikasi lintasan ASR **berbeda** (bukan memeriksa diri sendiri):
```bash
python verifikasi3.py
```
Target ≥95% potongan sinkron. (Batch CHUR: 97%.)

### 5. Distribusi
- gDrive **root stabil per bisnis, jangan bikin link baru**:
  `gdrive:bekalbisnis-ads/<YYYY-MM-DD>/<KODE>/`
  (root bekalbisnis-ads = `1L9PZRI5t5WfzFeN5ceEqxApf6S-aVQDH`)
- rute upload: PC → Mac → VPS Tailscale `100.93.99.26` → `rclone copy` (jangan rclone dari Mac)
- lapor **japri** ke Roni/Zuri (jangan grup): jembatan WA di Mac
  `POST http://127.0.0.1:3045/send`, chatId `45166077448313@lid`, payload lewat berkas JSON.

---

## Isi paket

```
prompts/<KODE>-<n>-frame.txt   prompt startframe codex (siap tempel)
prompts/<KODE>-<n>-api.txt     prompt video Seedance (siap kirim API, <=4000 karakter)
anchor/<KODE>-anchor.png       wajah praktisi dipotong dari LP — kunci wajah
naskah_<kode>.py               sumber naskah (4 kalimat + ketukan + aksi kamera)
prompt_lib3.py                 perakit prompt (tokoh, brand, aturan polos)
build3.py                      gerbang: 37-40 kata, kpm 147-170, hook <=8, tanpa harga
gen_frames3.py                 runner frame codex (paralel)
pararel3.py                    runner video Seedance (paralel, anti cegatan preset)
retime3.py                     pemasang headline manual + subtitle sinkron ASR
verifikasi3.py                 pemeriksa subtitle lintasan ASR terpisah
gerbang_startframe.py          bukti video benar-benar mulai dari frame kita
BRIEF-TKBGN.md / BRIEF-EGSP.md / BRIEF-CKCF.md   brief per kode (isi & alasan)
```
