TL;DR
- Angka "90%" dari Spotify adalah rata-rata skenario baca massal yang diukur dalam estimasi token input pada monorepo Java. Postingannya tidak menyebut angka biaya dalam dolar dan tidak ada skor kualitas.
- Dibangun ulang di Claude Code biasa (satu hook PreToolUse, dua subagent murah, aturan routing tiga baris) dan diukur pada Fastify dengan empat skenario dan 16 run, pola ini memangkas konteks model utama sebesar 59.6% dan total biaya sebesar 33.1%.
- Hook deny tidak pernah aktif dalam run yang diukur. Penghematan datang dari aturan routing di CLAUDE.md; hook hanyalah jaring pengaman untuk hari ketika model mengabaikan aturan itu.
- Delegasi selalu lebih lambat, rata-rata +65.3% waktu tempuh. Pada skenario kecil penulisan test, biayanya justru 2.6% lebih mahal.
- Dua jebakan: hook juga aktif di dalam subagent, jadi kecualikan worker Anda, dan pembacaan rentang
sed -nlolos begitu saja dari hook yang hanya mengawasicat,headdantail. - Ringkasan dari reader Haiku memuat kesalahan fakta pada dua dari delapan run yang didelegasikan. Pertahankan giliran verifikasi model utama.
Apa kata pengukurannya
Plugin Spotify, Shunt, mengarahkan pekerjaan massal menjauh dari model utama lewat dua "mode": bulk-reader dan code-writer, keduanya memakai Gemini 2.5 Flash dalam contoh, dengan field model yang menerima model apa pun yang dikonfigurasi di instance Portal s1. Routing-nya terdiri dari tiga lapisan. Hook check-file-size aktif di setiap Read dan memblokir file di atas ambang baris yang bisa dikonfigurasi, default 350, lalu mengarahkan model ke skill bulk-reader; hook check-bash-read menangkap cat, head, tail, less dan more pada file besar, sementara perintah dengan pipe dibiarkan lewat s1. Sumber hook dan kedua skill ada di repo publik s2, dan pemeriksaan ukuran bisa dibaca sendiri s3. Mode-mode itu sendiri berada di Portal, platform internal Spotify, itulah sebabnya plugin ini tidak bisa dijalankan di luar perusahaan sebagaimana dirilis s4.
Klaim benchmark-nya tipis. Spotify menguji empat skenario pada monorepo Java, "measuring tokens Claude would consume reading files directly vs. consuming the bulk-reader's summary", dan melaporkan rata-rata penghematan baca massal sekitar 90% s1. Postingan itu sendiri mengatakan skenario penulisan kode lebih sulit diukur dalam token, ringkasan worker tidak menyertakan nomor baris yang andal sehingga proses edit tidak bisa didelegasikan, worker melewatkan bug thread-safety halus yang ditangkap model utama, dan setiap delegasi menambah 10 sampai 30 detik dengan Portal membatasi satu pemanggilan hingga 30 detik s1. Thread Hacker News mengangkat pertanyaan yang sama tentang apa yang sebenarnya diukur oleh angka 90% itu s7.
Versi bangun ulangnya mengganti mode Portal dengan dua subagent Claude Code yang file definisinya mengunci model: reader Explore di Haiku dan code-writer di Sonnet s6. Deny-nya berupa hook PreToolUse yang mengembalikan keputusan deny dalam format JSON hook terbaru s5. Repo yang diuji adalah fastify/fastify pada commit ac28821d, 294 file .js/.ts, 78270 baris, 63 file di atas 350 baris. ID model sesuai laporan JSON sesi: percakapan utama claude-opus-5[1m], reader claude-haiku-4-5-20251001, writer claude-sonnet-5. Setiap skenario dijalankan dua kali per konfigurasi, 16 run terukur, sesi claude -p satu giliran dengan pengaturan khusus proyek sehingga kedua sisi punya system prompt yang identik s5.
Di mana pola ini menang: S2, pertanyaan call graph tiga file atas lib/route.js (691 baris), lib/reply.js (1090) dan lib/request.js (398), turun dari rata-rata konteks utama 357165.5 token menjadi 73440.0 (-79.4%) dan dari 0.5810500000000001 USD menjadi 0.21823605000000001 USD (-62.4%). Di mana tidak: S4, menulis test untuk source 45 baris dengan referensi 19 baris, berbiaya 0.29465575 USD tanpa delegasi dan 0.3022213 USD dengan delegasi (+2.6%), karena Sonnet adalah konteks penuh kedua (13004 sampai 18729 token cache-read) dan model utama tetap membaca ulang file yang dihasilkan lalu menjalankan test s6.
Tiga temuan lebih penting daripada persentasenya. Pertama, hook aktif nol kali dalam 16 run terukur: dengan aturan routing di CLAUDE.md, model utama menjalankan wc -l dan mendelegasikan sendiri. Satu-satunya deny yang teramati berasal dari run verifikasi tanpa CLAUDE.md, di mana model ditolak saat Read, lalu ditolak saat cat -n, dan menjawab hanya dari grep -n tanpa pernah memanggil tool Agent s5. Kedua, hook berjalan di dalam subagent: pada dua run yang dibuang, reader Haiku sendiri ditolak oleh pemeriksaan ukuran dan beralih ke pembacaan offset/limit per potongan. Perbaikannya adalah escape case "$agent_type" in Explore|code-writer) exit 0 di bagian atas hook, dengan nama field yang dikonfirmasi dari stdin yang dicatat di log s5. Ketiga, pada konfigurasi baseline model utama tidak pernah memakai tool Read sama sekali. Ia membaca setiap file lewat Bash (cat -n, sed -n '1,200p', sed -n '200,560p'), jadi hook yang hanya mengawasi Read tidak menangkap apa pun, dan hook Bash yang hanya mencocokkan cat, head dan tail tanpa pipe tetap membiarkan rentang sed -n lewat s3.
Kualitas diperiksa terhadap source dengan grep. Baseline menghasilkan nomor baris yang salah pada satu run S2 (ia menampilkan file dengan sed -n tanpa nomor baris dan menghitung manual). Konfigurasi dengan delegasi menghasilkan tiga kesalahan fakta pada run S2 yang lain dan dua pada satu run S3, semuanya berasal dari ringkasan Haiku yang diterima begitu saja: pemanggil buildRequest/buildReply yang salah, konstanta yang tidak diekspor tercantum sebagai export, iterator yang tercakup ditandai tidak tercakup. Di tempat model utama menghabiskan token output untuk verifikasi ulang dengan grep (S3, 4534 sampai 4738 token output), jawabannya benar s6. Pada skenario penulisan test, setiap file yang dihasilkan lulus: 12/12, 6/6, 7/7 dan 10/10 test. Satu laporan Reddit menunjukkan mode kegagalan terkait, yaitu model utama yang memunculkan worker di model yang salah ketika tidak ada yang mengunci model s8, dan itulah yang dijaga oleh hook require-model dan field model: di file agent.
Pengukuran
Rata-rata dari 2 run per sel. "Main context" adalah token input + cache_creation + cache_read yang ditagihkan ke model utama selama sesi, angka yang sebanding dengan "tokens in the main context" milik Spotify. A = Claude Code biasa, B = hook + subagent + aturan CLAUDE.md.
| skenario | konteks utama A | konteks utama B | perubahan | output utama A | output utama B | perubahan | total biaya A | total biaya B | perubahan | durasi A s | durasi B s | perubahan |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| S1 | 88693.0 | 51551.5 | -41.9% | 1424.5 | 1060.5 | -25.6% | 0.13910675 | 0.08653685 | -37.8% | 21.817500000000003 | 43.799499999999995 | +100.8% |
| S2 | 357165.5 | 73440.0 | -79.4% | 3835.0 | 2555.5 | -33.4% | 0.5810500000000001 | 0.21823605000000001 | -62.4% | 51.637 | 129.036 | +149.9% |
| S3 | 303807.5 | 114135.5 | -62.4% | 6192.0 | 4636.0 | -25.1% | 0.451037 | 0.3738534 | -17.1% | 93.321 | 124.64099999999999 | +33.6% |
| S4 | 143431.5 | 121818.0 | -15.1% | 5275.5 | 3340.0 | -36.7% | 0.29465575 | 0.3022213 | +2.6% | 65.7125 | 86.857 | +32.2% |
| all 4 | 223274.375 | 90236.25 | -59.6% | 4181.75 | 2898.0 | -30.7% | 0.366462375 | 0.2452119 | -33.1% | 58.122 | 96.08337499999999 | +65.3% |
Protokol: dua clone dangkal fastify/fastify yang identik byte demi byte pada ac28821d; repo-shunt hanya menambahkan .claude/ (settings, dua file agent, tiga hook) dan aturan routing CLAUDE.md, tidak ada yang lain. Setiap sesi: claude -p "<prompt>" --output-format json --setting-sources project --strict-mcp-config dengan konfigurasi MCP kosong, tanpa --model, timeout 600 s. Empat prompt, identik di kedua sisi: S1 export dari lib/reply.js, S2 call graph di tiga file lib, S3 method di lib/hooks.js dibandingkan cakupan test/hooks.test.js, S4 menulis test/head-route.test.js mengikuti test/noop-set.test.js. Angka dibaca dari modelUsage dan total_cost_usd di JSON sesi, tanpa pembulatan. Jawaban diperiksa terhadap source dengan grep; test yang dihasilkan dijalankan dengan node --test.
Lakukan ini hari Senin
- Jalankan
wc -ldi seluruh repo Anda dan hitung file di atas 350 baris. Jika jumlahnya mendekati nol, berhenti di sini: ambang itu ada karena delegasi lebih mahal daripada penghematannya pada file kecil. - Tambahkan aturan routing tiga baris ke CLAUDE.md Anda: file di atas ambang pergi ke subagent reader, kode yang mengikuti pola pergi ke subagent writer, debugging dan arsitektur tetap di model utama. Dalam pengukuran, aturan inilah yang melakukan seluruh pekerjaan.
- Buat
.claude/agents/Explore.mddenganmodel: haikudan.claude/agents/code-writer.mddenganmodel: sonnetdi frontmatter, sehingga model worker terkunci di file dan tidak diserahkan ke orchestrator. - Tulis hook PreToolUse pada Read sebagai jaring pengaman, mengembalikan keputusan deny dalam format JSON hook terbaru, dan buat baris pertamanya exit 0 ketika
agent_typeadalah salah satu worker Anda. - Perluas hook Bash melampaui
cat,headdantail: cocokkan rentangsed -ndancat -npada file besar, biarkan perintah dengan pipe dan grep lewat. - Jalankan satu pertanyaan nyata dengan dan tanpa folder
.claude/, dariclaude -p --output-format json, lalu bandingkantotal_cost_usddanduration_ms, bukan hanya kolom input. - Periksa dua jawaban hasil delegasi terhadap source dengan grep sebelum memercayai ringkasan reader; anggarkan giliran verifikasi model utama sebagai bagian dari biaya.
- Ukur juga sesi multi-giliran: hasil satu giliran membuat konteks utama berada di 50k sampai 119k token dibandingkan 84k sampai 414k tanpa delegasi, jadi pertanyaan kedua seharusnya mulai lebih murah, tetapi itu tidak diukur.
Lanjut lebih jauh
- Baca format hook dan field
agent_typedi referensi resmi sebelum menyalin hook dari blog; bentuk deny dan field di stdin itulah yang memungkinkan pengecualian subagent s5. - Dokumentasi subagent membahas field frontmatter
modeldan pembatasan tool, cara menjaga reader tetap read-only dan murah s6. - Bagian "What doesn't work" milik Spotify adalah bagian paling berguna dari postingan itu: tidak ada edit yang didelegasikan (ringkasan tanpa nomor baris yang andal), tidak ada penalaran yang didelegasikan (bug thread-safety terlewat), bolak-balik 10 sampai 30 detik s1.
- README Shunt menunjukkan struktur tiga lapisan (hook, script, skill) dan teks skill yang memberi tahu model kapan harus mendelegasikan; prosa skill itulah bagian yang layak diadaptasi, bukan hook-nya s2.
- Mode Portal adalah lapisan konfigurasi di atas sebuah model plus system prompt; gagasan yang sama dipetakan ke file agent Claude Code dengan field
models4. - Thread Hacker News adalah tempat pertanyaan pengukuran pertama kali diajukan, dan cocok sebagai daftar periksa untuk klaim penghematan token apa pun s7.
- Sebuah thread Reddit mendokumentasikan orchestrator yang memunculkan lima worker di model mahalnya sendiri; kunci model di file agent dan, jika Anda ingin jaminan keras, tolak pemanggilan Agent tanpa field
models8.
Sumber
- Portal by Spotify cut my Claude Code token usage by 90%, Spotify Engineering. Alasan membacanya: klaim aslinya, desain tiga lapisan, dan bagian keterbatasan yang jujur yang melemahkan judulnya.
- Shunt plugin (spotify/portal-ai-plugins), GitHub. Alasan membacanya: hook, script dan teks skill yang sebenarnya, cukup pendek untuk dibaca sampai habis.
- check-file-size hook source, GitHub. Alasan membacanya: pemeriksaan 350 baris dalam beberapa baris shell, templat untuk deny Anda sendiri.
- Portal Modes documentation, Spotify. Alasan membacanya: apa itu "mode", agar Anda paham mengapa ia dipetakan ke file subagent.
- Claude Code hooks reference, Anthropic. Alasan membacanya: format deny terbaru dan field stdin, termasuk yang mengidentifikasi subagent.
- Claude Code subagents, Anthropic. Alasan membacanya: field frontmatter
modeldan allowlist tool untuk worker read-only yang murah. - Hacker News discussion of the Spotify post, Hacker News. Alasan membacanya: pertanyaan tentang apa yang diukur angka 90%, diajukan sebelum ada yang mengukur ulang.
- Fable spawned five Fable agents instead of Opus (r/ClaudeCode), Reddit. Alasan membacanya: mode kegagalan yang dicegah oleh field
modelyang dikunci.
FAQ
Apakah angka 90% itu salah?
Angka itu mengukur satu hal: estimasi token input di konteks utama untuk skenario baca massal pada file Java besar. Pada metrik sejenis, versi bangun ulang melihat 41.9% sampai 79.4% pada skenario baca. Angka itu tidak mengatakan apa pun tentang biaya, waktu atau kualitas jawaban, dan postingannya memang tidak mengklaimnya.
Apakah saya butuh Portal untuk mendapatkan ini?
Tidak. Routing-nya ada di aturan CLAUDE.md, dua file agent dengan model terkunci dan hook PreToolUse. Portal menyediakan model worker di Spotify; satu baris model: haiku melakukan pekerjaan yang sama di Claude Code biasa.
Kapan delegasi lebih mahal?
Saat file-nya kecil. Skenario penulisan test 45 baris berbiaya 2.6% lebih mahal dengan delegasi karena writer adalah konteks penuh kedua dan model utama tetap membaca ulang dan menguji hasilnya. Setiap run yang didelegasikan juga lebih lambat, +65.3% rata-rata.
Mengapa hook tidak pernah aktif?
Karena aturan routing di CLAUDE.md membuat model utama memeriksa wc -l dan mendelegasikan sebelum mencoba membaca. Hook hanya berarti ketika model mengabaikan aturan itu, yang terjadi pada run verifikasi tanpa CLAUDE.md.
AIDive