[{"data":1,"prerenderedAt":315},["ShallowReactive",2],{"tag-labels":3,"site-header":4,"article-cache-hit-rate-zero-id":72},{},{"featuredPost":5,"navigations":29},{"id":6,"title":7,"title_id":8,"slug":9,"excerpt":10,"excerpt_id":11,"has_translation":12,"published_at":13,"reading_time":14,"hidden_from_listing":15,"tags":16,"thumbnail_image":21,"og_image":22,"series":23,"authors":28},110,"When You Pick a Framework Just to Look Different","Ketika Pilih Framework Cuma Biar Kelihatan Beda","ketika-pilih-framework-cuma-biar-kelihatan-beda","The last time you chose a new framework or library, was it because your problem needed that tool, or because it sounded cool and few people around you were using it? That question is uncomfortable. Technology decisions are often made for reasons that never appear in any technical document.","Terakhir kali kamu milih framework atau library baru, itu karena masalahmu butuh alat itu, atau karena alatnya kedengaran keren dan belum banyak yang pakai? Pertanyaan ini nggak enak dijawab. Soalnya keputusan teknologi sering diambil dengan alasan yang nggak pernah ditulis di dokumen teknis mana pun.",true,"2026-10-06T15:25:21.000Z",5,false,[17,18,19,20],"karier","framework","opini","pengalaman",null,"\u002Fog\u002Fketika-pilih-framework-cuma-biar-kelihatan-beda.png",{"id":24,"title":25,"title_id":26,"slug":27},9,"Articles","Artikel","all",[],[30,46,67],{"collection":31,"item":32},"series",{"__typename":31,"title":25,"title_id":26,"slug":27,"children_series":33},[34,38,42],{"title":35,"title_id":36,"slug":37},"Artificial Intelligence","Kecerdasan Artifisial","kecerdasan-artifisial",{"title":39,"title_id":40,"slug":41},"Programming Fundamentals","Konsep Dasar Pemrograman","konsep-dasar-pemrograman",{"title":43,"title_id":44,"slug":45},"Algorithms and Data Structures","Algoritma dan Struktur Data","algoritma-struktur-data",{"collection":31,"item":47},{"__typename":31,"title":48,"title_id":48,"slug":49,"children_series":50},"Tutorial","tutorial",[51,55,59,63],{"title":52,"title_id":53,"slug":54},"Learning Python","Belajar Python","belajar-python",{"title":56,"title_id":57,"slug":58},"Learning Go","Belajar Golang","belajar-golang",{"title":60,"title_id":61,"slug":62},"Learning Java","Belajar Java","belajar-java",{"title":64,"title_id":65,"slug":66},"Learning Pascal","Belajar Pascal","belajar-pascal",{"collection":31,"item":68},{"__typename":31,"title":69,"title_id":69,"slug":70,"children_series":71},"Lab","lab",[],{"article":73,"renderedBody":192,"renderedTakeaway":193,"latestArticles":194,"toc":298},{"id":74,"title":75,"title_id":75,"slug":76,"excerpt":77,"excerpt_id":77,"has_translation":12,"published_at":78,"reading_time":79,"hidden_from_listing":15,"tags":80,"thumbnail_image":21,"og_image":84,"series":85,"authors":184,"seoTitle":21,"seoDescription":21,"body_locale":187,"available_locales":188,"body":190,"takeway":191,"prerequisite":21},141,"Buku Panduan 6.000 Token dan Hit Rate Cache 0%","cache-hit-rate-zero","Dua puluh empat giliran, caching menyala, dan tagihan 21% lebih tinggi daripada menjalankannya tanpa cache sama sekali. Agen support yang prompt-nya kelihatan statis, dan tiga baris yang diam-diam mengubahnya tiap giliran.","2026-11-08T01:20:00.000Z",3,[70,81,82,83],"llm","cache","api","\u002Fog\u002Fcache-hit-rate-zero.png",{"id":86,"title":69,"title_id":69,"slug":70,"description":87,"description_id":88,"articles":89,"children_series":183,"parent_series":21},29,"Practice labs: work the problem first, then read the answer. Every lab ships with a repo you can clone, production-sized data, and a target you have to hit yourself. The write-up lives in this series too, and it only opens from the problem article.","Lab praktik: kerjakan masalahnya dulu, baru lihat jawabannya. Tiap lab punya repo yang bisa di-clone, data seukuran produksi, dan target yang harus kamu capai sendiri. Artikel jawabannya ada di seri ini juga, dan cuma bisa kamu buka dari artikel masalahnya.",[90,111,129,144,161,176],{"id":91,"title":92,"title_id":93,"slug":94,"excerpt":95,"excerpt_id":96,"has_translation":12,"published_at":97,"reading_time":14,"hidden_from_listing":15,"tags":98,"thumbnail_image":21,"og_image":102,"series":103,"authors":104},104,"N+1 Was Never the Bottleneck: 41 Queries Down to 2, Still One Second","Query-nya Tinggal 2, Tapi Response-nya Masih 1 Detik","query-tinggal-2-tapi-response-masih-1-detik","A feed endpoint that shows 20 posts takes a full second and hits the database with 41 queries. Apply the standard N+1 advice, get it down to 2 queries, and the latency does not move. This is that problem as it happened, plus the lab.","Endpoint feed yang cuma menampilkan 20 tulisan butuh satu detik, dan server database dihujani 41 query. Kamu kerjakan nasihat N+1 yang standar, query-nya turun jadi 2, dan latency-nya nggak bergerak. Ini versi \"apa adanya\" dari masalah itu, plus lab-nya.","2026-10-04T09:59:21.000Z",[99,100,101],"database","performance","backend","\u002Fog\u002Fquery-tinggal-2-tapi-response-masih-1-detik.png",{"id":86,"title":69,"title_id":69,"slug":70},[105],{"authors_id":106},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":21},1,"Daffa Izzuddin","izzudd","Writer",{"id":112,"title":113,"title_id":114,"slug":115,"excerpt":116,"excerpt_id":117,"has_translation":12,"published_at":118,"reading_time":119,"hidden_from_listing":15,"tags":120,"thumbnail_image":21,"og_image":124,"series":125,"authors":126},114,"One Payment, Four Ledger Rows: An Idempotency Lab","Saldo Naik Empat Kali untuk Satu Pembayaran","saldo-naik-empat-kali-untuk-satu-pembayaran","The code is not wrong and the gateway is not wrong, yet one payment shows up four times in the ledger. Guess why, then make `make check` green in the lab.","Kodenya nggak salah, dan gateway-nya juga nggak salah. Tapi satu pembayaran muncul empat kali di ledger. Coba tebak kenapa — lalu bikin `make check` hijau di lab-nya.","2026-10-11T13:45:00.000Z",4,[121,122,123,99,70],"idempotency","webhook","postgres","\u002Fog\u002Fsaldo-naik-empat-kali-untuk-satu-pembayaran.png",{"id":86,"title":69,"title_id":69,"slug":70},[127],{"authors_id":128},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":21},{"id":130,"title":131,"title_id":132,"slug":133,"excerpt":134,"excerpt_id":135,"has_translation":12,"published_at":136,"reading_time":79,"hidden_from_listing":15,"tags":137,"thumbnail_image":21,"og_image":139,"series":140,"authors":141},116,"The Webhook Arrived Late. The Reconciliation Job Had Already Run.","Webhook-nya Telat, Job Rekonsiliasinya Keburu Jalan","webhook-telat-job-rekonsiliasi-keburu-jalan","The webhook path is already idempotent. Then a morning reconciliation job appears, and one payment gets recorded twice from two paths that are both right. Guess where the key is wrong.","Jalur webhook sudah idempotent. Lalu ada job rekonsiliasi pagi, dan satu pembayaran tercatat dua kali dari dua jalur yang dua-duanya benar. Coba tebak kuncinya salah di mana.","2026-10-11T13:44:00.000Z",[121,138,122,123,70],"reconciliation","\u002Fog\u002Fwebhook-telat-job-rekonsiliasi-keburu-jalan.png",{"id":86,"title":69,"title_id":69,"slug":70},[142],{"authors_id":143},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":21},{"id":145,"title":146,"title_id":147,"slug":148,"excerpt":149,"excerpt_id":150,"has_translation":12,"published_at":151,"reading_time":119,"hidden_from_listing":15,"tags":152,"thumbnail_image":21,"og_image":156,"series":157,"authors":158},120,"Every Receipt in This Café Lists the Same Order","Tiap Nota di Kafe Ini Isinya Pesanan yang Sama","tiap-nota-isinya-pesanan-yang-sama","Every table's receipt holds the same items, and the total is Rp0 — even though each table ordered exactly one thing. Guess why, then make `make check` green. A Python scope and mutation lab.","Nota tiap meja isinya sama semua, dan totalnya Rp0 — padahal tiap meja cuma pesan satu barang. Coba tebak kenapa.","2026-10-11T23:00:15.000Z",[153,154,155,70],"python","scope","mutasi","\u002Fog\u002Ftiap-nota-isinya-pesanan-yang-sama.png",{"id":86,"title":69,"title_id":69,"slug":70},[159],{"authors_id":160},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":21},{"id":162,"title":163,"title_id":164,"slug":165,"excerpt":166,"excerpt_id":167,"has_translation":12,"published_at":151,"reading_time":119,"hidden_from_listing":15,"tags":168,"thumbnail_image":21,"og_image":171,"series":172,"authors":173},122,"A Script That Cannot Say Where It Went Wrong","Script yang Nggak Bisa Bilang di Mana Salahnya","script-yang-tidak-bilang-di-mana-salahnya","A script that stops at the first bad line reports only part of the problem. This is what shows up on screen right now.","Script yang berhenti di baris jelek pertama cuma melaporkan sebagian masalah yang ada. Ini yang muncul di layar sekarang.",[153,169,170,70],"error-handling","validasi","\u002Fog\u002Fscript-yang-tidak-bilang-di-mana-salahnya.png",{"id":86,"title":69,"title_id":69,"slug":70},[174],{"authors_id":175},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":21},{"id":74,"title":177,"title_id":75,"slug":76,"excerpt":178,"excerpt_id":77,"has_translation":12,"published_at":78,"reading_time":79,"hidden_from_listing":15,"tags":80,"thumbnail_image":21,"og_image":84,"series":179,"authors":180},"A 6,000-Token Handbook and a 0% Cache Hit Rate","Twenty-four turns, caching switched on, and a bill 21% higher than running with no cache at all. A support agent whose prompt looks static, and the three lines that quietly change it every turn.",{"id":86,"title":69,"title_id":69,"slug":70},[181],{"authors_id":182},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":21},[],[185],{"authors_id":186},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":21},"id",[189,187],"en","\nAgen support itu menjawab setiap tiket dengan benar. Di prompt-nya ada buku panduan kebijakan enam ribu kata, lima definisi tool, dan transkrip percakapan yang terus tumbuh. Prompt caching menyala, dan itulah bagian yang diperiksa tim waktu tagihan mulai naik.\n\nDua puluh empat giliran di tiga tiket mengirim 164.854 token dan menagih $0,4841. Loop yang sama dengan caching dimatikan menagih $0,4017. Fiturnya bukan cuma gagal menolong; dia menagih premi 21% untuk itu.\n\nIni lab 6 dari [inva-lab](https:\u002F\u002Fgithub.com\u002Fizzudd\u002Finva-lab), dan cukup `python3`: tanpa Docker, tanpa database, tanpa key, tanpa jaringan. Provider-nya simulasi dari aturan satu vendor yang diterbitkan November 2026, jadi angkanya bisa diulang dan gratis.\n\n## Yang kamu lihat saat menjalankannya\n\n| perintah | yang muncul |\n|---|---|\n| `make demo` | `hit=  0.0%  $0.4841` untuk ketiga tiket |\n| `make what-changes` | tools `DIFFERENT`, blok `[0]` `CHANGED`, breakpoint pindah dari blok `[1]` ke `[3]` |\n| `make check` | **0 dari 7** pemeriksaan hijau |\n| loop yang sama dengan `cache_enabled=False` | `$0.4017` |\n\nTidak ada yang terlihat rusak. Semua tiket terjawab, loop keluar dengan kode 0, dan provider tidak melaporkan error. Tagihannya satu-satunya gejala, dan `make bench` mengubahnya jadi tabel per giliran di mana `write` sama dengan `sent` di setiap baris: seluruh prompt ditulis ulang, tiap giliran, dan tidak ada yang pernah dibaca.\n\n## Kenapa prompt yang kelihatan statis tidak statis\n\nAda tiga hal yang berubah antara dua permintaan berurutan, dan tiap satunya masuk akal saat review kode.\n\nDefinisi tool membawa field `notes` berisi waktu snapshot registry. Itu ada untuk debugging, berubah tiap giliran, dan provider mem-hash tools sebelum menghash apa pun, jadi buku panduan di bawahnya menjadi teks baru setiap kali.\n\nSystem prompt dibuka dengan tanggal dan jam. Memberi tahu agen hari apa sekarang kelihatan jelas berguna, dan model memang memakainya; cache-nya tidak.\n\nBreakpoint-nya duduk di pesan terakhir. Itu blok yang berubah tiap giliran. Dokumentasi provider menamainya sebagai kesalahan yang menulis entri baru dan tidak pernah membaca satu pun: pencariannya menelusuri mundur mencari entri yang *ditulis* permintaan sebelumnya, dan tidak ada yang pernah ditulis di ujung buku panduan.\n\nAda satu lagi yang lebih sunyi di loop-nya: setiap giliran ketiga transkrip diganti ringkasan satu baris supaya konteksnya kecil. Konteksnya memang jadi kecil. Prefix-nya juga dipastikan tidak pernah bertahan, karena transkrip yang ditulis ulang bukan prefix.\n\n## Misimu\n\nBuat `make check` hijau. Tujuh pemeriksaan, satu tema: cache mengikuti byte.\n\n1. **Sedikitnya 75% token yang kamu kirim kembali sebagai cache read,** dan biayanya paling banyak 45% dari loop yang sama dengan caching dimatikan.\n2. **Model tetap menerima yang dia butuhkan.** Tanggal harus sampai ke model, array tool harus identik byte demi byte di setiap permintaan, dan tiap permintaan harus merupakan permintaan sebelumnya ditambah blok baru, bukan penulisan ulang.\n3. **Loop bertahan melewati jeda sepuluh menit** setelah giliran keempat, dan `python3 agent\u002Floop.py` mencetak satu baris berisi angka yang benar-benar dia ukur.\n\nVersi yang diperbaiki di repo mencapai 90,9% dan $0,1437, yaitu 34% dari permintaan yang sama dengan caching dimatikan. Transkripnya 6% *lebih panjang* daripada versi yang rusak, karena tidak ada lagi yang diringkas. Tagihannya turun sementara jumlah tokennya naik, dan itulah seluruh pelajarannya.\n\n## Kenapa provider-nya simulasi\n\nLab yang memanggil API sungguhan adalah lab yang butuh uang, butuh key, dan memberi angka berbeda di mesinmu. Yang ini punya jam palsu, jadi timeout cache lima menit dan jeda pelanggan sepuluh menit berjalan di bawah satu detik, dan ledger-nya deterministik. Tukarnya dinyatakan terang: `agent\u002Fprovider.py` menerapkan aturan satu vendor, satu token adalah satu kata, dan angkanya bukan yang akan ditagih ke akunmu.\n\nKalau kamu mau aturan yang dipakai vendor lain, dan apa yang terjadi saat prefix tumbuh dari 512 token ke 1.024 sementara cache-nya diam, itu ada di [artikel pendampingnya](\u002Fp\u002Fwhat-a-prompt-cache-remembers).\n\n## Kalau kamu buntu\n\n`HINTS.md` punya tiga tingkat, dan tingkat pertama cuma meminta kamu melihat dua permintaan berurutan berdampingan. Artikel jawabannya memuat progresi terukur, termasuk dua perbaikan yang tidak mengubah apa pun dan satu baris yang mengubah segalanya.\n","- **Caching menyala dan hit rate-nya 0,0%.** 164.854 token terkirim dalam dua puluh empat giliran, $0,4841, yaitu 21% lebih mahal daripada loop yang sama dengan caching dimatikan di $0,4017.\n- **Tiga baris merusak prefix-nya, dan ketiganya terlihat wajar saat review.** Timestamp registry di dalam definisi tool, jam di dalam system prompt, dan breakpoint yang diparkir di blok yang berubah tiap giliran.\n- **Misinya `make check`:** tujuh pemeriksaan, tidak ada yang hijau di kondisi awal, dan versi yang diperbaiki mencapai 90,9% dengan tagihan 34% dari jalan tanpa cache.\n- **Lab-nya jalan offline.** Python 3, tanpa API key, tanpa jaringan: provider-nya simulasi deterministik dari aturan caching satu vendor.","\u003Cp>Agen support itu menjawab setiap tiket dengan benar. Di prompt-nya ada buku panduan kebijakan enam ribu kata, lima definisi tool, dan transkrip percakapan yang terus tumbuh. Prompt caching menyala, dan itulah bagian yang diperiksa tim waktu tagihan mulai naik.\u003C\u002Fp>\n\u003Cp>Dua puluh empat giliran di tiga tiket mengirim 164.854 token dan menagih $0,4841. Loop yang sama dengan caching dimatikan menagih $0,4017. Fiturnya bukan cuma gagal menolong; dia menagih premi 21% untuk itu.\u003C\u002Fp>\n\u003Cp>Ini lab 6 dari \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fizzudd\u002Finva-lab\">inva-lab\u003C\u002Fa>, dan cukup \u003Ccode>python3\u003C\u002Fcode>: tanpa Docker, tanpa database, tanpa key, tanpa jaringan. Provider-nya simulasi dari aturan satu vendor yang diterbitkan November 2026, jadi angkanya bisa diulang dan gratis.\u003C\u002Fp>\n\u003Ch2 id=\"yang-kamu-lihat-saat-menjalankannya\">Yang kamu lihat saat menjalankannya\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>perintah\u003C\u002Fth>\n\u003Cth>yang muncul\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>make demo\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>hit=  0.0%  $0.4841\u003C\u002Fcode> untuk ketiga tiket\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>make what-changes\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>tools \u003Ccode>DIFFERENT\u003C\u002Fcode>, blok \u003Ccode>[0]\u003C\u002Fcode> \u003Ccode>CHANGED\u003C\u002Fcode>, breakpoint pindah dari blok \u003Ccode>[1]\u003C\u002Fcode> ke \u003Ccode>[3]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>make check\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>0 dari 7\u003C\u002Fstrong> pemeriksaan hijau\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>loop yang sama dengan \u003Ccode>cache_enabled=False\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>$0.4017\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>Tidak ada yang terlihat rusak. Semua tiket terjawab, loop keluar dengan kode 0, dan provider tidak melaporkan error. Tagihannya satu-satunya gejala, dan \u003Ccode>make bench\u003C\u002Fcode> mengubahnya jadi tabel per giliran di mana \u003Ccode>write\u003C\u002Fcode> sama dengan \u003Ccode>sent\u003C\u002Fcode> di setiap baris: seluruh prompt ditulis ulang, tiap giliran, dan tidak ada yang pernah dibaca.\u003C\u002Fp>\n\u003Ch2 id=\"kenapa-prompt-yang-kelihatan-statis-tidak-statis\">Kenapa prompt yang kelihatan statis tidak statis\u003C\u002Fh2>\n\u003Cp>Ada tiga hal yang berubah antara dua permintaan berurutan, dan tiap satunya masuk akal saat review kode.\u003C\u002Fp>\n\u003Cp>Definisi tool membawa field \u003Ccode>notes\u003C\u002Fcode> berisi waktu snapshot registry. Itu ada untuk debugging, berubah tiap giliran, dan provider mem-hash tools sebelum menghash apa pun, jadi buku panduan di bawahnya menjadi teks baru setiap kali.\u003C\u002Fp>\n\u003Cp>System prompt dibuka dengan tanggal dan jam. Memberi tahu agen hari apa sekarang kelihatan jelas berguna, dan model memang memakainya; cache-nya tidak.\u003C\u002Fp>\n\u003Cp>Breakpoint-nya duduk di pesan terakhir. Itu blok yang berubah tiap giliran. Dokumentasi provider menamainya sebagai kesalahan yang menulis entri baru dan tidak pernah membaca satu pun: pencariannya menelusuri mundur mencari entri yang \u003Cem>ditulis\u003C\u002Fem> permintaan sebelumnya, dan tidak ada yang pernah ditulis di ujung buku panduan.\u003C\u002Fp>\n\u003Cp>Ada satu lagi yang lebih sunyi di loop-nya: setiap giliran ketiga transkrip diganti ringkasan satu baris supaya konteksnya kecil. Konteksnya memang jadi kecil. Prefix-nya juga dipastikan tidak pernah bertahan, karena transkrip yang ditulis ulang bukan prefix.\u003C\u002Fp>\n\u003Ch2 id=\"misimu\">Misimu\u003C\u002Fh2>\n\u003Cp>Buat \u003Ccode>make check\u003C\u002Fcode> hijau. Tujuh pemeriksaan, satu tema: cache mengikuti byte.\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>Sedikitnya 75% token yang kamu kirim kembali sebagai cache read,\u003C\u002Fstrong> dan biayanya paling banyak 45% dari loop yang sama dengan caching dimatikan.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Model tetap menerima yang dia butuhkan.\u003C\u002Fstrong> Tanggal harus sampai ke model, array tool harus identik byte demi byte di setiap permintaan, dan tiap permintaan harus merupakan permintaan sebelumnya ditambah blok baru, bukan penulisan ulang.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Loop bertahan melewati jeda sepuluh menit\u003C\u002Fstrong> setelah giliran keempat, dan \u003Ccode>python3 agent\u002Floop.py\u003C\u002Fcode> mencetak satu baris berisi angka yang benar-benar dia ukur.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Versi yang diperbaiki di repo mencapai 90,9% dan $0,1437, yaitu 34% dari permintaan yang sama dengan caching dimatikan. Transkripnya 6% \u003Cem>lebih panjang\u003C\u002Fem> daripada versi yang rusak, karena tidak ada lagi yang diringkas. Tagihannya turun sementara jumlah tokennya naik, dan itulah seluruh pelajarannya.\u003C\u002Fp>\n\u003Ch2 id=\"kenapa-provider-nya-simulasi\">Kenapa provider-nya simulasi\u003C\u002Fh2>\n\u003Cp>Lab yang memanggil API sungguhan adalah lab yang butuh uang, butuh key, dan memberi angka berbeda di mesinmu. Yang ini punya jam palsu, jadi timeout cache lima menit dan jeda pelanggan sepuluh menit berjalan di bawah satu detik, dan ledger-nya deterministik. Tukarnya dinyatakan terang: \u003Ccode>agent\u002Fprovider.py\u003C\u002Fcode> menerapkan aturan satu vendor, satu token adalah satu kata, dan angkanya bukan yang akan ditagih ke akunmu.\u003C\u002Fp>\n\u003Cp>Kalau kamu mau aturan yang dipakai vendor lain, dan apa yang terjadi saat prefix tumbuh dari 512 token ke 1.024 sementara cache-nya diam, itu ada di \u003Ca href=\"\u002Fp\u002Fwhat-a-prompt-cache-remembers\">artikel pendampingnya\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"kalau-kamu-buntu\">Kalau kamu buntu\u003C\u002Fh2>\n\u003Cp>\u003Ccode>HINTS.md\u003C\u002Fcode> punya tiga tingkat, dan tingkat pertama cuma meminta kamu melihat dua permintaan berurutan berdampingan. Artikel jawabannya memuat progresi terukur, termasuk dua perbaikan yang tidak mengubah apa pun dan satu baris yang mengubah segalanya.\u003C\u002Fp>\n","\u003Cul>\n\u003Cli>\u003Cstrong>Caching menyala dan hit rate-nya 0,0%.\u003C\u002Fstrong> 164.854 token terkirim dalam dua puluh empat giliran, $0,4841, yaitu 21% lebih mahal daripada loop yang sama dengan caching dimatikan di $0,4017.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Tiga baris merusak prefix-nya, dan ketiganya terlihat wajar saat review.\u003C\u002Fstrong> Timestamp registry di dalam definisi tool, jam di dalam system prompt, dan breakpoint yang diparkir di blok yang berubah tiap giliran.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Misinya \u003Ccode>make check\u003C\u002Fcode>:\u003C\u002Fstrong> tujuh pemeriksaan, tidak ada yang hijau di kondisi awal, dan versi yang diperbaiki mencapai 90,9% dengan tagihan 34% dari jalan tanpa cache.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Lab-nya jalan offline.\u003C\u002Fstrong> Python 3, tanpa API key, tanpa jaringan: provider-nya simulasi deterministik dari aturan caching satu vendor.\u003C\u002Fli>\n\u003C\u002Ful>\n",[195,217,238,256,261,278],{"id":196,"title":197,"title_id":198,"slug":199,"excerpt":200,"excerpt_id":201,"has_translation":12,"published_at":202,"reading_time":119,"hidden_from_listing":15,"tags":203,"thumbnail_image":21,"og_image":208,"series":209,"authors":214},48,"What a Linked List Actually Is","Tentang Struktur Data LinkedList","tentang-struktur-data-linked-list","A linked list is a linear chain of nodes, each holding data and a pointer to the next node. Here is what that chain looks like, what it costs next to an array, and the same minimal implementation in Java, Python, and JavaScript.","Linked list adalah rantai linear berisi node, dan setiap node menyimpan data plus pointer ke node berikutnya. Ini bentuk rantainya, ongkosnya dibanding array, dan implementasi paling sederhana dalam Java, Python, serta JavaScript.","2026-11-21T01:00:00.000Z",[204,205,206,207],"struktur-data","linked-list","pointer","konsep","\u002Fog\u002Ftentang-struktur-data-linked-list.png",{"id":210,"title":211,"title_id":212,"slug":213},28,"Linear Data Structures","Struktur Data Linear","asd-struktur-linear",[215],{"authors_id":216},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":21},{"id":218,"title":219,"title_id":220,"slug":221,"excerpt":222,"excerpt_id":223,"has_translation":12,"published_at":224,"reading_time":225,"hidden_from_listing":15,"tags":226,"thumbnail_image":21,"og_image":229,"series":230,"authors":235},47,"Why Understanding Algorithms and Data Structures Actually Matters","Pentingnya Memahami Algoritma dan Struktur Data","pentingnya-memahami-algoritma-dan-struktur-data","An algorithm is an ordered list of steps, and that order decides how expensive a problem is. The examples are on the back of an instant noodle packet, in a factorial, and behind ctrl+z.","Sebagai konsep fundamental, algoritma menentukan seberapa mahal sebuah masalah diselesaikan. Contohnya ada di bungkus mie instan, di bilangan faktorial, dan di tombol undo.","2026-11-19T01:00:00.000Z",7,[227,204,207,228],"algoritma","dasar","\u002Fog\u002Fpentingnya-memahami-algoritma-dan-struktur-data.png",{"id":231,"title":232,"title_id":233,"slug":234},27,"About Algorithms and Data Structures","Tentang Algoritma dan Struktur Data","asd-intro",[236],{"authors_id":237},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":21},{"id":239,"title":240,"title_id":241,"slug":242,"excerpt":243,"excerpt_id":244,"has_translation":12,"published_at":245,"reading_time":14,"hidden_from_listing":15,"tags":246,"thumbnail_image":21,"og_image":251,"series":252,"authors":253},108,"At 11 a.m. the AI Quota Runs Out, and the Work Stops There","Jam 11 siang kuota AI-nya habis, dan kerjaan berhenti di situ","jam-11-kuota-ai-habis-kerjaan-berhenti","The panel says the usage limit is reached and the work stops, not because it is finished. Three guesses explain it, and all three are wrong: the limit is shaped like a cliff, and the day is built on top of one tool.","Panel di layar bilang batas pemakaian tercapai, dan kerja berhenti di situ. Bukan karena selesai. Ada tiga tebakan kenapa ini terjadi, dan ketiganya salah: batasnya berbentuk tebing, dan harinya dibangun di atas satu alat.","2026-11-12T01:00:00.000Z",[247,248,249,250],"ai","tooling","rate-limit","produktivitas","\u002Fog\u002Fjam-11-kuota-ai-habis-kerjaan-berhenti.png",{"id":24,"title":25,"title_id":26,"slug":27},[254],{"authors_id":255},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":21},{"id":74,"title":177,"title_id":75,"slug":76,"excerpt":178,"excerpt_id":77,"has_translation":12,"published_at":78,"reading_time":79,"hidden_from_listing":15,"tags":80,"thumbnail_image":21,"og_image":84,"series":257,"authors":258},{"id":86,"title":69,"title_id":69,"slug":70},[259],{"authors_id":260},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":21},{"id":262,"title":263,"title_id":264,"slug":265,"excerpt":266,"excerpt_id":267,"has_translation":12,"published_at":268,"reading_time":269,"hidden_from_listing":15,"tags":270,"thumbnail_image":21,"og_image":272,"series":273,"authors":275},140,"What a Prompt Cache Actually Remembers","Apa yang Sebenarnya Diingat Prompt Cache","what-a-prompt-cache-remembers","Four providers cache the same bytes under four different rulebooks. The question that decides your bill: when the second request is longer than the first, does it reuse the whole prefix or only the part that was already written?","Empat provider meng-cache byte yang sama dengan empat buku aturan berbeda. Pertanyaan yang menentukan tagihanmu: saat permintaan kedua lebih panjang, apakah seluruh prefix dipakai ulang atau cuma bagian yang sudah pernah ditulis?","2026-11-08T01:10:00.000Z",6,[81,271,82,83],"ai-agent","\u002Fog\u002Fwhat-a-prompt-cache-remembers.png",{"id":274,"title":35,"title_id":36,"slug":37},8,[276],{"authors_id":277},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":21},{"id":279,"title":280,"title_id":281,"slug":282,"excerpt":283,"excerpt_id":284,"has_translation":12,"published_at":285,"reading_time":14,"hidden_from_listing":15,"tags":286,"thumbnail_image":21,"og_image":289,"series":290,"authors":295},138,"Python venv: the Install That Went Into the Wrong Python","venv Python: Instalasi yang Masuk ke Python yang Salah","python-venv-pip","`pip install` printed Successfully installed, and the next run raised ModuleNotFoundError on the same machine. Two interpreters, one install, and the variable your script checks is the one the interpreter never sets.","`pip install` mencetak Successfully installed, lalu jalan berikutnya melempar ModuleNotFoundError di mesin yang sama. Dua interpreter, satu instalasi, dan variabel yang skripmu periksa justru tidak pernah dipasang oleh interpreter.","2026-11-07T12:00:00.000Z",[153,287,288],"venv","pip","\u002Fog\u002Fpython-venv-pip.png",{"id":291,"title":292,"title_id":293,"slug":294},18,"Working with Python Scripts","Menggunakan Script Python","python-pemrograman-dengan-script",[296],{"authors_id":297},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":21},[299,303,306,309,312],{"text":300,"depth":301,"id":302},"Yang kamu lihat saat menjalankannya",2,"yang-kamu-lihat-saat-menjalankannya",{"text":304,"depth":301,"id":305},"Kenapa prompt yang kelihatan statis tidak statis","kenapa-prompt-yang-kelihatan-statis-tidak-statis",{"text":307,"depth":301,"id":308},"Misimu","misimu",{"text":310,"depth":301,"id":311},"Kenapa provider-nya simulasi","kenapa-provider-nya-simulasi",{"text":313,"depth":301,"id":314},"Kalau kamu buntu","kalau-kamu-buntu",1794150713329]