Sebuah thread di Threads ramai minggu ini. Intinya begini: hasil AI website builder kelihatan cantik di preview, tapi begitu CSS dimatikan, isinya div semua. Nol heading, nol section, nol nav.
Thread itu dapat 44.020 tayangan, 414 suka, dan 72 repost. Balasan Meta AI ikut merangkum klaimnya, jadi makin banyak yang percaya.
Gue nggak langsung percaya, tapi juga nggak langsung membantah. Klaimnya masuk akal, cuma ada satu masalah: dia mencampur dua lapisan yang berbeda. Builder seperti Lovable, Bolt, v0, dan Cursor itu lapisan atas. Yang sebenarnya menulis HTML adalah model di baliknya. Kalau mau tahu siapa yang salah, ukur lapisan yang bisa diukur.
Jadi gue ukur. Empat model, satu prompt identik, satu berkas HTML masing-masing. Hasilnya bukan persis seperti yang thread itu klaim, dan justru itu yang lebih menarik.
TL;DR
- Empat dari empat model menghasilkan nol
<button>. Semua tombol jadi<a>. Di screen reader, tombol “Mulai Gratis” dibacakan sebagai tautan. - Empat dari empat menghasilkan nol
<img>. Jadi alt text bukan lupa dipasang, memang tidak ada gambarnya. - Klaim “nol heading” tidak terbukti di model 2026. Ketiga model yang berhasil menulis
<h1>,<header>,<section>, dan<footer>. - Yang benar-benar hilang adalah
<main>(2 dari 3) dan elemen kontrol yang punya role. - Biaya bikin satu landing page: Rp3,66 sampai Rp104,40 tergantung model.
- Model gratis
glm-5.3-flashmenghabiskan 6.000 token untuk berpikir lalu mengembalikan string kosong.
Isi thread yang bikin ramai
Akun @ladomextzy menulis delapan bagian. Bagian pertama cerita pengalaman: dia generate landing page dari beberapa AI editor, preview-nya mulus, animasi jalan, gradient rapi. Lalu dia buka DevTools, tab Elements, dan membaca HTML-nya. Bukan visualnya, isinya. Hasilnya hampir seragam: semuanya div.
Bagian kedua sampai ketiga menyebut tiga dampak. SEO, karena crawler membaca struktur. Screen reader, karena pengguna tunanetra menavigasi lewat heading dan landmark. Keyboard, karena tombol tanpa focus-visible tidak kelihatan saat di-Tab.
Bagian keempat sampai kelima kasih empat langkah audit gratis: cek <h1> di view source, tekan Tab sepuluh kali, scan kontras di WAVE, cek LCP dan byte JavaScript di PageSpeed. Bagian keenam kasih contoh prompt yang spesifik, bukan “bikin lebih SEO friendly”. Bagian ketujuh jujur soal limitasi. Bagian kedelapan jualan PromptedSite.
Komentar yang masuk juga masuk akal. Ada yang bilang akar masalahnya React, karena komponen React isinya div semua. Ada yang bilang ini cuma masalah prompt. Ada yang bilang accessibility baru disentuh kalau klien minta optimasi SEO.
Semua poin itu valid. Tapi belum ada satu pun angka tentang seberapa parah, dan model apa yang paling parah. Di situ gue masuk.
Cara gue nguji
Gue pakai satu prompt netral. Tidak ada kata “semantik”, tidak ada kata “aksesibilitas”, tidak ada instruksi HTML5. Persis seperti orang biasa yang minta landing page.
Buat landing page untuk SaaS manajemen inventori bernama Stokara. Keluarkan satu file HTML lengkap dengan CSS di dalam
<style>. Sertakan hero section, 3 fitur, harga, dan footer. Hanya kode, tanpa penjelasan.
Empat model, semuanya berstatus aktif di gateway, temperature 0,7, max_tokens 6000. Hasilnya gue ukur pakai hitungan tag langsung, lalu gue lempar ke validator W3C supaya angkanya bukan cuma hitungan regex buatan gue sendiri.
| Model | Byte | div |
Tag semantik | h1 |
<button> |
<img> |
aria-* |
focus-visible |
Error W3C | Biaya | Waktu |
|---|---|---|---|---|---|---|---|---|---|---|---|
| deepseek-v4.1-flash-1017 | 6.114 | 22 | 6 | 1 | 0 | 0 | 0 | 0 | 1 | Rp3,66 | 14,6 s |
| gemini-3.8-flash | 15.320 | 31 | 3 | 1 | 0 | 0 | 0 | 0 | 5 | Rp8,19 | 36,6 s |
| gpt-6.1-sol | 17.744 | 24 | 14 | 1 | 0 | 0 | 21 | 2 | 1 | Rp104,40 | 101,5 s |
| glm-5.3-flash | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | gagal | Rp0 | 138,5 s |
Kolom “tag semantik” menghitung header, nav, main, section, article, dan footer yang benar-benar muncul.
Tiga temuan yang bikin gue berhenti
1. Nol tombol, empat dari empat
Ini yang paling mengejutkan. Empat model menghasilkan nol <button>. Nol. Padahal setiap landing page punya call to action, dan promptnya minta bagian harga.
Yang mereka tulis bukan tombol yang salah, tapi tautan yang dibungkus CSS supaya kelihatan seperti tombol. Secara visual tidak ada bedanya. Secara aksesibilitas beda jauh.
WCAG 4.1.2 (Name, Role, Value) minta setiap komponen antarmuka punya nama, peran, dan nilai yang bisa dibaca teknologi bantu. Screen reader mengumumkan <a> sebagai “link”. Jadi pengguna tunanetra mendengar “tautan, Mulai Gratis”, bukan “tombol, Mulai Gratis”. Untuk aksi yang mengubah state, itu informasi yang salah.
Lebih nyata lagi buat pengguna keyboard: pada <a>, tombol Enter jalan, tombol Space tidak. Pada <button>, dua-duanya jalan. Orang yang menavigasi dengan keyboard akan menekan Space dan tidak terjadi apa-apa.
2. Nol gambar, jadi alt text mustahil
Sama mengejutkannya: nol <img> di keempat output. Landing page 17 ribu byte itu visualnya sepenuhnya CSS, gradient dan bentuk, bukan gambar.
Kabar baiknya, ini justru aman dari sisi WCAG 1.1.1 (Non-text Content), karena tidak ada gambar yang perlu alt. Kabar buruknya, begitu lo ganti ilustrasi CSS itu dengan foto asli, tidak ada satu pun alt yang bisa diwarisi. Dan di situlah manusia mulai lupa.
3. Model yang paling niat justru satu-satunya yang error ARIA
gpt-6.1-sol adalah satu-satunya yang peduli. Dia menulis <main>, enam <article>, 21 atribut aria-*, dan dua aturan focus-visible. Rasio tag semantiknya paling sehat: 14 tag semantik untuk 24 div.
Tapi validasi W3C-nya justru gagal karena satu hal:
The
aria-labelattribute must not be specified on anydivelement unless the element has arolevalue other than …
Dia menaruh aria-label di div tanpa role. Niatnya benar, eksekusinya salah. Dan ini pola yang penting: ARIA yang salah lebih berbahaya daripada tidak ada ARIA sama sekali, karena dia memberi jaminan palsu.
Dua model lain punya masalah berbeda. gemini-3.8-flash lupa menutup tiga div, jadi validator melaporkan “end of file seen and there were open elements” dan browser harus menebak sendiri di mana elemennya berakhir. deepseek-v4.1-flash-1017 paling bersih dari sisi validasi: satu error sisa karakter di luar </html>, selebihnya rapi.
glm-5.3-flash gagal total. Dia menghabiskan 6.000 token, seluruh kuota output, untuk reasoning, lalu mengembalikan string kosong setelah 138 detik. Model ini gratis, dan hasilnya memang nol. Perlu gue akui: max_tokens 6000 itu batas yang gue set sendiri, jadi ini sebagian salah metode gue, bukan murni salah modelnya. Tapi kalau kalian pakai model reasoning dengan batas output ketat, ini akan kejadian juga.
💬 Komentar (0)
Belum ada komentar. Jadilah yang pertama! 💬