# Catatan 21 September 2026 (Senin)

## ⏰ Cron `threads-all-harian` (jadwal 04:00 WIB) molor 12 jam

Job id `16e1f3f8170d` (cron `0 21 * * *` UTC) **tidak jalan** pada 21 Sep 04:00 WIB — sisa
bukti: `/tmp/` kosong (hasil scan 20 Sep hilang) dan `catatan/2026-09-21.md` belum ada.
Run ini dieksekusi manual pukul **16:45 WIB**, jadi slot 05/08/11/14 WIB sudah lewat.

Perbaikan yang dipilih: isi slot yang **masih bisa** (17/20/23) dan **JANGAN** menggeser
akun yang queue-nya penuh — sesuai aturan Bos ("slot penuh = stop, jangan paksa/geser";
"maksimal 1 konten per hari per akun").

## ✅ Hasil akhir Threads hari ini (diverifikasi dari API, semua status)

- ⚖️ **Tslaw 17:00 WIB** (id `6ab1005202078a414ac9d9cc`, 490 char) → status **success (tayang)**
  → <https://www.tslaw.id/panduan-praktis-perlindungan-data-pribadi-untuk-umkm-langkah-mudah-dan-murah/>
- 🏥 **TSC 20:00 WIB** (id `6ab1005702078a414ac9db15`, 488 char) → `pending`, text-only, replies=0
  → <https://www.theskincodeclinic.com/kesalahan-pakai-sunscreen-3/>
- 🔧 **DAS 23:00 WIB** (id `6ab1005d02078a414ac9dc93`, 466 char) → `pending`, text-only, replies=0
  → <https://dasindonesia.com/7-penyebab-mobil-brebet-tersendat-dan-solusi-perbaikannya/>
- 🏪 **StudioSoft** & 👤 **@ukyhandoko** → **tidak dijadwalkan** (bukan `no_free_slot` karena slot
  kosong, tetapi karena **sudah punya 7 jadwal hari ini** dari pipeline lain: 5 `success`
  (05/08/11/14/17) + 2 `pending` (20/23) per akun). Draft backlog tetap disimpan
  (`threads_backlog_ss_uky.json`) dan link-nya masih FREE.

Anti-redundant: scan penuh **2.817 jadwal** Repliz (semua status) via
`scripts/scan_threads_used_links_v2.py` → `/tmp/threads_used_all.json`; URL terpakai
SS 166 · uky 136 · tslaw 33 · tsc 21 · das 46 (angka lebih kecil dari 20 Sep karena
`/tmp` sempat terhapus; ini hasil hitung ulang dari API). Kandidat dipilih hanya yang
BEBAS lintas-akun + HTTP 200 dari host ini.

## 🔥 INSIDEN & PERBAIKAN: scheduler lama bikin dobel post (SS & uky)

**Kejadian:** run pertama menjadwalkan 5 akun. StudioSoft & uky **lolos** ke slot 17:00 —
padahal kedua akun sudah penuh hari ini. Dua jadwal duplikat sudah **DIHAPUS**:
`6ab100463032e3a79cef3663` (SS) dan `6ab1004b02078a414ac9d854` (uky) → `{'success': True}`.

**Akar masalah (dua bug di `schedule_all_threads.py`):**
1. `fetch_all_pending()` hanya mengambil status `pending|draft` **dan** `break` pada exception
   pertama. API Repliz sedang flaky (HTTP 500 / SSL EOF / connection reset) → daftar jadwal
   terpotong → jam yang **sudah tayang** dianggap kosong.
2. Kunci slot dibandingkan lewat prefix UTC (`scheduleAt[:13]`), bukan jam **WIB** — jam 05:00
   WIB tersimpan sebagai `22:00Z` hari sebelumnya, jadi pencocokan jam meleset.

**Perbaikan permanen (sudah di-patch di `schedule_all_threads.py`):**
- `fetch_all_schedules()` baru: **retry 15×** per halaman dengan backoff, **tidak** `break`
  diam-diam saat error, dan memakai **SEMUA status** (sukses/error/pending), bukan hanya pending.
- Pencocokan slot memakai `wib_key()` → `(tanggal WIB, jam WIB)`.
- **Guard baru (aturan Bos):** kalau akun **sudah punya ≥1 jadwal pada tanggal target**
  (status apa pun) → `already_scheduled_today` → SKIP, tidak digeser. Ini yang mencegah
  dobel post 1-hari-1-akun.
- Verifikasi akhir mencari jadwal lewat `_id` (+ fallback jam WIB) dan melaporkan `status`.

**Uji ulang (bukti fix bekerja):** menjalankan ulang scheduler dengan file konten yang sama →
`0 sukses | 5 skip`, kelima akun ditolak dengan alasan "sudah ada N jadwal pada 2026-09-21".
Saat scan halaman 18 sempat HTTP 500 dan **berhasil pulih lewat retry** (bukti bug #1 tertutup).

## ⚠️ Temuan lain (bukan dari run ini) — perlu perhatian Bos

- **TSC 09:00 WIB hari ini status `error`** (id `6aace2eafc107e4fe5f0b2df`) — caption
  "Bekas jerawat susah hilang kalau ditangani asal-asalan…". Dibuat pipeline lain, bukan dibatalkan
  oleh run ini. Kandidat untuk dijadwalkan ulang besok (1 post/hari).
- **@ukyhandoko 08:00 WIB status `error`** (id `6aa04db8b8a1cb3e14dcc2b2`).
- **SS & uky queue Threads penuh jauh ke depan**: SS **80 pending** (slot bebas pertama
  **30 Sep 08:00 WIB**), uky **88 pending** (bebas pertama **3 Okt 05:00 WIB**). Draft backlog
  SS (`digital-marketing-surabaya-strategi-jitu-bisnis-naik-kelas`) & uky
  (`creative-agency-surabaya-solusi-kreatif-brand-berbeda`) masih BEBAS — siap dipakai begitu
  slotnya terbuka.
- Stok artikel healthcare StudioSoft masih seperti catatan 20 Sep (belum ada artikel baru).

## File yang dibuat/diperbarui run ini

`scripts/scan_threads_used_links_v2.py` (baru, tahan API flaky) ·
`scripts/kandidat_free_threads.py` (baru) · `scripts/cek_jadwal_tanggal.py` (baru) ·
`gen_threads_20260921.py` (baru) · `threads_content_today.json` (5 akun) ·
`schedule_all_threads.py` (**dipatch**: `fetch_all_schedules` + `wib_key` + guard 1-post/hari +
verifikasi per-`_id`) · `log_threads_harian.json` (last_date `2026-09-21`; used_links = tslaw/tsc/das;
koreksi dobel SS/uky) · `catatan/2026-09-21.md` (file ini) · skill
`references/threads-quality-audit.md`.

---

## 🔁 REKONSTRUKSI — bagian dari cron `daily-image-posting-all` (563618b0f31b, run 10:03 UTC)

> ⚠️ **Insiden berkas:** cron Threads (job `16e1f3f8170d`, run 16:45 WIB) menulis file ini dengan
> `write_file` dan **menimpa** bagian di bawah (pitfall lama: `catatan/YYYY-MM-DD.md` dipakai bersama
> beberapa cron → WAJIB `read_file` dulu). Isi asli tidak tersimpan di git/backup, jadi bagian ini
> **direkonstruksi dari laporan resmi job** (`cron/output/563618b0f31b/2026-09-21_10-03-46.md`)
> + `references/repliz-tls-openssl-transport.md`. Isi teknis di bawah valid; formatnya ringkas.

### Hasil job daily-image-posting-all 21 Sep 2026

- ✅ **Item 50 tayang: Threads @ukyhandoko** — gambar `20_orange_klien_pergi.png` (slide 6/6 seri
  `uky_threads_images`, "Klien Berhenti Karena Mereka Gak Merasa Dihargai", bg orange, rata kiri,
  footer dmark.id, sesuai standar desain 16 Sep). Jadwal **11 Okt 2026 08:00 WIB**,
  id `6ab0fe943032e3a79ceeae30`; read-back API: `status=pending`, `type=image`, akun Uky
  (`6a334e…5a48`), 1 gambar terpasang, caption 452 char, `replies=0`. Media
  `mantapserver…/openclaw-img/20_orange_klien_pergi.jpg` HTTP 200 di kedua ingress.
  Caption ≤500 char, gaya "saya", 0 hashtag, 0 mention internal, ditutup pancingan diskusi.
  FB & LinkedIn StudioSoft dilewati (item brand ukyhandoko → Threads saja). State index **50 → 51**.

### 🚨 Insiden TLS: api.repliz.com diblok DPI (21 Sep 2026)

- Gejala: `SSL: UNEXPECTED_EOF_WHILE_READING`; `curl` **0/6** (exit 35), urllib/ssl & node fetch gagal;
  hanya `openssl s_client` (ClientHello CLI) yang lolos. DNS/TCP/sertifikat normal → pemblokiran
  berbasis TLS fingerprint, bukan masalah kredensial/saldo.
- Job lain ikut tumbang: `threads-growth-autoreply`, `sumu-linkedin-2hari`, `soto-threads-scheduler`,
  `tslaw-video-materai-check`. (Cron Threads harian `threads-all-harian` juga terdampak — lihat bagian
  atas catatan ini: API balas 500/SSL EOF berulang.)
- Perbaikan 3 lapis (sudah aktif & teruji): (1) `workspace/repliz_openssl_transport.py` (HTTP/1.1 mentah
  via `openssl s_client`, retry 6×), (2) `workspace/repliz_client.py` fallback otomatis, (3)
  `sitecustomize.py` di user-site + venv (intercept `urlopen` khusus host `api.repliz.com`).
  Bukti sembuh: `threads-growth-autoreply` 10:00 UTC sukses kirim 1 balasan.
- ⛔ **Kesalahan job itu (butuh tindakan manual Bos):** POST uji `{"text":"tes transport"}` ke
  `/public/comment/6aafc7a6…` dibalas **201** → balasan itu **TAYANG PUBLIK** di Threads @ukyhandoko
  (post "8 Tools Gratis Jasa SEO Surabaya…", reply id `18145356487564781`). Balasan sah cron juga
  terkirim untuk komentar yang sama → **ada 2 balasan; hapus yang "tes transport" dari app Threads**
  (Repliz tidak punya endpoint hapus balasan). Tracker sudah diisi `doc_id` agar tidak balas dobel.
  Aturan baru: **uji transport pakai GET saja**.

---

## 🚨 Insiden 20–21 Sep: HOST OFF ≈33 jam → 23 jadwal error lintas akun

Diminta Bos cek IG LEIT (21 Sep 17:15 WIB). Hasil audit API + journal:

- **LEIT IG (`6a7d765862caae1e04f7ded3`): 55 jadwal** — 38 `success`, 3 `error`, 14 `pending`.
  Seri design tayang penuh LEIT 42→61 (1 Sep–19 Sep), plus video EduXpo9.
  - ❌ **LEIT 63** (21 Sep 10:00 WIB, id `6a81e1e216c9335a365e4131`, `/openclaw-img/leit_ig_63-1.jpg`) → `error`.
  - ❌ **LEIT 62** (20 Sep 10:00 WIB, id `6a81e1dbc93a8f645a5bfd71`, `leit_ig_62-1.jpg`) → `error`.
  - ✅ LEIT 64–77 masih `pending` (22 Sep–5 Okt, 10:00 WIB), file semua 200.
- **Akar masalah = uptime host, BUKAN URL:** `journalctl --list-boots` + gap journal →
  mesin OFF dari **20 Sep 00:56 UTC** sampai **21 Sep 09:40 UTC** (±33 jam). Bukti pendukung:
  `/proc/uptime` 36 menit, `systemctl --user status atun-media-server` running sejak 09:43 UTC,
  dan `leit_ig_62-1.jpg`/`63-1.jpg` sekarang **HTTP 200** (JPEG 1080×1350 valid) setelah server hidup.
- **Dampak luas:** 23 jadwal `error` sejak 19 Sep di 12 akun (LEIT IG/TikTok, SS, Kreasi SS, TSC
  Threads+IG+FB, TS Law, uky Threads+IG, Dojo Ksatria) — pola seragam: `The media could not be fetched
  from this URI`, `getaddrinfo ENOTFOUND mantapserver…`, `Connection timeout (30s)`, `socket hang up`.
- Status infrastruktur pasca-cek: media server **up** (pid 1062), funnel **on** → `/` proxy 127.0.0.1:8123.
- Pelajaran masuk skill: `references/status-audit-per-akun.md` → pitfall "massal media-fetch error =
  cek `uptime`/`journalctl --list-boots` lebih dulu, jangan ganti URL".



---

## 🏥 Seri Healthcare StudioSoft — run hc42 (cron `studiosoft-healthcare-carousel-harian`)

Dijalankan manual 21 Sep (cron 02:00 WIB sempat tidak jalan karena host OFF 20–21 Sep).
Hasil: **3 platform terjadwal & terverifikasi lewat fetch ulang per-ID dari API.**

- **📱 Threads SS** — carousel 5 slide `ss_hc42_seoklinik_*` + 2 replies · slot **22 Sep 09:00 WIB**
  (`2026-09-22T02:00:00.000Z`) · album `6ab1062202078a414acbaa45` pending · replies `6ab106323032e3a79cf13dd0`, `6ab1063602078a414acbb0d3`
- **💼 LinkedIn SS** — TEXT 1.641 char (artikel iklan FB/IG RS) · slot **10 Okt 11:00 WIB**
  (`2026-10-10T04:00:00.000Z`) · `6ab104d202078a414acb4216` pending · medias=0 replies=0
- **🔵 Facebook SS** — TEXT 1.425 char, tanpa media, `replies=[]` · slot **21 Sep 19:30 WIB**
  (`2026-09-21T12:30:00.000Z`) · `6ab104dc3032e3a79cf0cc47` pending

- **Topik Threads = TOPIK BARU, bukan re-air:** audit 2.820 jadwal Repliz menunjukkan
  `panduan-seo-klinik-rumah-sakit` **0 jadwal** di Threads SS sepanjang sejarah akun
  (sisa kandidat healthcare lain sudah tayang semua). Slide dibuat ulang dari isi artikel
  (keyword intent kesehatan, local SEO, fondasi teknis) — standar Bos 16 Sep: engine
  `ss_carousel_lib.py`, bg `#122B63`, rata kiri, blok tengah vertikal, tanpa separator,
  bullet dot, judul 85 / body 36 / sub 30. Diverifikasi visual (2 slide dilihat langsung).
- **Stok artikel healthcare baru masih HABIS** — WP REST 21 Sep: artikel terbaru
  20 Sep `jasa-branding-surabaya-membangun-identitas-brand-kuat` (non-healthcare).
  → seri hc butuh artikel healthcare baru dari Bos, atau lanjut pola re-air (nama file slide WAJIB baru).
- **LinkedIn:** artikel `iklan-facebook-rumah-sakit` — status FREE di LinkedIn SS (tidak ada jadwal apa pun).
- **Facebook:** artikel `google-business-profile-klinik` — di FB SS hanya pernah `error` (29 Agu),
  jadi belum pernah tayang sebagai teks. `replies=[]` (aturan FB).

### ⚠️ Temuan teknis run ini (masuk pelajaran)

1. **Album Threads gagal create pertama kali** → `HTTP 500 {"message":"Cannot read properties of
   undefined (reading '0')"}` dari Repliz (server-side, bukan payload kita — LinkedIn & FB sukses di
   run yang sama). **Retry ke-2 sukses** → mitobat baru: `hc42_retry_threads.py` (retry album 4x,
   guard idempotensi, reply ikut dibuat setelah album hidup).
2. **Ingress funnel `103.84.155.217` sering lambat 21–30 s** (kadang timeout 30 s) sementara
   `103.84.155.153` ~1 s. Verifikasi media `timeout 60s + 4 percobaan`; JPEG dikecilkan ke
   quality 85 (94–111 KB) supaya fetch lebih cepat.
3. **hc41 (20 Sep 02:00Z) album Threads `ss_hc41_analytics_*` GAGAL lagi** — "The media could not be
   fetched from this URI" **padahal media 200 di kedua ingress sekarang**. Penyebab sebenarnya:
   **host OFF ~33 jam (20 Sep 00:56Z – 21 Sep 09:40Z)** — jadi bukan bug Repliz dan bukan salah nama
   file. Topik data-analytics masih belum pernah tayang dalam bentuk carousel → kandidat re-air
   berikutnya (nama file slide harus baru, mis. `ss_hc43_*`).
4. Pitfall verifikasi (sudah ada di skill): field `replies` di endpoint LIST balik sebagai dict
   per-karakter (`{'0':'6','1':'a',...,'status':'pending'}`) → **abaikan key non-numerik** saat
   join, kalau tidak reply dikira tidak menempel.

Referensi script: `studiosoft_hc42_carousel_gen.py` · `studiosoft_healthcare_cron_run_hc42.py` ·
`hc42_retry_threads.py` · `verify_hc42.py` · `hc42_analyze.py` · `hc42_check_fb.py`.


---

## 📣 TS Law — seri "Mitos atau Fakta" (11 poster dari Bos) — akhirnya 3 platform

Bos kirim `Hukum Mitos atau Fakta Poster.zip` (11 PNG 1080×1350) 21 Sep 10:41 UTC dengan perintah:
*"pasang untuk Instagram TS Law per 3 hari sekali tiap jam 11.00 WIB"* + *"pastikan caption sesuai dengan image.
hastag tidak ada huruf besar"*. Setelah dicek, Bos minta *"sekalian FB, Threads n lainnya"*.

**Media:** `openclaw-img/tslaw_mitos_fakta_01..11.jpg` (konversi dari PNG; 200 di KEDUA ingress funnel).

**Jadwal (tanggal sama, jam beda per platform — konvensi TS Law):**

- **IG 11:00 WIB** (04:00Z) — 11 jadwal, sudah dipasang lebih dulu; `6ab10ac83032e3a79cf2bee2` (01) … `6ab10b7902078a414acd4bba` (11)
- **Threads 09:00 WIB** (02:00Z) — 11 jadwal baru; `6ab10f3402078a414ace9109` (01) … `6ab10f3802078a414ace92df` (11)
- **FB 19:30 WIB** (12:30Z) — 11 jadwal baru; `6ab10f3402078a414ace9125` (01) … `6ab10f383032e3a79cf453bf` (11)

Tanggal: 22 Sep, 25, 28 Sep, 1/4/7/10/13/16/19/22 Okt 2026.

**Aturan yang dipatuhi & diverifikasi ulang dari API (22/22 pending):** caption Threads versi ringkas
447–493 char (batas 500), caption FB = sama dengan IG 729–840 char, semua hashtag huruf kecil, 0 mention,
`replies=[]` di FB dan Threads, media 200 di kedua ingress (153 dan .217). 1 post/hari/akun tetap aman:
jam 09:00 Threads di luar 7-slot pipeline harian (yang pakai 17:00), FB TS Law 0 jadwal lain.

**Script:** `tslaw_mitos_fakta_crosspost.py` (dry-run default, `--go` untuk create; idempoten lewat index
media per akun; verifikasi ulang per ID setelah create). Caption Threads disimpan di dict `THREADS_CAP`
(1 entri per poster, wajib memuat ajakan komentar).

**Catatan:** LinkedIn TS Law masih STOP sejak 10 Sep → belum dipasang, menunggu izin Bos.
Stok poster habis setelah 22 Okt 2026 — butuh aset baru dari Bos untuk lanjut.

---

## 🏥 TSC IG diaudit (diminta Bos 21 Sep 22:41 WIB) → re-air 20 Sep di 4 akun + carousel tahi lalat Threads

**Status IG `@theskincode_clinic` saat itu:** 46 jadwal → 35 `success`, 10 `pending`, **1 `error`**.

- ❌ **20 Sep 17:00 WIB** `tsc_ig_baru_1.jpg` (post #1 seri stock baru) → `error`, pesan Repliz
  `The media could not be fetched from this URI`. Media dicek ulang: **HTTP 200**, 180 KB, JPEG
  1080×1350, 0,05 s → file sehat, penyebabnya **host OFF 20–21 Sep**, bukan URL.
- ✅ 21 Sep 17:00 WIB (Design 17 nyusul) tayang normal + mirror Threads/LinkedIn/FB sukses.
- Ternyata **4 akun gagal serentak untuk post #1**: LinkedIn 20 Sep 08:00 (`socket TLs putus`),
  Threads 09:00 (media tak terambil), IG 17:00 (media tak terambil), FB 19:30 (`Missing or invalid
  image file`) — satu insiden, bukan empat masalah berbeda.
- Bonus temuan: carousel **tahi lalat Threads 16 Sep masih `error`** dan belum pernah re-air
  (versi IG-nya `success`) — ketinggalan sendiri, tidak kena insiden 20 Sep.

**Tindakan (Bos: "Ok lakukan itu gas") — dijadwalkan ulang tanggal 23 Sep, jam tetap per platform,
caption diambil apa adanya dari doc error (tanpa teks baru):**

- IG 23 Sep 17:00 (`2026-09-23T10:00:00.000Z`) → `6ab151473032e3a79c0fd3fc` · `tsc_ig_baru_1.jpg`
- Threads 23 Sep 09:00 (`02:00Z`) → `6ab1514802078a414ae62970` · `tsc_thr_baru_1.jpg` (384 char)
- FB 23 Sep 19:30 (`12:30Z`) → `6ab151493032e3a79c0fd4da` · `tsc_fb_baru_1.jpg` · `replies=[]`
- LinkedIn 23 Sep 08:00 (`01:00Z`) → `6ab1514a02078a414ae62a4a` · `tsc_li_baru_1.jpg` · `replies=[]`
- Threads **25 Sep 09:00** (`2026-09-25T02:00:00.000Z`) → `6ab1514b02078a414ae62aad` · album 3 slide
  `tsc_tahilalat_01..03.jpg` (479 char, slot bebas, tidak menabrak jadwal 22/24/26 Sep)

Semua diverifikasi ulang dari API: **5/5 `pending`**, `replies=0`, media menempel, URL 200 di funnel.
Doc `error` lama **tidak dihapus** (disimpan sebagai riwayat). 23 Sep sebelumnya kosong → tetap
1 post/hari/akun. Jadwal IG ke depan tetap 22/24/26/28/30 Sep + 2/4/6/8/10 Okt 17:00 WIB.

**Script:** `reschedule_tsc_20sep.py` (preview default, `run` untuk create; cek media 200 + anti-duplikat
slot/file per akun dulu) · log `tsc_reschedule_20sep_log.json` · alat audit baru
`cek_status_tsc_all.py` (1× tarik dump untuk 4 akun TSC: IG/Threads/FB/LinkedIn).
