

## hc65 Healthcare StudioSoft (2026-10-14 02:06 WIB)
- Threads carousel (RE-AIR `tips-seo-digital-marketing-surabaya-optimasi-local...`): 15 Oct 2026 09:00 WIB | album `6ace813fc13ce6591f7136cc` + 2 replies (`6ace813fcd4d7629786bc594`, `6ace813fcd4d7629786bc59b`)
- LinkedIn TEXT `6ace8140c13ce6591f7136e7` (14 Oct 2026 17:00 WIB) memakai artikel `https://studiosoft.id/cara-bikin-prompt-ai-yang-bagus-bukan-generik/`
- FB TEXT `6ace8140c13ce6591f7136f4` (19 Oct 2026 19:30 WIB) memakai artikel `https://studiosoft.id/10-channel-digital-marketing-rumah-sakit-yang-wajib-dikelola-di-era-online/`
- Artikel Threads: https://studiosoft.id/tips-seo-digital-marketing-surabaya-optimasi-local-untuk-klinik-dan-bengkel-lokal/

## Carousel feed IG StudioSoft 14 Okt 2026 (02:35 WIB) — SLOT SUDAH TERISI, SKIP CREATE
- Jam tayang: 14 Okt 2026 08:30 WIB (slot 01:30Z). Jadwal SUDAH ada dari antrean yang dikunci 3 Okt (`kunci_car10_okt.py`) → job tidak membuat ulang (maks 1 carousel/hari/akun).
- ID jadwal: `6ac102801733078385cc95b0` · akun Kreasi Studiosoft · `type=album` · 10 media · `status=pending` · `replies=0`
- Topik: "Cara Bikin Prompt AI yang Bagus (Bukan Generik)" — artikel `https://studiosoft.id/cara-bikin-prompt-ai-yang-bagus-bukan-generik/` (WP #7530, status `publish`, link persis sama → aman)
- Media: `ss_car10_promptai_01..10.jpg` → 200 di KEDUA ingress funnel (103.84.155.153 & 103.84.155.217)
- Story mirror 08:40 WIB: `ss_story_canvas_ss_car10_promptai_01.jpg` (200 dua ingress)
- Warna: slide 1 PUTIH → selang-seling (pola tanggal genap). Cek rantai `ritme_warna_ss.py`: 08:30 PUTIH → 11:00 BIRU (reel `ss_reel_biru_19.mp4`) ✅ kebalikan.
- Caption 558 char, 5 hashtag huruf kecil, ada CTA komentar, 0 mention, 0 CJK.
- QC visual 2 putaran (contact sheet + vision): 10 slide bersih, tidak ada overflow/tofu.
- Temuan sampingan: slot 19:00 WIB & story 07/14/20 WIB SUDAH tidak punya jadwal ke depan (terakhir tayang 6 Okt) — stok aset roll habis. Yang jalan ke depan 31 Okt: 08:30 album + 08:40 story mirror + 11:00 reel.
- Script probe: `_probe_car10_14okt.py`, `_cek_car10_14okt.py`, `_qc_car10_14okt.py`, `_cek_slug_promptai.py`, `_cek_pipeline_igss_14okt.py`

## Irama terbit StudioSoft — tambah artikel (2026-10-14 07:05 WIB)
- Pemicu: `ss_jadwal_cek.py` melaporkan 3 hari kosong (26, 27, 28 Okt) dengan persediaan 11 hari.
- Topik diambil dari `ss_topik_bank.json` entri pertama tanpa tanda "dipakai" (pilar A uang):
  "Serah Terima Website: Berkas dan Akses yang Harus Anda Terima", fokus `serah terima website`.
- Kanibalisasi: `ss_cek_topik.py` → aman, skor tertinggi 0,25 (post #5038) dari ambang 0,34.
- Naskah: 1.140 kata, 8 h2, 4 h3 (bagian tanya-jawab), 3 tautan internal (semua dicek HTTP 200),
  tombol WA `wa.me/6281935000624`. `cek_pola_ai.py`: bersih (0 em dash, 0 kutip melengkung, 0 CJK,
  0 patahan baris dalam paragraf).
- Alur: draf #9402 dibuat dulu (meta Yoast terbaca balik via `context=edit`), lalu dijadwalkan
  `status=future` pada 2026-10-26T08:00:00 (waktu situs Asia/Jakarta).
- Hasil: jadwal jadi 13 artikel, rentang 14 s/d 26 Okt. Sisa hari kosong: 27 dan 28 Okt.
- Skrip: `ss_artikel_serah_terima_website.py` (`--apply`, `--jadwalkan YYYY-MM-DD`).


## Artikel harian TSC — Kutil Kulit (2026-10-14 07:15 WIB)
- Pemicu: `tsc_jadwal_cek.py` melaporkan persediaan 5 hari (jadwal sampai 19 Okt) → perlu ditindak.
- Topik dari `tsc_topik_bank.json` entri pertama tanpa tanda "dipakai": "Kutil Kulit".
  Judul jadi: "Kutil Kulit: Penyebab, Cara Menular, dan Penanganan di Klinik", fokus `kutil kulit`.
  Sudut sengaja dibedakan dari artikel lama #1691 (daftar cara rumahan, 961 kata) dan #1697.
- Kanibalisasi: `tsc_cek_topik.py` → aman, skor tertinggi 0,14 dari 176 halaman. Var
  "Kutil Kulit dan Kutil Kelamin, Apa Bedanya" justru BENTURAN (0,33) → dibuang.
- Naskah: 1.221 kata, 6 h2 isi + 1 h2 tanya-jawab + 1 h2 "Baca juga", 4 h3, 5 tautan internal
  (semua dicek HTTP 200 sebelum dipakai), tombol WA `wa.me/6285117444417`.
  `cek_pola_ai.py`: bersih (0 em dash, 0 kutip melengkung, 0 CJK, 0 tanda seru).
- Meta Yoast lewat XML-RPC `wp.editPost` (judul 51 char, deskripsi 148 char, fokus `kutil kulit`),
  terbaca balik lewat `wp.getPost`.
- Gambar unggulan buatan sendiri (1000x567 webp, pola `tsc_buat_featured_desain.py`), media #10336,
  terpasang sebagai `featured_media` + alt_text.
- Alur: draf #10334 → dibaca balik → `status=future` 2026-10-20T01:00:00 (waktu situs UTC;
  08:00 WIB). Jadwal kini 7 artikel, 14 s/d 20 Okt, aturan 1 artikel/hari aman.
- Sisa: 8 hari kosong (21 s/d 28 Okt), persediaan 6 hari.
- Skrip: `tsc_artikel_kutil_kulit.py` (`--draft`, `--schedule YYYY-MM-DD`).

## StudioSoft — klaster turunan artikel #3535 (permintaan Bos 14 Okt)

Bos: *"buatkan beberapa artikel breakdown lebih detil dari konten itu… kasih backlink… buatkan dengan
semantic thinking & humanis… pastikan SEO playbook"* + *"sementara di draft aja"* + *"featured image
crop ya 1000x567 px dan webp"*.

Artikel induk: `/9-contoh-konten-digital-marketing-rumah-sakit-yang-edukatif-dan-tetap-etis/` (#3535,
1.226 kata, 1.226 tayangan? — GSC 90 hari hanya 13 tayangan/1 klik, tapi Bos menyebut banyak yang nonton).

**5 DRAF dibuat** (`ss_klaster_rs_konten.py --draft`), kategori Healthcare Digital #1042 + Digital
Marketing #26:
```
#9406  konten-tanya-dokter-rumah-sakit               1.101 kata · gambar #9408
#9409  testimoni-pasien-media-sosial-rumah-sakit     1.023 kata · gambar #9411
#9412  konten-prosedur-medis-bahasa-sederhana        1.014 kata · gambar #9414
#9415  konten-edukasi-gejala-penyakit-rumah-sakit    1.041 kata · gambar #9417
#9418  faq-layanan-rumah-sakit                       1.037 kata · gambar #9420
```
Per artikel: gambar unggulan **1000x567 WebP** (dibuat sendiri, foto pustaka ternyata nama berkas tidak
sesuai isi — ada foto mobil & bunga), tombol WA, FAQ 5 + **FAQPage schema**, meta Yoast (fokus di awal
deskripsi), 3-5 tautan internal semuanya **200**, dan **tautan balik ke #3535** di setiap artikel.

Temuan sampingan: 3 tautan internal di artikel induk #3535 **mati (404)**:
`/kenapa-rumah-sakit-dan-klinik-wajib-punya-strategi-digital-marketing/`,
`/konten-edukasi-kesehatan-kepercayaan-pasien/`, `/website-rumah-sakit-gagal-pasien/`.

Skrip: `ss_peta_klaster_rs.py` (peta bahan), `ss_klaster_rs_konten.py` (buat draf),
`ss_rapikan_draf_rs.py` (rapikan patahan baris; cadangan `ss_backup_klaster_rs.json`),
`ss_verif_klaster_rs.py` (verifikasi).

## TSLaw — label gambar + tombol WhatsApp semua artikel (permintaan Bos 14 Okt)

Bos: *"label = Tito Law Firm"* dan *"untuk artikel di TS Law pastikan ada WA Button ya"*.

- **Label gambar #3566** (media #3759): judul/alt/caption diubah jadi **"Tito Law Firm"**; credit
  "Foto: Pexels (…)" dihapus. (`tslaw_label_gambar_3566.py`).
- **TEMUAN ejaan nama firma tidak seragam**: WP site title & judul SEO = "Tito **Suprianto** Law Firm"
  (benar), tetapi **schema/JSON-LD** (Organization, WebSite name, logo caption) = "Tito **Supriyanto**
  Law Firm" di SEMUA halaman → sumbernya pengaturan Yoast Site representation, perlu diubah Bos di UI.
  (Belum dijawab Bos mana yang benar.)
- **Audit tombol WA**: nomor resmi **6281909222026** (dari beranda). Dari **76 artikel** (publish/draft/
  future), 74 sudah ada tombol di isi, **2 belum**: #3207 `kontrak-bisnis-yang-aman` dan
  #3205 `panduan-mendirikan-pt-untuk-umkm`. `tslaw_pasang_tombol_wa.py --go` → keduanya dipasang
  (gaya sama: navy #1c2b4a, label "Konsultasi via WhatsApp", pesan praterisi sesuai topik, plus kalimat
  pembuka). **Verifikasi: 76/76 artikel punya tombol** · halaman hidup dicek, tombol tampil.
  Cadangan: `tslaw_backup_tombol_wa.json` · audit: `drafts/tslaw_audit_wa.json`.

### Ejaan nama firma TSLaw — Bos: yang betul "Suprianto" (14 Okt)

`tslaw_perbaiki_ejaan.py --go` → **16 objek diperbaiki**: 15 artikel/halaman (isi + judul + kutipan) yang
memakai "Tito Supriyanto Law Firm" → "Tito Suprianto Law Firm". Cadangan: `tslaw_backup_ejaan.json`.
Dicek ulang: 0 sisa. **Keterangan media tidak ada yang salah.**
**SISA yang perlu tangan Bos**: schema/JSON-LD masih menulis "Supriyanto" pada WebSite name, Organization
name, dan logo caption → sumbernya pengaturan **Yoast SEO → Settings → Site representation / Site basics**
(tidak bisa diubah lewat API).
**→ Bos sudah mengubahnya (14 Okt). Diverifikasi ulang** (`tslaw_cek_ejaan_schema.py`): beranda, #3566,
/law-firm-surabaya/, /kontrak-bisnis-yang-aman/ → **"Suprianto" 0 temuan "Supriyanto"**. Schema kini:
WebSite name "Tito Suprianto Law Firm | Law Firm Surabaya", Organization "Tito Suprianto Law Firm",
logo caption "Tito Suprianto Law Firm". Situs sudah konsisten.

### Tautan mati di artikel induk StudioSoft #3535 (Bos minta dirinci)

Rincian lengkap (`ss_rinci_tautan_mati_3535.py`):
1. `/kenapa-rumah-sakit-dan-klinik-wajib-punya-strategi-digital-marketing/` — jangkar «digital marketing
   rumah sakit & klinik»; kalimat "Panduan lengkap strateginya ada di …, lengkap dengan SEO lokal dan
   Google Business Profile." → calon pengganti **`/rs-klinik-digital-marketing-2026/`** (persis sama topiknya, 200).
2. `/konten-edukasi-kesehatan-kepercayaan-pasien/` — jangkar «Pentingnya Konten Edukasi Kesehatan untuk
   Meningkatkan Kepercayaan Pasien»; kalimat "Baca juga: …" → belum ada halaman pengganti yang persis;
   calon: `/panduan-seo-klinik-rumah-sakit/` (200) atau dihapus.
3. `/website-rumah-sakit-gagal-pasien/` — jangkar «Kenapa Website Rumah Sakit Sering Gagal Menghasilkan
   Pasien Baru?»; kalimat "Baca juga: …" → calon pengganti **`/pembuatan-website-rumah-sakit/`** (200).
Menunggu izin Bos sebelum dipasang.

### Klaster StudioSoft #3535: draf DIBIARKAN (perintah Bos)

Bos: *"biarkan draft dan jadwalkan dari WP mengikuti antrian yang sudah ada"* → 5 draf (#9406, #9409,
#9412, #9415, #9418) tetap `draft`, tidak dijadwalkan oleh saya. Antrean WP saat ini berakhir 26 Okt 08:00;
slot berikutnya 27-31 Okt kalau nanti mau dijajarkan.

### Tiga slug mati DIHIDUPKAN jadi artikel baru (perintah Bos 14 Okt)

Bos: *"bukan hanya pengganti. tapi slug itu tetap berjalan, jadi buat artikel dengan judul dan slug itu.
jadikan status 404 jadi 200 … aturan SEO Playbook, feature image crop, dan ada WA Button"*.

`ss_artikel_slug_mati.py --terbit` → **3 artikel terbit** (kategori Healthcare Digital #1042 + DM #26):
```
#9498  /kenapa-rumah-sakit-dan-klinik-wajib-punya-strategi-digital-marketing/   1.026 kata · gambar #9500
#9501  /konten-edukasi-kesehatan-kepercayaan-pasien/                            1.032 kata · gambar #9503
#9504  /website-rumah-sakit-gagal-pasien/                                       1.014 kata · gambar #9506
```
Per artikel: 1.000-1.300 kata, gambar unggulan **1000x567 WebP** + alt, tombol WA, FAQ 5 + **FAQPage
schema**, meta Yoast (fokus di awal deskripsi), 3-6 tautan internal semuanya hidup.
**Verifikasi** (`ss_verif_slug_mati.py`): ketiga URL **404 → 200** · ketiga tautan di artikel induk #3535
sekarang mengarah ke halaman hidup · CJK 0 · patahan baris 0 · tautan mati 0.
Catatan: artikel terbit langsung (bukan draf) karena tujuannya mengubah 404 jadi 200.

### StudioSoft — sisir tautan mati seluruh situs (perintah Bos 14 Okt)

Bos: *"ok sip. pastikan tidak ada tautan mata [mati]"*.

`ss_sisir_tautan_mati.py` + `ss_sisir_tautan_mati2.py`: **341 artikel/halaman** diperiksa, **470 tautan
unik**, ketemu **35 tautan bermasalah**. Setelah disaring (buang URL /wp-json hasil pembacaan sendiri,
sosial media yang menolak bot, dan balasan 403 yang bukan halaman mati) → **28 tautan mati nyata**.

`ss_perbaiki_tautan_mati.py --go` (jalan pertama) → 40 tautan diperbaiki di 30 artikel/halaman.
**Ternyata belum tuntas**: daftar sumber per tautan dibatasi 4 entri (`if len(dari) < 4` di skrip sisir),
jadi kemunculan di artikel lain belum tersentuh. Diketahui saat verifikasi ulang (`ss_sisir_tautan_mati2.py`).

**Perbaikan menyeluruh**: `ss_perbaiki_tautan_mati2.py --go` → **50 kemunculan dibersihkan di 34
artikel/halaman** (25 tautan internal diganti halaman hidup, sisanya dilepas tautannya teks tetap).
Tujuan pengganti diperiksa dulu satu per satu: semuanya 200. Cadangan: `ss_backup_tautan_mati_lengkap.json`.
**Verifikasi akhir: 0 kemunculan sisa** (jalankan ulang skrip yang sama → "0 kemunculan di 0 entri").

Tautan internal yang diganti (contoh): `/digital-marketing-bisnis-keuangan/` → `/marketing-keuangan/`,
`/digital-marketing-bisnis-retail/` → `/digital-marketing-retail/`,
`/digital-marketing-bisnis-properti/` → `/digital-marketing-properti/`,
`/digital-marketing-bisnis-manufaktur/` → `/marketing-manufaktur/`,
`/analitik-digital-bisnis-properti/` → `/analitik-properti/`, `/seo-untuk-bisnis-properti/` → `/seo-properti/`,
`/google-business-profile-untuk-klinik/` → `/google-business-profile-klinik/`,
`/panduan-seo-untuk-klinik-dan-rumah-sakit/` → `/panduan-seo-klinik-rumah-sakit/`,
`/blog/` → `/artikel/`, `/konsultasi/` → `/kontak/`.

**TEMUAN PENTING — jejak SEO lama yang berbahaya** (dilepas): tautan ke `rentpbn.my.id` (domain PBN),
`repository.stikeshb.ac.id/journal/panduan-memilih-jasa-seo-…` (tautan spam di situs kampus), dan
`papdisurabaya.org` (domain mati). Tautan luar mati lain: binari.co.id, blog.google, developers.google.com,
wipo.int, yoast.com/ai-seo (halaman pindah).

Verifikasi ulang seluruh situs: `ss_sisir_tautan_mati2.py` (hasil di `/tmp/ss_verif_tautan.txt`).

### TEMUAN BESAR: 158 tautan tak terlihat di StudioSoft (Bos: "tautan lama itu hilangkan saja")

`ss_cari_tautan_mencurigakan.py` → **158 tautan tak terlihat** (`<a href="..."></a>` tanpa teks apa pun)
di **22 artikel/halaman**. Bentuknya tidak kelihatan pembaca, tapi tetap dibaca mesin pencari —
pola khas titipan tautan dari pekerjaan SEO lama.

Domain yang dititipkan (jumlah tautan):
```
studiosoft.id 53 · exabytes.co.id 14 · studioweb.co.id 11 · top4marketing.co.id 7 ·
creativism.id 5 · ideoworks.id 5 · learn.microsoft.com 4 · ardata.co.id 3 ·
lantarandigital.co.id 3 · cmlabs.co 3 · facebook.com 3 · fruitylogic.com 2 · slice.id 2 · biznetgio.com 2
```
Sebagian besar **agensi digital pesaing** — bukan rujukan yang masuk akal untuk artikel StudioSoft.

**Dihapus semua**: `ss_hapus_tautan_tak_terlihat.py --go` → 8 tautan (jalan pertama, 2 entri),
lalu 150 tautan (20 entri) setelah pengecekan teks diperbaiki (karakter tak terlihat bikin pengecekan
pertama menolak menyimpan). Cadangan: `ss_backup_tautan_tak_terlihat.json`.
**Verifikasi: 0 tautan tak terlihat tersisa** (`ss_verif_tautan_tak_terlihat.py`) · teks yang terlihat
pembaca tidak berubah sama sekali.
Cek tambahan pola serupa (teks jangkar kosong karena spasi tak terlihat): `ss_hapus_tautan_kosong2.py`
→ **0 temuan** di 341 entri.

**Belum disentuh (menunggu keputusan Bos)**: tautan luar yang TERLIHAT di artikel "top 7 agensi" —
misalnya menyebut agensi lain sebagai pembanding. Itu bagian dari isi artikel, jadi tidak saya hapus.

### Bos: "setelah tanggal 26 tidak usah buat artikel baru dulu sementara" (14 Okt)

Diperiksa: **tidak ada job cron yang membuat artikel StudioSoft baru** — yang ada hanya penjadwal sosial
(`daily-image-posting-all`, `threads-all-harian`, `fb-studiosoft-harian`, `ss-ig-carousel-feed`,
`studiosoft-healthcare-carousel-harian`). Jadi antrean SS yang berisi 12 artikel (15–26 Okt) akan habis
sendiri tanpa ada yang menambah. Tidak ada yang perlu dimatikan.
Catatan: antrean SS 20–26 Okt (#9315, #9319, #9322, #9332, #9335, #9393, #9402) **belum punya gambar
unggulan**. Job artikel yang masih aktif hanya **TSC** (`tsc-artikel-harian`, 1 artikel/hari; antrean TSC
sampai 20 Okt) — menunggu keputusan Bos apakah ikut dihentikan.

### Bersih-bersih klien yang sudah berhenti (perintah Bos 14 Okt: "stop handle itu")

- **Cron**: dicek seluruh `jobs.json` — **tidak ada satu pun job yang menyentuh klien berhenti**
  (SOTO_*, LEIT_*, Nucleasoft, Ekaduta, Metamorf, Pamekasan, OBP). Tidak ada yang perlu dimatikan.
- **Repliz**: inventaris jadwal menunggu (`repliz_pending.py`) hanya berisi akun klien aktif
  (DAS, EveryBe, StudioSoft, TSC, TSLaw, Yasmanatura, Uky). **Nol jadwal** untuk klien berhenti.
  Akun LEIT_* dan SOTO_* masih ada di daftar akun tapi kosong.
- **Diperbaiki**: `workspace/scripts/wp_rocket_rebuild_all.sh` — daftar domain masih memuat
  `otomasibisnispintar.com` dan `apotekpamekasan.com` (dua klien PUTUS) → keduanya dihapus.
- Catatan: daftar itu belum memuat `dasindonesia.com` (DAS, klien aktif) — perlu ditanyakan ke Bos.

### StudioSoft — kanonik «jasa seo surabaya» (Bos: "gimana kok CTR kecil" → "gas")

**Sebab CTR kecil**: 78% tayangan berasal dari posisi 21 ke atas (CTR ~0). Di posisi 1–10 CTR 2,3% (sehat).
Tidak ada halaman halaman-pertama yang nol klik. Jadi bukan masalah judul, tapi jangkauan posisi atas.

**Sebab kedua (ditemukan)**: **8 halaman SS saling berebut «jasa seo surabaya»** (total ±1.300 tayangan,
posisi 20–88) — kanibalisasi. Halaman yang paling sering muncul justru listicle "7 jasa SEO terbaik"
yang merekomendasikan agensi lain.

**Selesai**: halaman kanonik **`/jasa-seo-surabaya/` (#9970)** terbit — 1.019 kata, 11 H2, FAQ 5 +
FAQPage, tombol WA, gambar 1000x567 WebP (#9972), meta fokus "jasa seo surabaya".
Lalu `ss_tautkan_jasa_seo.py --go` → **8 halaman lama ditautkan ke kanonik** (terverifikasi 8/8);
cadangan `ss_backup_tautan_kanonik.json`.
Skrip: `ss_bedah_ctr.py` (bedah CTR per posisi), `ss_target_180.py` (hitung target GSC 180 klik),
`ss_bedah_kueri_uang.py` (kita vs pesaing), `ss_halaman_jasa_seo_surabaya.py`.
**Berikutnya (belum)**: minta Bos indeks ulang `/jasa-seo-surabaya/` di GSC; opsional ubah judul
3-4 listicle agar niatnya "rekomendasi" dan tidak menabrak kanonik.


## The Skin Code — logo resmi dari Bos + render ulang preview feed (14 Okt 2026, 07:2x UTC / 14:2x WIB)
- Bos kirim logo resmi lewat Telegram: `tsc_aset/logo_dari_bos_20261014.jpg` (200x200, JPEG, latar putih). Isi logo di dalamnya hanya 154x89 px (bbox x22..176, y57..146) -> kecil, tapi tagline-nya yang BENAR: «dermatology · venereology · aesthetic» (logo lama hasil crop desain tayang masih salah tulis «esthetic»).
- Aset baru dibangun lewat `tsc_logo_baru.py`: crop isi -> perbesar 6x (LANCZOS + UnsharpMask) -> alpha dari kecerahan -> dua versi transparan `tsc_aset/logo_bos_navy.png` dan `logo_bos_putih.png` (900x520, warna navy asli dicuplik dari piksel tergelap). Pratinjau: `tsc_aset/logo_bos_pratinjau_{terang,gelap}.png`.
- `tsc_feed_lib.logo()` sekarang memakai aset itu (fallback ke crop lama kalau aset tidak ada); `_kepala()` menghitung posisi kicker dari tinggi logo supaya tidak tumpang tindih.
- `tsc_ads_sample/buat_feed_foto.py`: logo rekaan tipografis diganti tempelan logo resmi; kontras kartu terang diperbaiki (teks lebih gelap + garis luar putih, keluhan pakai Montserrat regular bukan Light). `buat_kreatif.teks_track()` dapat parameter `stroke`/`stroke_fill` (default tidak berubah).
- `tsc_mock_grid_feed.py`: judul mock grid otomatis mengecil supaya tidak terpotong.
- Render ulang 10 slide (`tsc_feed_bjc_render.py` -> /tmp/tsc_feed_bjc) + grid + contact sheet -> `tsc_feed_preview/` (10 slide, `grid_feed.jpg`, `contact.jpg`) dan dua kartu foto di `tsc_ads_sample/feed_foto_*.jpg`. Semua pakai logo baru, 0 CJK.
- Catatan buat Bos: kalau ada file logo versi besar (PNG transparan / SVG / AI), kirim supaya tidak perlu diperbesar dari 154 px.
- Status jadwal: feed IG TSC tetap 0 jadwal ke depan (terakhir tayang 10 Okt 17:00) — belum dijadwalkan, menunggu keputusan Bos soal format + jam.

### QC teks terpotong + ukuran feed (14 Okt 2026, 07:4x UTC)
- Bos minta: "pastikan tidak ada text yang terpotong, ukuran feed terbaik".
- Alat baru `tsc_cek_meluber.py`: mencatat SEMUA panggilan `ImageDraw.text` dan `Image.save`, memetakan teks ke berkas gambar, lalu memeriksa (a) teks keluar kanvas atau masuk zona margin aman 40 px, (b) teks bertumpuk (irisan > 35% bbox lebih kecil). Teks yang digambar per karakter (`teks_track`) digabung jadi bbox per baris dulu supaya kerning tidak dianggap tumpang tindih.
- Hasil: 12 berkas (10 slide carousel + 2 kartu foto) = 0 temuan. Uji negatif dengan gambar cacat buatan (teks di x=5 dan dua baris bertumpuk) terbukti terdeteksi, jadi alat QC-nya sah.
- Ukuran semua berkas: 1080x1350 px (rasio 4:5) — rasio feed IG tertinggi yang masih tampil utuh di grid. Seragam untuk carousel & kartu foto.

### TSC: 9 cover carousel 3 slide + rencana feed (14 Okt 2026, 08:0x UTC)
- Arahan Bos: carousel TSC cukup 3 slide (bukan 10), minta 9 cover dengan latar berselang-seling sebagai mockup feed, plus perencanaan.
- Alat baru `tsc_feed_cover9.py` -> `tsc_cover9/tsc_cover_01..09.jpg` (1080x1350) + `tsc_cover9/grid_3x3.jpg` (mockup feed 3 kolom). Corak latar diputar dengan pola diagonal (baris+kolom) % 3 dari tiga corak: terang #F7F8FA, biru muda #DCE8F8, gelap gradasi #2F3A4E->#1B2436 (warna diambil dari desain tayang TSC sendiri).
- 9 topik: bekas jerawat cekung, jerawat hormonal, kulit sensitif, tahi lalat, kutil kulit, hapus tato, perawatan luka, kulit berminyak, gatal berkepanjangan. Semuanya ada di artikel/bank topik TSC (tidak mengarang klaim).
- QC `tsc_cek_meluber.py` atas 9 cover: 0 teks terpotong.
- Rencana yang diajukan: 1 carousel = 3 slide (cover / isi / penutup+ajakan WA), 1 post per hari, mulai 15 Okt, jam menunggu keputusan Bos (TSC sebelumnya tayang 17:00 WIB).

### TSC carousel 3 slide PADAT + wajah di cover (14 Okt 2026, 08:4x UTC)
- Arahan Bos: isi tiap halaman terlalu tipis, minta dipadatkan seperti 10 slide lama tapi jadi 3 slide; pasang wajah Asia (pria/wanita sesuai tema) di cover; pelajari referensi IG `instagram.com/p/DeJhPcniUEZ/`.
- Rujukan IG berhasil dibaca tanpa login lewat oEmbed: `curl "https://www.instagram.com/api/v1/oembed/?url=<url post>"` mengembalikan caption lengkap, dan `og:image` di HTML post memberi gambarnya. Gaya post TSC di IG: foto close-up wajah Asia bertone dingin, tulisan script emas + kapital putih, caption bertanya ke pembaca ("Rata-rata kamu tidur berapa jam semalam?"), lalu WA 0851-1744-4417 dan hashtag huruf kecil.
- Alat baru: `tsc_car3_render.py` (3 slide: cover berfoto + isi padat + tindakan/CTA) + data isi per topik di `bekas_jerawat_cekung.py`. Auto-skalasi font supaya isi padat tetap muat; slide ber-CTA menyisakan ruang tombol (batas H-330).
- Foto: wajah Asia diambil dari stok yang sudah ada (tsc_ads_sample/pex_*) dan tambahan pria Asia di `tsc_foto_baru/pria_*.jpg` (unduh via URL Pexels langsung, API tetap mati). Duotone senada latar + fade kiri/atas supaya tepi foto tidak terlihat seperti kotak.
- QC `tsc_cek_meluber.py` ditambah dua pemeriksaan: (a) teks vs teks (sudah ada), (b) teks yang tertutup tombol/pil CTA (area pil dicatat lewat patch `tsc_feed_lib._pil_cta`). Hasil 3 slide: 0 temuan.
- Preview dikirim ke Bos: `tsc_car3/bekas-jerawat-cekung/sheet_3slide.jpg`.

### TSC carousel 3 slide TERPASANG (14 Okt 2026, 09:3x UTC / 16:3x WIB)
- Perintah Bos: pasang carousel ke IG dan semua sosmed TSC, tiap hari jam 17:00.
- Akun TSC di Repliz (semua connected): IG `6a86a7e062caae1e04ff8244`, Threads `6a4bbc5920e4f4f195e52960`, FB The Skin Code Clinic `6a3b41ddc5ff4ce3a327542c`, LinkedIn `6a4da7f520e4f4f195e796e1`, plus satu FB lain bernama "Surabaya Skin Centre" `6a3b41e6c5ff4ce3a3275462` (belum dipakai, menunggu konfirmasi Bos).
- Alat baru `pasang_car3_tsc.py <topik> <tanggal> [--run]`: salin slide ke openclaw-img, cek HTTP 200, buat jadwal di 4 kanal sekaligus, idempoten (kalau media sama sudah punya jadwal → dilewati), jam tetap 17:00 WIB (10:00Z).
- Topik 1 (bekas jerawat cekung) terjadwal 15 Okt 2026 17:00 WIB: IG `6acf4b1176bea2decc4288cb`, Threads `6acf4b1a3b7404ace343e8a9`, FB `6acf4b2476bea2decc428dc4` (semua album 3 media, pending), LinkedIn `6acf4b2e76bea2decc42904a` (image tunggal slide 1 — carousel LinkedIn butuh dokumen PDF, tidak didukung lewat Repliz).
- Media: `tsc_car3_bjc_01..03.jpg` di openclaw-img, HTTP 200 di kedua ingress.
- Caption per kanal: IG/FB 853 char, Threads 461 char (batas 500), LinkedIn 636 char bernada lebih resmi. Semua diverifikasi 0 CJK dan dibaca balik dari API (status pending, scheduleAt 15 Okt 10:00Z).

### TSC carousel ke-2: jerawat hormonal, cover PUTIH (14 Okt 2026, 10:0x UTC)
- Arahan Bos: carousel berikutnya pakai cover berwarna putih, preview dulu.
- Data topik baru `jerawat_hormonal.py` (kode `jrh`), isi dipadatkan dari artikel TSC `tsc_artikel_jerawat_hormonal_perempuan_dewasa.py`. Cover corak `terang` (latar #F7F8FA, teks navy, foto duotone terang), foto `tsc_ads_sample/pex_09_10209466.jpg` (perempuan Asia dewasa, di-crop 1400x2099 -> 1400x1758, tanpa digepengkan).
- `tsc_car3_render.py` sekarang menerima nama modul topik sebagai argumen (`python3 tsc_car3_render.py jerawat_hormonal`), tidak lagi hard-code ke topik pertama.
- Slide 3 sempat meluber 3 kali (1204 -> 1090 -> 1062 px dari batas 1020); diselesaikan dengan memadatkan poin: 9 poin jadi 7 poin, catatan dipendekkan, daftar skala auto-shrink ditambah sampai 0.64.
- QC `tsc_cek_meluber.py`: 3 slide, 0 temuan (tepi, tumpang tindih teks, tabrakan tombol).

### TSC: arahan LinkedIn + topik 2 terpasang (14 Okt 2026, 10:2x UTC)
- Arahan Bos: (1) LinkedIn cukup slide 1 asalkan captionnya menjelaskan isi penuh, (2) TSC = The Skin Code, BUKAN "Surabaya Skin Centre" -> akun FB `6a3b41e6c5ff4ce3a3275462` tidak dipakai.
- Caption LinkedIn topik 1 diperbarui lewat `update_schedule` (PUT payload utuh): 636 -> 1.298 char, kini memuat sebab, tiga jenis cekungan, perawatan rumah, dan tindakan klinik. Hasil dibaca balik: sama persis, status tetap pending.
- Caption LinkedIn topik 2: 2.264 char (penyebab, ciri pembeda, pemeriksaan, penanganan, perawatan harian, timeline 4-8 pekan).
- Caption Threads topik 2 sempat 560 char (batas 500) -> dipadatkan jadi 440 char.
- Carousel ke-2 (jerawat hormonal, cover PUTIH) terjadwal 16 Okt 2026 17:00 WIB: IG `6acf4c1e3b7404ace34439b1`, Threads `6acf4c2876bea2decc42d59f`, FB `6acf4c323b7404ace3444144` (album 3 media), LinkedIn `6acf4c3d76bea2decc42db11` (image slide 1, caption 2.264 char). Semua pending, media `tsc_car3_jrh_01..03.jpg` HTTP 200.
- Urutan seri: 15 Okt bekas jerawat cekung (cover gelap), 16 Okt jerawat hormonal (cover putih). Berikutnya 17 Okt kulit sensitif.

### TSC carousel: jarak antar elemen disamakan (14 Okt 2026, 10:5x UTC)
- Bos menandai jarak judul bagian ke poin pertama terlalu mepet ("tolong space atau jarak buat lebih rapi atau samakan semua").
- `tsc_car3_render.py` kini memakai konstanta jarak, bukan angka yang ditebak per jenis blok: judul->garis 20/36, lead bawah 22, sebelum sub 28, sub bawah 15, tubuh bawah 18, antar poin 13, catatan atas 10 / bawah 16. Semua jarak dikalikan skala (int(N * s)) supaya tetap proporsional saat konten padat dan font auto-mengecil.
- Karena jarak lebih lega, 4 slide sempat meluber (1.207 px vs batas 1.170); setelah jarak ikut berskala semuanya muat kembali, tanpa mengurangi isi. Daftar skala auto-shrink ditambah sampai 0.60.
- QC 6 slide (2 topik x 3): 0 temuan. Media `tsc_car3_{bjc,jrh}_0*.jpg` di openclaw-img disalin ulang (md5 cocok, HTTP 200) -> jadwal 15 & 16 Okt otomatis memakai versi baru karena Repliz mengunduh berkas saat tayang.

### TSC LinkedIn: ajakan "1/3 GESER" dihilangkan dari cover (14 Okt 2026, 11:0x UTC)
- Bos minta ornamen `1/3 · GESER` dihilangkan untuk LinkedIn (kanal itu cuma satu gambar, tidak ada geser).
- `cover(data, pakai_tag=False)` di `tsc_car3_render.py` menghasilkan berkas tambahan `slide_1_linkedin.jpg` per topik. `pasang_car3_tsc.py` kini memakai berkas itu untuk akun LinkedIn, dan menyegarkan media pada jadwal LinkedIn yang sudah ada (update_schedule medias) tanpa membuat jadwal baru.
- Hasil: LinkedIn 15 Okt -> `tsc_car3_bjc_linkedin.jpg`, LinkedIn 16 Okt -> `tsc_car3_jrh_linkedin.jpg`; caption kedua jadwal tetap utuh (1.298 dan 2.264 char), status pending.

### TSC carousel: centang disejajarkan tengah dengan kalimatnya (14 Okt 2026, 11:2x UTC)
- Bos minta tanda centang (list) berada tepat di tengah satu garis dengan kalimatnya.
- `tsc_car3_render.py`: pusat centang = y + tinggi_p/2 + 5, dengan tinggi_p = jumlah baris * (font + 8) - 8 (jarak baris terakhir tidak dihitung). Sebelumnya memakai angka tetap -6 sehingga pada kalimat dua baris centang naik ~6 px.
- Alat ukur baru `tsc_cek_centang.py`: mendeteksi piksel biru centang per baris lalu membandingkan titik tengahnya dengan titik tengah piksel teks gelap di kisaran baris yang sama. Hasil sesudah perbaikan: selisih 0 sampai 2,5 px (dari kanvas 1.350 px). Sebelumnya 6-8 px pada kalimat dua baris.
- Semua media di openclaw-img disalin ulang (8 berkas: 6 slide + 2 cover LinkedIn) dan dicek HTTP 200; QC 8 berkas: 0 temuan.

### TSC cover: warna wajah dibuat natural (14 Okt 2026, 11:4x UTC)
- Bos minta wajah di cover memakai warna natural, bukan tone biru.
- `pasang_foto(..., natural=True)` di `tsc_car3_render.py`: foto dipakai apa adanya (hanya kontras 1,03 dan kecerahan 1,01), tanpa duotone. Duotone masih tersedia lewat `foto_natural=False` di data topik kalau suatu saat dibutuhkan. Default sekarang natural.
- 8 media di openclaw-img disalin ulang dan dicek 200; QC 8 berkas: 0 temuan.

### TSC carousel ke-3: kulit sensitif, cover biru muda (14 Okt 2026, 12:0x UTC)
- Data topik `kulit_sensitif.py` (kode `ksn`), isi dari artikel TSC sendiri; cover corak `biru` (#DCE8F8) melanjutkan pola selang-seling gelap (15 Okt) -> putih (16 Okt) -> biru (17 Okt). Foto `tsc_ads_sample/pex_06_19999456.jpg`, warna natural, crop 1400x1750 -> 1394x1750.
- Caption: IG/FB 1.289 char, Threads 460 char (mulai 530, dipangkas dua kali), LinkedIn 2.301 char (penuh, termasuk pembeda alergi vs sensitif).
- Slide 3 sempat meluber tipis (1.026 vs batas 1.020) -> tiga kalimat dipendekkan, lalu muat.
- Terpasang 17 Okt 2026 17:00 WIB: IG `6acf4e2976bea2decc435e0d`, Threads `6acf4e353b7404ace344eaca`, FB `6acf4e3f76bea2decc436540` (album 3 media), LinkedIn `6acf4e4876bea2decc4368fd` (cover tanpa tag geser). Semua pending, media HTTP 200, QC 4 berkas: 0 temuan.

### TSC: seri carousel sampai 31 Okt, topik berbasis data (14 Okt 2026, 12:5x UTC)
- Perintah Bos: tayang tiap hari 17:00 WIB sampai akhir Oktober, topik harus yang benar-benar dibutuhkan warga Sidoarjo, pelajari GSC/GA4/Ahrefs/GBP.
- Data yang dipakai: GSC 90 hari (200 kueri, 2.404 tayangan nyata) + GA4 properti TSC `properties/490140645` (298 sesi, 186 pengguna, 113 sesi organic, 36 organic social). Kueri teratas: dokter kulit sidoarjo 438 tayang, dokter kulit terdekat 281, dokter kulit krian 277, klinik kecantikan krian 91, dokter spesialis kulit sidoarjo 72. Simpan di `drafts/tsc_permintaan_20261014.md` (skrip `tsc_data_permintaan.py`).
- Kendala: Ahrefs API balas HTTP 401 (langganan API tidak aktif, token 40 char tersimpan) dan GBP API belum diaktifkan di project SA (403, "has not been used in project"). Jadi angka permintaan memakai tayangan GSC nyata, bukan perkiraan alat pihak ketiga.
- Catatan penting: GA4 akun "Surabaya Skin Center" (`properties/513751849`) BUKAN TSC; jangan tertukar saat menarik data.
- Generator otomatis: `tsc_gen_topik.py` menarik artikel TSC lewat WP REST (`/wp-json/wp/v2/posts/<id>`, curl -4, tanpa `_fields`), memecah H2 + daftar, dan hanya memakai kalimat UTUH (tidak memotong di tengah kalimat) -> menghasilkan modul `tsc_topik18..31.py`. Foto wajah Asia natural dari `tsc_foto_batch/` + `tsc_foto_baru/`, di-crop tanpa digepengkan.
- 14 topik baru (18-31 Okt): dokter kulit buka sekarang, biaya dokter kulit, facial Sidoarjo, memilih klinik kecantikan, hapus tahi lalat, kutil kulit, bekas jerawat di Krian, 4 grade jerawat, kulit berminyak, gatal dan iritasi, merawat luka, kulit anak, flek hitam, kulit bercahaya.
- QC massal `tsc_qc_massal.py` (56 berkas): 0 temuan.
- Terpasang: 17 hari x 4 kanal = 68 jadwal jam 17:00 WIB (15-31 Okt), semua status pending, media `tsc_car3_<kode>_0*.jpg` HTTP 200. Caption Threads dua topik (25, 30) dan satu (19) sempat >500 char -> dipangkas dengan `tsc_pangkas_threads.py` lalu dipasang ulang.

### TSC: pelajari profil klinik + dr. Avril, terapkan ke caption (14 Okt 2026, 13:2x UTC)
- Bos mengirim PDF "TSC_Evaluasi_Menyeluruh_Okt2026.pdf" (dari Suwarno Bot) dan meminta mempelajari The Skin Code Clinic + dr. Avril selengkapnya.
- Ringkasan PDF: pendapatan 9 bulan Rp 825,5 jt (rata-rata 91,7 jt/bulan, 62% dari penjualan obat); sumber pasien TikTok 70 (naik 14%), spanduk 66, keluarga 59, teman 50, Instagram 45 TURUN 83% (6 pasien Januari jadi 1 pasien September), Facebook 2, brosur 0; situs 107 klik / 6.234 tayangan / CTR 1,72% / posisi 6,9 (Local Pack menelan klik); Cloudflare 81% page view bot; saran: pulihkan IG 3-4x per minggu dengan konten edukasi, TikTok 4-5 video per minggu, rapikan GBP (target 500 tayangan/minggu, balas ulasan, 10 Q&A), pasang tombol WA dan tautan telepon, ganti nama DNI Clinic di Maps, cek domain lama klinikdnisidoarjo.com untuk redirect.
- Riset profil disimpan di `drafts/tsc_profil_dan_dr_avril.md`: dr. Avril Novianto Sp.DVE (Sp.KK) memimpin semua perawatan; klinik kulit dan kelamin SEKALIGUS klinik estetika; buka tiap hari 09.00-19.00; Jl. Kyai Mojo blok a1 No.5 Jerukgamping Krian; WA 0851-1744-4417; dulu DNI Clinic Krian; layanan kulit/kelamin (jerawat, flek, eksim, infeksi, kutil termasuk HPV, PMS, kulit anak, varises, biopsi) plus estetika (facial medis, peeling, laser, microneedling, botox dan filler, PRP, body contouring).
- Tindakan: `tsc_perbarui_caption.py --run` menyisipkan identitas "edukasi kulit dan estetika dari dokter spesialis DVE, buka setiap hari 09.00-19.00" ke caption IG/FB/LinkedIn (Threads versi pendek "dokter Sp.DVE"), lalu memperbarui 68 jadwal 15-31 Okt lewat update_schedule. Diverifikasi baca balik: kalimat identitas tersimpan, status tetap pending.
- Catatan penting untuk Bos: akun TikTok TSC belum terhubung di Repliz (yang ada hanya IG, Threads, FB, LinkedIn), padahal TikTok justru sumber pasien terbanyak menurut PDF.
