Ulasan Claude Opus 5: Apakah Model Baru Anthropic Layak Dibeli?
Olivia Carter
Terakhir Diperbarui 29 Juli 2026
Ulasan Claude Opus 5: Apakah Model Baru Anthropic Layak Dibeli?
Telah diverifikasi kebenarannya pada 28 Juli 2026.
Kesimpulan singkat: Ulasan Claude Opus 5 ini menemukan model kelas atas yang menarik bagi para pengembang, alur kerja bisnis yang kompleks, serta pembeli yang menginginkan performa mendekati batas maksimal tanpa harus selalu membayar untuk Fable 5. Anthropic mengenakan biaya $5 per juta token masukan dan $25 per juta token keluaran, sementara model ini mendukung jendela konteks 1 juta token dan hingga 128.000 token keluaran dalam Messages API sinkron. Model ini bukanlah pilihan terbaik secara otomatis untuk obrolan sederhana, ringkasan singkat, atau permintaan bervolume tinggi dengan nilai rendah.
Alasan terkuatnya bersifat praktis, bukan sekadar pencitraan: Opus 5 memadukan kapasitas penalaran yang mumpuni dengan biaya operasional yang lebih terjangkau dibandingkan dengan kelas terdepan Anthropic. Dalam satu uji debugging yang kami lakukan, model ini berhasil menemukan bug pencocokan prefiks yang tepat, mengusulkan patch terkecil, menambahkan uji regresi yang terfokus, dan memberikan perintah verifikasi yang berhasil dijalankan secara lokal. Hal ini merupakan bukti yang berguna untuk tugas ini—bukan bukti bahwa model ini akan menang dalam setiap pekerjaan pemrograman.
Terbaik untuk: agen pemrograman, analisis konteks panjang, otomatisasi perusahaan, dan tim-tim yang kegagalan mahalnya membenarkan penerapan model premi. Lewati saja jika: Kecepatan dan biaya per unit lebih penting daripada kualitas penalaran pada tahap akhir.
Claude Opus 5 adalah model andalan Anthropic untuk penggunaan sehari-hari yang dirancang untuk pemrograman agen yang kompleks dan pekerjaan skala perusahaan. Anthropic mengumumkannya pada tanggal 24 Juli 2026, yang menggambarkannya sebagai model yang cermat, proaktif, dan lebih efisien daripada model-model lainnya. Model ini menggantikan Claude Opus 4.8, menjadi model bawaan pada Claude Max, dan menjadi model terkuat yang tersedia pada Claude Pro.
Anthropic mengumumkan Claude Opus 5 pada tanggal 24 Juli 2026 dan menyatakan bahwa produk tersebut sudah tersedia pada hari itu juga.
Strategi pemasaran produk ini terbilang tidak biasa untuk sebuah rilis Opus: produk ini tidak hanya diposisikan sebagai model dengan kecerdasan maksimal. Anthropic ingin produk ini digunakan setiap hari, dengan tingkat beban kerja yang dapat disesuaikan dan profil latensi yang moderat. Hal ini memudahkan penggunaannya untuk agen yang berjalan dalam waktu lama dan pekerjaan produksi yang rumit, sementara beban kerja yang lebih sederhana tetap dapat dialihkan ke model yang lebih cepat dan lebih murah.
Akses bergantung pada jalur yang digunakan. Pengguna umum dapat mengakses Opus 5 melalui paket Claude yang memenuhi syarat; sementara pengembang dapat mengaksesnya melalui API Claude dan platform cloud yang didukung. GlobalGPT juga memiliki halaman produk khusus. Pembaca yang ingin membandingkan tingkatan langganan Anthropic dapat menggunakan Perbandingan Paket Claude Free, Pro, dan Max sebelum memilih metode penagihan.
Claude Opus 5: Harga, API, dan Spesifikasi Utama
Pejabat Harga API Claude adalah $5 per juta token masukan dan $25 per juta token yang dihasilkan. Itu adalah tarif dasar API, bukan harga langganan konsumen Claude atau paket platform pihak ketiga. Penyimpanan sementara prompt dan pemrosesan batch memiliki tarif tersendiri, jadi bandingkan pola permintaan secara keseluruhan, bukan hanya dengan mengalikan harga dasar yang tercantum.
Lapangan
Claude Opus 5
Apa artinya
ID API Claude
claude-opus-5
Gunakan nilai model persis ini dalam permintaan API resmi Claude.
Harga dasar
$5 / MTok
Tingkat token masukan standar sebelum penerapan diskon penyimpanan dalam cache atau diskon batch.
Harga dasar penjualan
$25 / MTok
Agen yang menghasilkan banyak output bisa dengan cepat menjadi mahal.
Jendela konteks
1 juta token
Cocok untuk repositori dan koleksi dokumen berskala besar, tergantung pada kualitas permintaan dan strategi pencarian.
Output maksimum
128 ribu token
Berlaku untuk API Pesan sinkron; fitur Message Batches memiliki jalur beta terpisah dengan batas hingga 300 ribu.
Batas pengetahuan yang dapat diandalkan
Mei 2026
Menurut standar model saat ini, ini tergolong baru, tetapi tidak dapat menggantikan pengambilan data secara langsung.
Latensi komparatif
Sedang
Bukan model tercepat dari Anthropic; latensi masih bervariasi tergantung pada upaya, alat, dan beban kerja.
Platform Claude mengidentifikasi claude-opus-5 sebagai ID API dan alias Opus 5 saat ini.Platform Claude mencantumkan Opus 5 dengan nilai $5/$25 per juta token masukan/keluaran, dengan jendela konteks 1 juta token, keluaran maksimum 128 ribu token, dan batas waktu Mei 2026.Platform Claude mencantumkan jendela konteks 1M, keluaran maksimum 128k, dan batas waktu Mei 2026.
Untuk akses konsumen, Anthropic mencantumkan Claude Pro pada $20 per bulan atau $17 per bulan jika $200 ditagih secara tahunan; Claude Max dimulai dari $100 per bulan. Anthropic menyatakan bahwa Opus 5 adalah model terkuat di Pro dan menjadi default di Max, namun kuota paket dan fitur produk terpisah dari penggunaan API yang dibatasi.
Jika Anda memerlukan rincian biaya yang lebih lengkap, silakan lihat Panduan Rencana dan Harga API Claude AI memisahkan langganan konsumen, penagihan API, dan batas penggunaan. Perbedaan ini penting: “termasuk dalam paket” tidak berarti panggilan API tanpa batas, dan tarif API tidak menunjukkan seberapa besar akses obrolan konsumen yang Anda dapatkan.
Claude Opus 5 Hasil Uji Perbandingan
Batasan penting: Angka-angka di bawah ini adalah hasil pengujian yang dipublikasikan oleh Anthropic, bukan hasil pengukuran independen yang dilakukan khusus untuk ulasan ini. Data tersebut berguna untuk memahami posisi yang dimaksudkan Anthropic dalam hal kinerja dan biaya, namun tidak menjamin hasil yang sama pada prompt, alat, repositori, atau batas latensi Anda.
Evaluasi
Klaim yang dipublikasikan oleh Anthropic
Cara membacanya
Frontier-Bench v0.1
Opus 5 mampu melampaui Opus 4.8 lebih dari dua kali lipat dengan biaya per tugas yang lebih rendah.
Sebuah indikator kinerja agen yang luas, bukan peningkatan dua kali lipat yang berlaku secara universal.
CursorBench 3.2
Pada tingkat usaha maksimal, Opus 5 hanya terpaut 0,5% dari skor puncak Fable 5 dengan biaya per tugas yang setengahnya.
Kinerja ekonomi agen pengkodean yang kuat dalam pengaturan upaya yang telah diuji pada model Anthropic.
Zapier AutomationBench
Sekitar 1,5 kali lipat dari tingkat keberhasilan terbaik berikutnya dengan biaya per tugas yang sama.
Menjanjikan untuk otomatisasi bisnis secara menyeluruh; namun, perancangan alur kerja tetap penting.
OSWorld 2.0
Melampaui hasil terbaik Fable 5 dengan biaya yang hanya sedikit lebih dari sepertiga dari biaya tersebut.
Menunjukkan efisiensi penggunaan komputer yang mengesankan dalam pengujian ini.
Anthropic menyatakan bahwa Opus 5 mendekati skor puncak CursorBench 3.2 milik Fable 5 dengan selisih hanya 0,5%, dengan biaya per tugas yang hanya setengahnya.Anthropic melaporkan keunggulan tingkat kelulusan sebesar 1,5 kali lipat di Zapier AutomationBench serta keunggulan biaya di OSWorld 2.0.
Upaya merupakan bagian dari hasil. Anthropic menyatakan bahwa Opus 5 secara default menggunakan tingkat upaya tinggi dalam API Claude dan Kode Claude, sementara perbandingannya juga menggunakan pengaturan tinggi, xhigh, atau max. Upaya yang lebih tinggi dapat meningkatkan keberhasilan tugas yang sulit sekaligus meningkatkan jumlah token, latensi, atau keduanya. Oleh karena itu, biaya benchmark per tugas lebih informatif daripada harga per token saja—namun, tidak ada satu pun metrik tersebut yang dapat menggantikan uji coba pada beban kerja Anda sendiri.
Bagaimana Kami Menguji Claude Opus 5
Kami menjalankan satu tugas debugging akar masalah yang ringkas terhadap sebuah fixture CommonJS yang terdiri dari tiga berkas. Petunjuk tugas tersebut mensyaratkan agar model dapat mengidentifikasi akar masalah sebelum melakukan pengeditan, mengusulkan patch sesederhana mungkin, menambahkan uji regresi yang terfokus, menghindari perubahan yang tidak relevan, serta memberikan perintah verifikasi yang tepat.
Kami kemudian memeriksa patch tersebut secara mandiri, alih-alih langsung menganggap jawabannya benar hanya karena terdengar meyakinkan. Perintah lokalnya adalah node --test test/account-summary.test.cjs. Sebelum perbaikan, rangkaian uji tersebut menghasilkan satu hasil lulus dan satu hasil gagal. Setelah menerapkan tambalan kesetaraan eksak, rangkaian uji tersebut menghasilkan dua hasil lulus dan nol hasil gagal.
Metode ini memberikan wawasan yang berguna mengenai salah satu alur kerja debugging: diagnosis, kedisiplinan dalam membuat tambalan, kualitas uji regresi, dan keterverifikasi. Metode ini tidak mengukur kepemimpinan dalam pemrograman secara umum, keandalan agen dalam jangka panjang, kecepatan, atau kinerja lintas bahasa pemrograman.
Ulasan Praktis Claude Opus 5
Pencarian akar masalah: tepat, minimal, dan dapat diverifikasi
Dalam pengujian kami, Claude Opus 5 berhasil mengidentifikasi sumber masalah dengan tepat pada normalizedQuery.startsWith(account.id.toLowerCase()). Dengan kueri ACCT-10, pemeriksaan awalan cocok acct-1 pertama, jadi Array.prototype.find mengembalikan akun yang salah sebelum menemukan ID yang tepat.
Perbaikan yang diusulkan mengubah pencocokan awalan menjadi kesamaan persis dan menambahkan satu kasus regresi untuk teks yang diberi spasi tambahan dan menggunakan huruf besar-kecil campuran ACCT-10 input. Kode yang tidak terkait tidak diubah. Pengekangan tersebut penting dalam repositori nyata, di mana “pembersihan” yang terlalu luas dapat menimbulkan beban peninjauan yang lebih besar daripada bug aslinya.
Bagian yang paling menonjol adalah siklus lengkapnya: mengidentifikasi akar masalah, menjelaskan mengapa pengujian yang ada tidak mendeteksinya, melakukan perubahan sekecil mungkin, menambahkan pengujian regresi yang tepat, dan menyebutkan perintah untuk memverifikasinya. Hasilnya sejalan dengan posisi Opus 5 sebagai agen pemrograman, namun tetap hanya berupa satu fixture. Untuk panduan alur kerja yang lebih luas, lihat cara menggunakan Claude AI untuk pengkodean.
Petunjuk lengkap T1–T4, jawaban, dan kode yang dapat disalin
T1: Pemecahan masalah berdasarkan akar masalah
Lulus — menemukan cacat pencocokan awalan, mengusulkan tambalan terkecil, dan menambahkan uji regresi yang terfokus.
Mengidentifikasi ketidaksesuaian awalan sebagai penyebab masalah; Menjelaskan mengapa pengujian sebelumnya tidak mendeteksinya; Mengusulkan pengujian kesamaan eksak ditambah satu pengujian regresi.
Lihat soal dan jawaban T1 selengkapnya
Prompt lengkap
Anda sedang melakukan debugging pada sebuah fixture CommonJS yang sengaja dibuat kecil. Kerjakan hanya berdasarkan tiga berkas di bawah ini dan langkah reproduksi yang disebutkan.
Persyaratan:
1. Sebutkan akar masalahnya sebelum mengusulkan perubahan apa pun.
2. Usulkan patch terkecil yang memperbaiki bug tersebut.
3. Tambahkan satu tes regresi yang terfokus, yang gagal sebelum perbaikan dan lulus setelahnya.
4. Berikan perintah verifikasi yang tepat untuk dijalankan dari direktori akar fixture.
5. Jangan menulis ulang kode yang tidak terkait. Jangan mengganti nama berkas, menambahkan dependensi, atau mengubah API publik.
6. Sertakan bagian-bagian berikut secara tepat sesuai urutan: `ROOT CAUSE`, `PATCH`, `VERIFICATION`, `LIMITATIONS`.
7. Di bagian `PATCH`, berikan satu diff terpadu dalam blok `diff` yang diapit tag. Di bagian `VERIFICATION`, berikan satu perintah dalam blok `text` yang diapit tag.
Reproduksi: `summarizeAccount(accounts, ' ACCT-10 ')` seharusnya mengembalikan `{ id: 'acct-10', name: 'Nimbus', seats: 24 }`, tetapi justru mengembalikan akun `acct-1`.
Berkas: `src/find-account.cjs`
```js
function findAccount(accounts, query) {
const normalizedQuery = query.trim().toLowerCase();
return accounts.find((account) =>
normalizedQuery.startsWith(account.id.toLowerCase()),
);
}
module.exports = { findAccount };
```
Berkas: `src/account-summary.cjs`
```js
const { findAccount } = require('./find-account.cjs');
function summarizeAccount(accounts, requestedId) {
const account = findAccount(accounts, requestedId);
if (!account) return null;
return { id: account.id, name: account.name, seats: account.seats };
}
module.exports = { summarizeAccount };
```
Berkas: `test/account-summary.test.cjs`
```js
const test = require('node:test');
const assert = require('node:assert/strict');
const { summarizeAccount } = require('../src/account-summary.cjs');
const accounts = [
{ id: 'acct-1', name: 'Atlas', seats: 5 },
{ id: 'acct-10', name: 'Nimbus', seats: 24 },
];
test('merangkum ID akun yang tepat', () => {
assert.deepEqual(summarizeAccount(accounts, 'acct-1'), {
id: 'acct-1',
name: 'Atlas',
seats: 5,
});
});
```
Claude Opus 5
PENYEBAB UTAMA
findAccount mencocokkan berdasarkan awalan, bukan berdasarkan kesamaan:
Array.prototype.find mengembalikan elemen pertama yang memenuhi predikat tersebut. Untuk ‘ACCT-10‘, kueri yang dinormalisasi adalah ‘acct-10’, dan ID akun pertama ‘acct-1’ merupakan awalan dari kueri tersebut, sehingga startsWith bernilai true dan acct-1 menghentikan pencarian sebelum acct-10 sempat diuji. Normalisasi dengan trim().toLowerCase() sudah benar — spasi kosong dan huruf besar-kecil bukanlah masalahnya. Fungsi summarizeAccount hanya berfungsi sebagai perantara dan tidak menjadi penyebab masalah. Tes yang ada saat ini tidak dapat mendeteksi hal ini: ‘acct-1’ merupakan awalan dari dirinya sendiri dan merupakan elemen pertama, sehingga pencocokan awalan dan pencocokan persis tidak dapat dibedakan untuk masukan tersebut.
PATCH
diff
1--- a/src/find-account.cjs2+++ b/src/find-account.cjs3@@ -1,8 +1,8 @@4 function findAccount(accounts, query) {5 const normalizedQuery = query.trim().toLowerCase();6- return accounts.find((account) =>7- normalizedQuery.startsWith(account.id.toLowerCase()),8- );9+ return accounts.find(10+ (account) => account.id.toLowerCase() === normalizedQuery,11+ );12 }1314 module.exports = { findAccount };15--- a/test/account-summary.test.cjs16+++ b/test/account-summary.test.cjs17@@ -14,3 +14,11 @@18 test('summarizes an exact account ID', () => {19 seats: 5,20 });21 });22+23+test('matches the full ID rather than a prefix, with padding and mixed case', () => {24+ assert.deepEqual(summarizeAccount(accounts, ' ACCT-10 '), {25+ id: 'acct-10',26+ name: 'Nimbus',27+ seats: 24,28+ });29+});
--- a/src/find-account.cjs
+++ b/src/find-account.cjs
@@ -1,8 +1,8 @@
function findAccount(accounts, query) {
const normalizedQuery = query.trim().toLowerCase();
- return accounts.find((account) =>
- normalizedQuery.startsWith(account.id.toLowerCase()),
- );
+ return accounts.find(
+ (account) => account.id.toLowerCase() === normalizedQuery,
+ );
}
module.exports = { findAccount };
--- a/test/account-summary.test.cjs
+++ b/test/account-summary.test.cjs
@@ -14,3 +14,11 @@
test('merangkum ID akun yang tepat', () => {
seats: 5,
});
});
+
+test('cocok dengan ID lengkap, bukan hanya awalan, termasuk spasi tambahan dan huruf besar-kecil campuran', () => {
+ assert.deepEqual(summarizeAccount(accounts, ' ACCT-10 '), {
+ id: 'acct-10',
+ name: 'Nimbus',
+ seats: 24,
+ });
+});
Sebelum perbaikan, tes baru tersebut gagal saat menggunakan objek acct-1 / Atlas / 5; setelah perbaikan, tes tersebut berhasil.
VERIFIKASI
teks
1node --test test/account-summary.test.cjs
node --test test/account-summary.test.cjs
BATASAN
• Ruang lingkup: satu operator diubah. Tidak ada perubahan nama, tidak ada ketergantungan baru, serta tanda tangan dan tipe hasil dari `findAccount` dan `summarizeAccount` tetap sama. • Perilaku yang sudah ada sebelumnya dan tidak ditangani (di luar cakupan bug ini): • Nilai requestedId yang bukan string (null, angka) tetap akan memicu pengecualian saat dipanggil dengan metode .trim(). • ID akun itu sendiri tidak dipotong, sehingga nilai yang disimpan ‘acct-10’ tetap tidak akan cocok — hanya kueri yang dinormalisasi. • Casing menggunakan toLowerCase() biasa; tanpa normalisasi Unicode atau pengelompokan yang mempertimbangkan pengaturan wilayah. • ID yang duplikat tetap diarahkan ke hasil pencocokan pertama, dan waktu pencarian tetap O(n). • Cakupan pengujian: pengujian regresi tunggal ini secara tepat menargetkan reproduksi yang dilaporkan. Jalur yang tidak ditemukan (null) dan input yang tidak valid tetap belum diuji.
ROOT CAUSE
findAccount matches by prefix, not by equality:
```js
normalizedQuery.startsWith(account.id.toLowerCase())
```
Array.prototype.find returns the first element satisfying the predicate. For ' ACCT-10 ' the normalized query is 'acct-10', and the first account's ID 'acct-1' is a prefix of it, so startsWith is true and acct-1 short-circuits the search before acct-10 is ever tested.
The trim().toLowerCase() normalization is correct — whitespace and casing are not the problem. summarizeAccount is a pass-through and is not at fault.
The existing test cannot catch this: 'acct-1' is a prefix of itself and is the first element, so prefix matching and exact matching are indistinguishable for that input.
PATCH
```diff
--- a/src/find-account.cjs
+++ b/src/find-account.cjs
@@ -1,8 +1,8 @@
function findAccount(accounts, query) {
const normalizedQuery = query.trim().toLowerCase();
- return accounts.find((account) =>
- normalizedQuery.startsWith(account.id.toLowerCase()),
- );
+ return accounts.find(
+ (account) => account.id.toLowerCase() === normalizedQuery,
+ );
}
module.exports = { findAccount };
--- a/test/account-summary.test.cjs
+++ b/test/account-summary.test.cjs
@@ -14,3 +14,11 @@
test('summarizes an exact account ID', () => {
seats: 5,
});
});
+
+test('matches the full ID rather than a prefix, with padding and mixed case', () => {
+ assert.deepEqual(summarizeAccount(accounts, ' ACCT-10 '), {
+ id: 'acct-10',
+ name: 'Nimbus',
+ seats: 24,
+ });
+});
```
Before the fix the new test fails with the acct-1 / Atlas / 5 object; after the fix it passes.
VERIFICATION
```text
node --test test/account-summary.test.cjs
```
LIMITATIONS
• Scope: one operator changed. No renames, no new dependencies, and findAccount / summarizeAccount signatures and return shapes are unchanged.
• Pre-existing behavior left alone (out of scope for this bug):
• A non-string requestedId (null, a number) still throws on .trim().
• Account IDs themselves are not trimmed, so a stored ' acct-10' still will not match — only the query is normalized.
• Casing uses plain toLowerCase(); no Unicode normalization or locale-aware folding.
• Duplicate IDs still resolve to the first match, and lookup remains O(n).
• Test coverage: the single regression test targets exactly the reported reproduction. The not-found (null) path and malformed input remain untested.
T2: Analisis kesehatan akun
Sebagian — metrik inti telah dihitung dan tindakan-tindakan telah diprioritaskan, namun jawaban yang diberikan tidak disertai dengan penanda “Recheck” yang diminta.
MRR berisiko dihitung sebesar $34.800 (94.31%); E-505 telah ditingkatkan dan tindakan tindak lanjut telah diprioritaskan; Jawaban berakhir tanpa penanda "Recheck" yang diminta.
Lihat pertanyaan dan jawaban T2 selengkapnya
Prompt lengkap
Analisis berkas `account-health.csv` yang disediakan sebagai dataset tertutup. Jangan gunakan data eksternal dan jangan mengarang nilai yang hilang.
Aturan risiko (evaluasi masing-masing secara terpisah):
- `inactivity`: `days_since_login >= 30`
- `payment`: `failed_payments >= 2`
- `low_utilization`: `seats_used / seats_purchased = 80` sementara akun tersebut berstatus `berisiko`.
- `weak_health_without_risk`: `health_score = 9` dan `open_tickets >= 3`.
Persyaratan:
1. Hitung bendera risiko dan bendera kontradiksi yang terpicu untuk setiap akun.
2. Laporkan total dataset untuk akun, MRR, akun berisiko, MRR berisiko, akun yang perlu ditindaklanjuti, baris kontradiksi, kursi yang dibeli, dan kursi yang digunakan.
3. Buat tabel tindakan dengan tepat lima kolom: `Akun | Pemicu risiko | Kontradiksi | Prioritas | Tindakan yang direkomendasikan`.
4. Tempatkan nilai yang dihitung secara langsung di bawah judul `Fakta yang diukur` dan keputusan penilaian di bawah judul `Inferensi`.
5. Di bawah `Pemeriksaan Ulang`, tunjukkan perhitungan yang cukup untuk memeriksa ulang setiap total dan setiap batas ambang secara independen, termasuk kasus kesetaraan 0,50.
6. Jangan memperbaiki atau menafsirkan ulang aturan secara diam-diam. Jika suatu sinyal terasa bertentangan dengan intuisi, catatlah sebagai kontradiksi daripada mengubah klasifikasinya.
`account-health.csv`:
```csv
account_id,account_name,plan,mrr_usd,days_since_login,failed_payments,seats_purchased,seats_used,health_score,nps,open_tickets
A-101,Aster,Enterprise,12000,45,0,100,82,92,9,1
B-202,Beacon,Pro,4200,4,2,20,18,70,7,0
C-303,Cinder,Pro,3.600,12,0,20,8,65,10,4
D-404,Dahlia,Starter,900,5,0,5,4,42,6,0
E-505,Ember,Enterprise,15.000,65,3,200,70,35,3,6
F-606,Fjord,Starter,1.200,29,1,4,2,85,9,3
```
Claude Opus 5
Fakta yang terukur
Sumber: account-health.csv, 6 baris, dianggap telah ditutup. Tidak ada nilai yang diimputasi.
Penilaian aturan per akun
Akun hari ≥ 30 gagal ≥ 2 util <0,50 Jumlah risiko Status A-101 Aster ✅ 45 ❌ 0 ❌ 0,82 1 berisiko B-202 Beacon ❌ 4 ✅ 2 ❌ 0,90 1 berisiko C-303 Abu ❌ 12 ❌ 0 ✅ 0,40 1 berisiko D-404 Dahlia ❌ 5 ❌ 0 ❌ 0,80 0 tidak berisiko E-505 Ember ✅ 65 ✅ 3 ✅ 0,35 3 berisiko + ditindaklanjuti F-606 Fjord ❌ 29 ❌ 1 ❌ 0,50 0 tidak berisiko Tanda-tanda kontradiksi per akun Akun kesehatan_yang_kuat_dengan_risiko kesehatan_lemah_tanpa_risiko promotor_dengan_tiket_terisi A-101 Aster ✅ (92 ≥ 80, berisiko) ❌ ❌ (NPS 9 ✓, tiket 1 ✗) B-202 Beacon ❌ (70 < 80) ❌ (70 ≥ 50) ❌ (NPS 7) C-303 Abu ❌ (65 < 80) ❌ (65 ≥ 50) ✅ (NPS 10, tiket 4) D-404 Dahlia ❌ ✅ (42 < 50, tidak berisiko) ❌ (NPS 6) E-505 Ember ❌ (35 < 80) ❌ (35 < 50 tetapi termasuk dalam kelompok berisiko) ❌ (NPS 3) F-606 Fjord ❌ (85 ≥ 80 tetapi tidak termasuk dalam kelompok berisiko) ❌ (85 ≥ 50) ✅ (NPS 9, tiket 3) Jumlah total dataset Metrik Nilai Akun 6 Total MRR $36,900 Akun yang berisiko 4 (A-101, B-202, C-303, E-505) MRR yang Berisiko $34.800 (94,31% dari total) Meningkatkan status akun 1 (E-505) Baris-baris yang saling bertentangan 4 (A-101, C-303, D-404, F-606) Tanda-tanda kontradiksi 4 (1 sehat_dengan_risiko, 1 kurang_sehat_tanpa_risiko, 2 promotor_dengan_beban_tiket) Tiket yang telah dibeli 349 Kursi yang digunakan 184 Penarikan kesimpulan Urutan prioritas dan tindakan yang direkomendasikan di bawah ini merupakan keputusan berdasarkan pertimbangan, bukan hasil perhitungan berdasarkan aturan. Bobot peringkat saya mengutamakan status, kemudian MRR yang berisiko, lalu sinyal kontradiksi. Akun Pemicu risiko Kontradiksi Prioritas Tindakan yang disarankan E-505 Ember ketidakaktifan, pembayaran, tingkat pemanfaatan rendah - P0 Ketiga aturan tersebut berlaku untuk akun dengan nilai terbesar ($15.000 MRR). Perlakuan sebagai churn aktif: pulihkan metode pembayaran, lalu lakukan tinjauan eksekutif terhadap 130 kursi yang tidak terpakai. A-101 Aster ketidakaktifan kesehatan_yang_kuat_dengan_risiko P1 $12.000 MRR dengan periode tidak aktif selama 45 hari, meskipun skornya 92 dan tingkat pemanfaatan 82% dalam kondisi baik. Pastikan apakah jeda login tersebut merupakan penurunan keterlibatan yang sesungguhnya atau sekadar artefak pelacakan (SSO, penggunaan hanya melalui API) sebelum mengambil tindakan berdasarkan skor tersebut. C-303 Abu penggunaan rendah promotor_dengan_tiket_terisi P1 Promotor (NPS 10) yang menangani 4 tiket terbuka dengan tingkat pemanfaatan 40%. Beban tiket merupakan hambatan yang mungkin menghambat adopsi; selesaikan antrian terlebih dahulu, lalu dorong aktivasi kursi. B-202 Beacon pembayaran - P2 Kasus dengan penyebab tunggal yang jelas: 2 pembayaran gagal dengan riwayat login dalam 4 hari terakhir dan tingkat pemanfaatan 90%. Hanya perlu tindak lanjut penagihan, tidak diperlukan tindakan dari Layanan Pelanggan. F-606 Fjord - promotor_dengan_tiket_terisi P3 Posisi ini tepat berada di batas-batas yang ditetapkan (29 hari, 1 kali pembayaran gagal, tingkat pemanfaatan tepat 0,50). Berdasarkan aturan, posisi ini belum berisiko, tetapi satu hari lagi tanpa aktivitas atau satu kali pembayaran gagal lagi akan mengubah statusnya. Pantau dan selesaikan 3 tiket tersebut. D-404 Dahlia - kesehatan_lemah_tanpa_risiko P3 Skor 42 tanpa aturan yang terpicu dan tingkat pemanfaatan 80% pada MRR $900. Salah satu dari keduanya
Fakta yang terukur
Sumber: account-health.csv, 6 baris, dianggap tertutup. Tidak ada nilai yang diimputasi.
Evaluasi aturan per akun
Akun
hari ≥30
gagal ≥2
util <0,50
Jumlah risiko
Status
A-101 Aster
✅ 45
❌ 0
❌ 0,82
1
berisiko
B-202 Beacon
❌ 4
✅ 2
❌ 0,90
1
berisiko
C-303 Cinder
❌ 12
❌ 0
✅ 0,40
1
berisiko
D-404 Dahlia
❌ 5
❌ 0
❌ 0,80
0
tidak berisiko
E-505 Ember
✅ 65
✅ 3
✅ 0,35
3
berisiko + eskalasi
F-606 Fjord
❌ 29
❌ 1
❌ 0,50
0
tidak berisiko
Tanda kontradiksi per akun
Akun
kondisi_kuat_dengan_risiko
kondisi_lemah_tanpa_risiko
promotor_dengan_beban_tiket
A-101 Aster
✅ (92 ≥ 80, berisiko)
❌
❌ (nps 9 ✓, tiket 1 ✗)
B-202 Beacon
❌ (70 < 80)
❌ (70 ≥ 50)
❌ (NPS 7)
C-303 Cinder
❌ (65 < 80)
❌ (65 ≥ 50)
✅ (NPS 10, tiket 4)
D-404 Dahlia
❌
✅ (42 < 50, tidak berisiko)
❌ (nps 6)
E-505 Ember
❌ (35 < 80)
❌ (35 < 50 tetapi berisiko)
❌ (NPS 3)
F-606 Fjord
❌ (85 ≥ 80 tetapi tidak berisiko)
❌ (85 ≥ 50)
✅ (NPS 9, tiket 3)
Total dataset
Metrik
Nilai
Akun
6
Total MRR
$36.900
Akun berisiko
4 (A-101, B-202, C-303, E-505)
MRR berisiko
$34.800 (94,31% dari total)
Akun yang perlu ditindaklanjuti
1 (E-505)
Baris yang bertentangan
4 (A-101, C-303, D-404, F-606)
Tanda-tanda kontradiksi
4 (1 strong_health_with_risk, 1 weak_health_without_risk, 2 promoter_with_ticket_load)
Kursi yang dibeli
349
Kursi yang digunakan
184
Kesimpulan
Urutan prioritas dan tindakan yang direkomendasikan di bawah ini merupakan penilaian subjektif, bukan hasil dari aturan. Bobot peringkat saya mengutamakan status eskalasi terlebih dahulu, kemudian MRR berisiko, lalu sinyal kontradiksi.
Akun
Pemicu risiko
Kontradiksi
Prioritas
Tindakan yang direkomendasikan
E-505 Ember
ketidakaktifan, pembayaran, low_utilization
—
P0
Ketiga aturan tersebut terpicu pada akun terbesar ($15.000 MRR). Tangani sebagai churn aktif: pulihkan metode pembayaran, lalu lakukan tinjauan eksekutif terhadap 130 kursi yang tidak terpakai.
A-101 Aster
ketidakaktifan
kondisi_sehat_dengan_risiko
P1
$12.000 MRR dengan 45 hari tidak aktif meskipun skor 92 dan pemanfaatan yang sehat sebesar 82%. Verifikasi apakah jeda login tersebut merupakan ketidakterlibatan yang sesungguhnya atau sekadar artefak pelacakan (SSO, penggunaan hanya melalui API) sebelum mengambil tindakan berdasarkan skor tersebut.
C-303 Cinder
penggunaan_rendah
promotor_dengan_beban_tiket
P1
Promotor (NPS 10) yang memiliki 4 tiket terbuka dengan tingkat penggunaan 40%. Beban tiket tersebut kemungkinan menjadi penghambat adopsi; selesaikan antrian tiket, lalu dorong aktivasi kursi.
B-202 Beacon
pembayaran
—
P2
Kasus dengan penyebab tunggal yang jelas: 2 kegagalan pembayaran dengan riwayat login 4 hari dan tingkat pemanfaatan 90%. Hanya perlu tindak lanjut penagihan, tidak diperlukan tindakan CS.
F-606 Fjord
—
promoter_with_ticket_load
P3
Berada tepat di batas setiap kriteria (29 hari, 1 pembayaran gagal, tingkat pemanfaatan tepat 0,50). Tidak berisiko berdasarkan aturan, tetapi satu hari lagi tanpa aktivitas atau satu pembayaran gagal lagi akan mengubah statusnya. Pantau dan selesaikan 3 tiket tersebut.
D-404 Dahlia
—
weak_health_without_risk
P3
Skor 42 tanpa aturan yang terpicu dan tingkat pemanfaatan 80% pada MRR $900. Baik
T3: Pembuatan antarmuka pengguna yang responsif
Sebagian — menghasilkan implementasi mandiri yang panjang beserta pemeriksaan mandiri, sambil secara eksplisit mengakui bahwa halaman tersebut diperiksa, bukan dirender pada saat runtime.
Menghasilkan jawaban yang lengkap dan mandiri sebanyak 21.907 karakter; Mencakup versi desktop, seluler, tampilan saat melebihi batas layar, dan aksesibilitas; Secara eksplisit menyatakan bahwa tata letak tersebut telah diperiksa, bukan dirender pada saat runtime.
Lihat prompt dan jawaban T3 selengkapnya
Prompt lengkap
Buatlah antarmuka perbandingan produk yang rapi dalam bentuk satu berkas HTML yang dapat dijalankan, dengan hanya menggunakan data produk di bawah ini.
Persyaratan:
1. Kembalikan tepat satu blok kode `html` yang diapit tag, diikuti dengan bagian `SELF-CHECK`. Jangan pisahkan kode HTML, CSS, atau JavaScript ke dalam berkas terpisah.
2. Gunakan hanya HTML semantik, CSS tertanam, dan JavaScript vanilla tertanam: tanpa kerangka kerja eksternal, paket, font, gambar, permintaan jaringan, atau langkah kompilasi.
3. Sediakan tiga tab yang dapat diakses melalui keyboard (`Overview`, `Pricing`, `Limits`) dengan semantik `tablist`, `tab`, dan `tabpanel` yang benar. Tombol ArrowLeft/ArrowRight harus dapat memindahkan dan mengaktifkan tab; tombol Home/End harus dapat melompat ke dan mengaktifkan tab pertama/terakhir. Fokus harus tetap terlihat.
4. Tab yang dipilih harus tercermin melalui `aria-selected`, `tabindex`, dan panel yang terlihat; panel yang tidak aktif harus disembunyikan.
5. Target desktop: lebar 1440px. Target seluler: lebar 390px tanpa tumpahan halaman horizontal, tanpa kontrol yang terpotong, target ketukan setinggi minimal 44px, dan kartu perbandingan ditumpuk dalam satu kolom.
6. Sertakan header yang ringkas, rekomendasi yang jelas, tiga kartu produk, dan satu tabel perbandingan yang ringkas. Pertahankan kontras yang mudah dibaca dan hindari gerakan dekoratif.
7. Gunakan fakta produk persis seperti ini dan jangan tambahkan klaim:
- Atlas: `$19/bulan`, `20 proyek`, `10 GB`, `Dukungan email`, paling cocok untuk kerja mandiri.
- Beacon: `$49/bulan`, `Proyek tak terbatas`, `100 GB`, `Dukungan prioritas`, paling baik secara keseluruhan untuk tim yang sedang berkembang.
- Cove: `$99/bulan`, `Proyek tak terbatas`, `1 TB`, `Dukungan khusus`, paling cocok untuk operasi yang diatur.
8. Berikan label `Paling Cocok Secara Keseluruhan` yang terlihat pada Beacon tanpa membuat kartu lainnya tampak dinonaktifkan.
9. Di bagian `SELF-CHECK`, laporkan secara eksplisit pemeriksaan Anda terhadap tab semantik, perilaku keyboard, tata letak 1440px, tata letak 390px, overflow horizontal, dan ketergantungan eksternal. Jangan mengklaim bahwa Anda benar-benar merender viewport kecuali Anda memang melakukannya; bedakan antara inspeksi kode dan verifikasi saat runtime.
Fixture produk (juga disimpan sebagai `fixtures/T3-responsive-ui/product-data.json`):
```json
{
"products": [
{"name":"Atlas","price":"$19/mo","projects":"20 proyek","storage":"10 GB","support":"Dukungan email","bestFor":"pekerjaan mandiri"},
{"name":"Beacon","price":"$49/bulan","projects":"Proyek tak terbatas","storage":"100 GB","support":"Dukungan prioritas","bestFor":"tim yang sedang berkembang","badge":"Terbaik secara keseluruhan"},
{"name":"Cove","price":"$99/bulan","projects":"Proyek tak terbatas","penyimpanan":"1 TB","dukungan":"Dukungan khusus","cocokUntuk":"operasi yang diatur"}
]
}
```
Semua pernyataan di bawah ini hanya didasarkan pada pemeriksaan kode. Saya tidak membuka peramban, menampilkan tampilan jendela tampilan, menjalankan pembaca layar, atau menjalankan penangan keyboard, sehingga tidak ada yang terverifikasi pada saat runtime. Apabila suatu pernyataan bergantung pada perilaku mesin tata letak, saya akan menyebutkannya. Tab semantik — telah diperiksa, konsisten Satu elemen div[role="tablist"] dengan atribut aria-label="Tampilan perbandingan paket" berisi tiga elemen button[type="button"][role="tab"]. Setiap tab memiliki id unik dan atribut `aria-controls` yang mengarah ke sebuah `section`[role="tabpanel"]; setiap panel memiliki atribut `aria-labelledby` yang mengarah kembali ke tabnya. Saya menelusuri ketiga pasangan tersebut secara manual: `tab-overview`/`panel-overview`, `tab-pricing`/`panel-pricing`, `tab-limits`/`panel-limits`. Tidak ada ID yang duplikat, tidak ada referensi yang terputus. Panel menggunakan `tabindex="0"` sehingga isi panel dapat diakses setelah tab. Perilaku keyboard — diperiksa, tidak dijalankan Sebuah pendengar keydown tunggal pada tablist menangani tombol Panah Kanan, Panah Kiri, Home, dan End, memanggil event.preventDefault() hanya untuk keempat tombol tersebut, dan keluar lebih awal jika tidak. Tombol panah akan melingkar di kedua ujungnya. Karena metode `activate()` memperbarui atribut `aria-selected`, `tabindex`, dan `hidden` sekaligus memindahkan fokus, tombol panah serta tombol Home dan End memindahkan fokus dan mengaktifkan elemen dalam satu langkah, yang merupakan pola aktivasi otomatis yang diminta oleh persyaratan. Penjelajahan Tab/Shift+Tab bergantung pada tabindex yang bergilir: tepat satu tab memiliki tabindex="0", sisanya -1, yang dikelola oleh fungsi activate(). Visibilitas fokus berasal dari aturan global :focus-visible dengan garis tepi 3px dan offset 2px; saya tidak mengganti atau menghapus garis tepi default apa pun. Saya belum menguji penanganan tombol di browser yang sebenarnya. Refleksi keadaan terpilih — telah diperiksa Fungsi `activate()` menetapkan ketiga atribut tersebut dalam satu siklus yang sama, sehingga `aria-selected="true"`, `tabindex="0"`, dan tidak adanya atribut `hidden` tidak akan terpisah satu sama lain. Panel yang tidak aktif diberi atribut `hidden`, dan [hidden] { display: none !important; } mencegah aturan tampilan yang sebaliknya akan mengabaikannya — perlindungan ini penting karena panel-panel tersebut berisi elemen anak dengan `display: grid`. `activate(currentIndex(), false)` dijalankan saat halaman dimuat untuk menormalkan status dari markup tanpa mencuri fokus. Jika JavaScript tidak berjalan, markup akan dimuat dengan panel "Overview" dalam keadaan terpilih dan dua panel lainnya tersembunyi, sehingga halaman akan beralih ke tampilan dengan satu panel yang dapat dibaca. Tata letak 1440px — telah diperiksa, belum ditampilkan .wrap memiliki lebar maksimum 1120px dengan margin: 0 auto, sehingga pada lebar 1440px, konten akan ditempatkan di tengah dengan celah antar kolom sekitar 160px, bukan melebar. Kartu menggunakan `grid-template-columns: repeat(3, minmax(0, 1fr))` dengan celah 20px, sehingga menghasilkan tiga kolom yang sama lebar; `align-items: start` mencegah kartu meregang hingga mencapai tinggi yang sama, sementara `.card { height: 100% }` dinetralkan oleh pengaturan tersebut. Penggunaan `minmax(0, 1fr)` dilakukan dengan sengaja — `1fr` saja dapat menolak untuk menyusut di bawah lebar konten dan menyebabkan grid melebar. Saya tidak mengukur output piksel yang sebenarnya. Tata letak 390px — telah diperiksa, belum ditampilkan Blok dengan `max-width: 720px` mengubah tata letak kisi kartu menjadi `minmax(0, 1fr)`, yaitu satu kolom, sehingga kartu-kartu tersebut ditumpuk. Padding berkurang menjadi 16px per sisi, sehingga lebar konten yang tersisa sekitar 358px. Target ketukan: setiap [role="tab"] memiliki `min-height: 44px`, dan padding horizontal menyusut menjadi 12px alih-alih tinggi yang menyusut, sehingga batas bawah 44px tetap terjaga pada lebar yang sempit. Daftar tab menjadi `flex-wrap: nowrap` dengan `overflow-x: auto` dan anak elemen `flex: 1 0 auto`, sehingga tiga tab akan muat atau dapat digulir di dalam daftar tab itu sendiri, bukan terpotong atau terbungkus di tengah kontrol. ada. Belum diverifikasi pada viewport 390px yang sebenarnya. Luapan horizontal — telah diperiksa, satu guliran yang disengaja dan terkendali body { overflow-x: hidden } berfungsi sebagai pengaman, tetapi saya juga berusaha untuk tidak bergantung padanya. * { box-sizing: border-box } memastikan padding tetap berada di dalam lebar yang ditentukan. Tabel perbandingan menggunakan `white-space: nowrap` pada sel-selnya, sehingga tabel Overview dengan enam kolom akan melebihi 358px di perangkat seluler; hal ini dikendalikan oleh `.table-scroll { max-width: 100%; overflow-x: auto }`, yang membuat area tabel dapat digulir alih-alih halaman. Wrapper tersebut memiliki `tabindex="0"` dan `role="region"` beserta label sehingga pengguna keyboard dapat mengakses dan menggulirkannya. Elemen anak flex dan grid yang seharusnya menolak untuk menyusut ditangani dengan `minmax(0, 1fr)` pada grid serta `flex-wrap: wrap` pada `.card-head` dan `.recommendation`. Satu risiko yang tersisa yang tidak dapat saya singkirkan tanpa melakukan rendering adalah adanya string panjang yang tidak terputus di dalam sel tabel, tetapi semua nilai fixture bersifat pendek. Ketergantungan eksternal — telah diperiksa, tidak ada Tidak. <link>, <script src>, <img>, @import, url(), fetch, XMLHttpRequest, web font, or CDN reference. Fonts are a system-ui stack. The badge and featured border are CSS only, no icon assets. Everything is inline in one file, so it runs from file:// with no build step. Kontras dan gerakan — telah diperiksa Teks utama #16191f pada latar belakang #f6f7f9 dan teks sekunder #4a515c pada latar belakang putih keduanya memiliki rasio kontras yang jauh melebihi 4,5:1; lambang berwarna putih pada #10457e, dan tab aktif berwarna #10457e pada latar belakang putih. Saya menghitung ini berdasarkan perkiraan rasio dari nilai heksadesimal, bukan dengan alat kontras. Tidak ada transisi, animasi, atau transformasi di mana pun; blok `prefers-reduced-motion` hanyalah jaring pengaman yang tidak berdampak (no-op) daripada perbaikan untuk gerakan yang sudah ada. Ketepatan jadwal pertandingan — telah diperiksa Ketiga paket tersebut tercantum di ketiga panel serta pada tabel masing-masing panel. Saya telah mencocokkan setiap harga, jumlah proyek, kapasitas penyimpanan, dan tingkatan dukungan dengan berkas JSON: Atlas 19 / 20 𝑝 𝑟 𝑜 𝑗 𝑒 𝑐 𝑡 𝑠 / 10 𝐺 𝐵 / 𝐸 𝑚 𝑎 𝑖 𝑙 , 𝐵 𝑒 𝑎 𝑐 𝑜 𝑛 49/Tanpa Batas/100 GB/Prioritas, Cove $99/Tanpa Batas/1 TB/Dedikasi. Beacon menampilkan lencana "Terbaik secara keseluruhan" dan garis tepi aksen 2px; Atlas dan Cove mempertahankan teks dengan opasitas penuh, garis tepi normal, dan perlakuan tipografi yang identik, sehingga terlihat sebagai produk yang tersedia, bukan dinonaktifkan. Nilai "Terbaik untuk" ditampilkan sebagai label singkat ("Terbaik untuk pekerjaan solo") — kata-kata ditambahkan di sekitar nilai produk, tanpa klaim produk baru. Kesenjangan yang telah diketahui Tidak ada verifikasi saat runtime dalam bentuk apa pun. Isi panel disalin ke ketiga panel sebagai markup statis, bukan dirender dari JSON; oleh karena itu, fixture menjadi sumber kebenaran melalui transkripsi, bukan melalui pengikatan — perubahan data di masa mendatang berarti harus mengedit beberapa bagian.
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Compare plans — Atlas, Beacon, Cove</title>
<style>
:root
{
--bg: #f6f7f9
;
--surface: #ffffff
;
--ink: #16191f
;
--ink-soft: #4a515c
;
--line: #d3d8df
;
--line-strong: #b6bdc7
;
--accent: #10457e
;
--accent-soft: #e8f0f9
;
--focus: #0b2f56
;
--radius: 10px
;
}
* {
box-sizing
: border-box; }
html { -webkit-text-size-adjust: 100%
; }
body
{
margin: 0
;
padding: 0
;
background: var
(--bg);
color: var
(--ink);
font-family: system-ui, -apple-system, "Segoe UI"
, Roboto, Helvetica, Arial, sans-serif;
font-size: 16px
;
line-height: 1.5
;
overflow-x
: hidden;
}
.wrap
{
width: 100%
;
max-width: 1120px
;
margin: 0
auto;
padding: 32px 24px 64px
;
}
/* ---------- Header ---------- */
.page-header { margin-bottom: 24px
; }
.page-header h1
{
margin: 0 0 8px
;
font-size: 1.75rem
;
line-height: 1.25
;
letter-spacing: -0.01em
;
}
.page-header p
{
margin: 0
;
max-width: 60ch
;
color: var
(--ink-soft);
}
/* ---------- Recommendation ---------- */
.recommendation
{
display
: flex;
flex-wrap
: wrap;
gap: 4px 10px
;
align-items
: baseline;
margin: 0 0 28px
;
padding: 14px 16px
;
background: var
(--accent-soft);
border: 1px solid #c2d5e8
;
border-left: 4px solid var
(--accent);
border-radius: var
(--radius);
}
.recommendation strong { color: var
(--accent); }
.recommendation span { color: #23405e
; }
/* ---------- Tabs ---------- */
.tabs
{
display
: flex;
flex-wrap
: wrap;
gap: 8px
;
margin: 0 0 20px
;
padding: 0
;
border-bottom: 1px solid var
(--line);
}
[role="tab"]
{
appearance
: none;
min-height: 44px
;
padding: 10px 18px
;
font
: inherit;
font-weight: 600
;
color: var
(--ink-soft);
background
: transparent;
border: 1px
solid transparent;
border-bottom: 3px
solid transparent;
border-radius: 8px 8px 0 0
;
cursor
: pointer;
}
[role="tab"]:hover { color: var(--ink); background: #eceff3
; }
[role="tab"][aria-selected="true"]
{
color: var
(--accent);
background: var
(--surface);
border-color: var(--line) var(--line) var
(--accent);
border-bottom-width: 3px
;
}
:focus-visible
{
outline: 3px solid var
(--focus);
outline-offset: 2px
;
}
[role="tabpanel"] { outline
: none; }
[role="tabpanel"]:focus-visible
{
outline: 3px solid var
(--focus);
outline-offset: 4px
;
border-radius: var
(--radius);
}
[hidden] { display: none !important
; }
.panel-intro
{
margin: 0 0 20px
;
max-width: 62ch
;
color: var
(--ink-soft);
}
/* ---------- Cards ---------- */
.card-grid
{
display
: grid;
grid-template-columns: repeat(3, minmax(0, 1
fr));
gap: 20px
;
margin: 0
;
padding: 0
;
list-style
: none;
align-items
: start;
}
.card
{
display
: flex;
flex-direction
: column;
height: 100%
;
padding: 20px
;
background: var
(--surface);
border: 1px solid var
(--line);
border-radius: var
(--radius);
}
.card.is-featured
{
border-color: var
(--accent);
border-width: 2px
;
padding: 19px
;
}
.card-head
{
display
: flex;
flex-wrap
: wrap;
gap: 8px
;
align-items
: center;
justify-content
: space-between;
margin-bottom: 4px
;
}
.card h3
{
margin: 0
;
font-size: 1.2rem
;
}
.badge
{
padding: 3px 10px
;
font-size: 0.75rem
;
font-weight: 700
;
letter-spacing: 0.02em
;
text-transform
: uppercase;
color: #ffffff
;
background: var
(--accent);
border-radius: 999px
;
white-space
: nowrap;
}
.price
{
margin: 8px 0 2px
;
font-size: 1.6rem
;
font-weight: 700
;
letter-spacing: -0.02em
;
}
.best-for
{
margin: 0 0 14px
;
font-size: 0.9375rem
;
color: var
(--ink-soft);
}
.spec-list
{
margin: 0
;
padding: 14px 0 0
;
border-top: 1px solid var
(--line);
font-size: 0.9375rem
;
}
.spec-list div
{
display
: flex;
gap: 12px
;
justify-content
: space-between;
padding: 5px 0
;
}
.spec-list dt { color: var
(--ink-soft); }
.spec-list dd
{
margin: 0
;
font-weight: 600
;
text-align
: right;
}
/* ---------- Table ---------- */
.table-section { margin-top: 36px
; }
.table-section h2
{
margin: 0 0 12px
;
font-size: 1.125rem
;
}
.table-scroll
{
max-width: 100%
;
overflow-x
: auto;
background: var
(--surface);
border: 1px solid var
(--line);
border-radius: var
(--radius);
}
table
{
width: 100%
;
border-collapse
: collapse;
font-size: 0.9375rem
;
}
caption
{
padding: 12px 14px
;
text-align
: left;
color: var
(--ink-soft);
font-size: 0.875rem
;
}
th, td
{
padding: 10px 14px
;
text-align
: left;
border-top: 1px solid var
(--line);
white-space
: nowrap;
}
thead th
{
background: #eef1f5
;
border-top
: none;
font-weight: 700
;
}
tbody th { font-weight: 600; color: var
(--ink-soft); }
th[scope="col"].is-featured { color: var
(--accent); }
/* ---------- Mobile ---------- */
@media (max-width: 720px
) {
.wrap { padding: 20px 16px 48px
; }
.page-header h1 { font-size: 1.4rem
; }
.tabs
{
gap: 4px
;
overflow-x
: auto;
-webkit-
overflow
-scrolling: touch;
flex-wrap
: nowrap;
}
[role="tab"]
{
flex: 1 0
auto;
padding: 10px 12px
;
font-size: 0.9375rem
;
}
.card-grid { grid-template-columns: minmax(0, 1
fr); }
th, td { padding: 10px 12px
; }
}
@media (prefers-reduced-motion
: reduce) {
* {
transition: none !important; animation: none !important
; }
}
</style>
</head>
<body>
<main class="wrap">
<header class="page-header">
<h1>Compare plans</h1>
<p>Three plans across projects, storage, and support. Pick a tab to focus on the details that matter to you.</p>
</header>
<p class="recommendation">
<strong>Recommended: Beacon</strong>
<span>Best overall for growing teams — $49/mo, unlimited projects, 100 GB, priority support.</span>
</p>
<div class="tabs" role="tablist" aria-label="Plan comparison views">
<button type="button" role="tab" id="tab-overview" aria-controls="panel-overview" aria-selected="true" tabindex="0">Overview</button>
<button type="button" role="tab" id="tab-pricing" aria-controls="panel-pricing" aria-selected="false" tabindex="-1">Pricing</button>
<button type="button" role="tab" id="tab-limits" aria-controls="panel-limits" aria-selected="false" tabindex="-1">Limits</button>
</div>
<!-- Overview -->
<section role="tabpanel" id="panel-overview" aria-labelledby="tab-overview" tabindex="0">
<p class="panel-intro">Every plan side by side, with the full set of published facts for each one.</p>
<ul class="card-grid">
<li class="card">
<div class="card-head"><h3>Atlas</h3></div>
<p class="price">$19/mo</p>
<p class="best-for">Best for solo work</p>
<dl class="spec-list">
<div><dt>Projects</dt><dd>20 projects</dd></div>
<div><dt>Storage</dt><dd>10 GB</dd></div>
<div><dt>Support</dt><dd>Email support</dd></div>
</dl>
</li>
<li class="card is-featured">
<div class="card-head">
<h3>Beacon</h3>
<span class="badge">Best overall</span>
</div>
<p class="price">$49/mo</p>
<p class="best-for">Best overall for growing teams</p>
<dl class="spec-list">
<div><dt>Projects</dt><dd>Unlimited projects</dd></div>
<div><dt>Storage</dt><dd>100 GB</dd></div>
<div><dt>Support</dt><dd>Priority support</dd></div>
</dl>
</li>
<li class="card">
<div class="card-head"><h3>Cove</h3></div>
<p class="price">$99/mo</p>
<p class="best-for">Best for regulated operations</p>
<dl class="spec-list">
<div><dt>Projects</dt><dd>Unlimited projects</dd></div>
<div><dt>Storage</dt><dd>1 TB</dd></div>
<div><dt>Support</dt><dd>Dedicated support</dd></div>
</dl>
</li>
</ul>
<section class="table-section">
<h2>All plans at a glance</h2>
<div class="table-scroll" tabindex="0" role="region" aria-label="Full plan comparison table, scrollable">
<table>
<caption>Published facts for Atlas, Beacon, and Cove.</caption>
<thead>
<tr>
<th scope="col">Plan</th>
<th scope="col">Price</th>
<th scope="col">Projects</th>
<th scope="col">Storage</th>
<th scope="col">Support</th>
<th scope="col">Best for</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Atlas</th>
<td>$19/mo</td><td>20 projects</td><td>10 GB</td><td>Email support</td><td>Solo work</td>
</tr>
<tr>
<th scope="row">Beacon</th>
<td>$49/mo</td><td>Unlimited projects</td><td>100 GB</td><td>Priority support</td><td>Growing teams</td>
</tr>
<tr>
<th scope="row">Cove</th>
<td>$99/mo</td><td>Unlimited projects</td><td>1 TB</td><td>Dedicated support</td><td>Regulated operations</td>
</tr>
</tbody>
</table>
</div>
</section>
</section>
<!-- Pricing -->
<section role="tabpanel" id="panel-pricing" aria-labelledby="tab-pricing" tabindex="0" hidden>
<p class="panel-intro">Monthly price and the audience each plan is built for.</p>
<ul class="card-grid">
<li class="card">
<div class="card-head"><h3>Atlas</h3></div>
<p class="price">$19/mo</p>
<p class="best-for">Best for solo work</p>
<dl class="spec-list">
<div><dt>Support</dt><dd>Email support</dd></div>
</dl>
</li>
<li class="card is-featured">
<div class="card-head">
<h3>Beacon</h3>
<span class="badge">Best overall</span>
</div>
<p class="price">$49/mo</p>
<p class="best-for">Best overall for growing teams</p>
<dl class="spec-list">
<div><dt>Support</dt><dd>Priority support</dd></div>
</dl>
</li>
<li class="card">
<div class="card-head"><h3>Cove</h3></div>
<p class="price">$99/mo</p>
<p class="best-for">Best for regulated operations</p>
<dl class="spec-list">
<div><dt>Support</dt><dd>Dedicated support</dd></div>
</dl>
</li>
</ul>
<section class="table-section">
<h2>Price and support</h2>
<div class="table-scroll" tabindex="0" role="region" aria-label="Pricing comparison table, scrollable">
<table>
<caption>Monthly price, support tier, and intended fit.</caption>
<thead>
<tr>
<th scope="col">Plan</th>
<th scope="col">Price</th>
<th scope="col">Support</th>
<th scope="col">Best for</th>
</tr>
</thead>
<tbody>
<tr><th scope="row">Atlas</th><td>$19/mo</td><td>Email support</td><td>Solo work</td></tr>
<tr><th scope="row">Beacon</th><td>$49/mo</td><td>Priority support</td><td>Growing teams</td></tr>
<tr><th scope="row">Cove</th><td>$99/mo</td><td>Dedicated support</td><td>Regulated operations</td></tr>
</tbody>
</table>
</div>
</section>
</section>
<!-- Limits -->
<section role="tabpanel" id="panel-limits" aria-labelledby="tab-limits" tabindex="0" hidden>
<p class="panel-intro">Project counts and storage allowances for each plan.</p>
<ul class="card-grid">
<li class="card">
<div class="card-head"><h3>Atlas</h3></div>
<p class="price">$19/mo</p>
<p class="best-for">Best for solo work</p>
<dl class="spec-list">
<div><dt>Projects</dt><dd>20 projects</dd></div>
<div><dt>Storage</dt><dd>10 GB</dd></div>
</dl>
</li>
<li class="card is-featured">
<div class="card-head">
<h3>Beacon</h3>
<span class="badge">Best overall</span>
</div>
<p class="price">$49/mo</p>
<p class="best-for">Best overall for growing teams</p>
<dl class="spec-list">
<div><dt>Projects</dt><dd>Unlimited projects</dd></div>
<div><dt>Storage</dt><dd>100 GB</dd></div>
</dl>
</li>
<li class="card">
<div class="card-head"><h3>Cove</h3></div>
<p class="price">$99/mo</p>
<p class="best-for">Best for regulated operations</p>
<dl class="spec-list">
<div><dt>Projects</dt><dd>Unlimited projects</dd></div>
<div><dt>Storage</dt><dd>1 TB</dd></div>
</dl>
</li>
</ul>
<section class="table-section">
<h2>Projects and storage</h2>
<div class="table-scroll" tabindex="0" role="region" aria-label="Limits comparison table, scrollable">
<table>
<caption>Project allowance and storage per plan.</caption>
<thead>
<tr>
<th scope="col">Plan</th>
<th scope="col">Projects</th>
<th scope="col">Storage</th>
</tr>
</thead>
<tbody>
<tr><th scope="row">Atlas</th><td>20 projects</td><td>10 GB</td></tr>
<tr><th scope="row">Beacon</th><td>Unlimited projects</td><td>100 GB</td></tr>
<tr><th scope="row">Cove</th><td>Unlimited projects</td><td>1 TB</td></tr>
</tbody>
</table>
</div>
</section>
</section>
</main>
<script>
(
function (
) {
'use strict'
;
var tablist = document.querySelector('[role="tablist"]'
);
if (!tablist) return
;
var tabs = Array.prototype.slice.call(tablist.querySelectorAll('[role="tab"]'
));
function panelFor(tab
) {
return document.getElementById(tab.getAttribute('aria-controls'
));
}
function activate(index, moveFocus
) {
if (index < 0 || index >= tabs.length) return
;
tabs.
forEach(function (tab, i
) {
var
selected = i === index;
var panel = panelFor
(tab);
tab.
setAttribute('aria-selected', selected ? 'true' : 'false'
);
tab.
setAttribute('tabindex', selected ? '0' : '-1'
);
if
(panel) {
if
(selected) {
panel.
removeAttribute('hidden'
);
}
else
{
panel.
setAttribute('hidden', ''
);
}
}
});
if (moveFocus !== false) tabs[index].focus
();
}
function currentIndex(
) {
var i = tabs.findIndex(function (tab
) {
return tab.getAttribute('aria-selected') === 'true'
;
});
return i === -1 ? 0
: i;
}
tabs.
forEach(function (tab, i
) {
tab.
addEventListener('click', function (
) {
activate
(i);
});
});
tablist.
addEventListener('keydown', function (event
) {
var last = tabs.length - 1
;
var i = currentIndex
();
var next = null
;
switch (event.key
) {
case 'ArrowRight'
:
next = i === last ?
0 : i + 1
;
break
;
case 'ArrowLeft'
:
next = i ===
0 ? last : i - 1
;
break
;
case 'Home'
:
next =
0
;
break
;
case 'End'
:
next = last;
break
;
default
:
return
;
}
event.
preventDefault
();
activate
(next);
});
// Normalize initial state from markup.
activate(currentIndex(), false
);
}());
</script>
</body>
</html>
```
SELF-CHECK
All statements below come from code inspection only. I did not open a browser, render a viewport, run a screen reader, or execute the keyboard handlers, so nothing here is runtime-verified. Where a claim depends on layout engine behavior, I say so.
Semantic tabs — inspected, consistent
One div[role="tablist"] with aria-label="Plan comparison views" holds three button[type="button"][role="tab"]. Each tab has a unique id and an aria-controls pointing at a section[role="tabpanel"]; each panel carries aria-labelledby pointing back at its tab. I traced all three pairs by hand: tab-overview/panel-overview, tab-pricing/panel-pricing, tab-limits/panel-limits. No duplicate IDs, no dangling references. Panels use tabindex="0" so the panel body is reachable after the tab.
Keyboard behavior — inspected, not executed
A single keydown listener on the tablist handles ArrowRight, ArrowLeft, Home, and End, calls event.preventDefault() for those four keys only, and returns early otherwise. Arrow keys wrap at both ends. Because activate() both updates aria-selected/tabindex/hidden and moves focus, arrow and Home/End keys move andactivate in one step, which is the automatic-activation pattern the requirement asks for. Tab/Shift+Tab traversal relies on roving tabindex: exactly one tab is tabindex="0", the rest -1, maintained by activate(). Focus visibility comes from a global :focus-visible rule with a 3px outline and 2px offset; I did not override or remove any default outline. I have not confirmed key handling in a real browser.
Selected-state reflection — inspected
activate() sets all three signals in the same loop, so aria-selected="true", tabindex="0", and the absence of hidden cannot drift apart. Inactive panels get the hidden attribute, and [hidden] { display: none !important; } guards against the display rules that would otherwise defeat it — that guard matters because the panels contain display: grid children. activate(currentIndex(), false) runs on load to normalize state from markup without stealing focus. If JavaScript does not run, the markup ships with Overview selected and the other two panels hidden, so the page degrades to one readable panel.
1440px layout — inspected, not rendered
.wrap is max-width: 1120px with margin: 0 auto, so at 1440px the content centers with roughly 160px gutters rather than stretching. Cards use grid-template-columns: repeat(3, minmax(0, 1fr)) with a 20px gap, giving three equal columns; align-items: start keeps cards from stretching to a shared height while .card { height: 100% } is neutralized by that. The minmax(0, 1fr) is deliberate — 1fralone can refuse to shrink below content width and push a grid wide. I did not measure actual pixel output.
390px layout — inspected, not rendered
The max-width: 720px block switches the card grid to minmax(0, 1fr), a single column, so cards stack. Padding drops to 16px per side, leaving about 358px of content width. Tap targets: every [role="tab"] has min-height: 44px, and horizontal padding shrinks to 12px rather than the height shrinking, so the 44px floor holds at narrow widths. The tablist becomes flex-wrap: nowrap with overflow-x: auto and flex: 1 0 auto children, so three tabs either fit or scroll within the tablist itself instead of being clipped or wrapped mid-control. <meta name="viewport" content="width=device-width, initial-scale=1"> is present. Not verified at an actual 390px viewport.
Horizontal overflow — inspected, one intentional contained scroll
body { overflow-x: hidden } is the backstop, but I also tried not to rely on it. * { box-sizing: border-box } keeps padding inside declared widths. The comparison tables use white-space: nowrap on cells, so the six-column Overview table will exceed 358px on mobile; that is contained by .table-scroll { max-width: 100%; overflow-x: auto }, which scrolls the table region rather than the page. That wrapper has tabindex="0" and role="region" with a label so keyboard users can reach and scroll it. Flex and grid children that could otherwise refuse to shrink are handled with minmax(0, 1fr) on the grid and flex-wrap: wrap on .card-head and .recommendation. The one remaining risk I cannot rule out without rendering is a long unbroken string in a table cell, but all fixture values are short.
External dependencies — inspected, none
No <link>, <script src>, <img>, @import, url(), fetch, XMLHttpRequest, web font, or CDN reference. Fonts are a system-ui stack. The badge and featured border are CSS only, no icon assets. Everything is inline in one file, so it runs from file:// with no build step.
Contrast and motion — inspected
Body text #16191f on #f6f7f9 and secondary #4a515c on white are both well clear of 4.5:1; the badge is white on #10457e, and the active tab is #10457e on white. I computed these by ratio estimate from the hex values, not with a contrast tool. There are no transitions, animations, or transforms anywhere; the prefers-reduced-motion block is a no-op safety net rather than a fix for existing motion.
Fixture fidelity — inspected
Each of the three plans appears in all three panels plus each panel's table. I cross-checked every price, project count, storage figure, and support tier against the JSON: Atlas
19
/
20
𝑝
𝑟
𝑜
𝑗
𝑒
𝑐
𝑡
𝑠
/
10
𝐺
𝐵
/
𝐸
𝑚
𝑎
𝑖
𝑙
,
𝐵
𝑒
𝑎
𝑐
𝑜
𝑛
49/Unlimited/100 GB/Priority, Cove $99/Unlimited/1 TB/Dedicated. Beacon carries the Best overall badge and a 2px accent border; Atlas and Cove keep full-opacity text, normal borders, and identical type treatment, so they read as available rather than disabled. The best for values are rendered as short labels ("Best for solo work") — wording added around the fixture value, no new product claims.
Known gaps
No runtime verification of any kind. Panel content is duplicated across the three panels as static markup rather than rendered from the JSON, so the fixture is the source of truth by transcription, not by binding — a future data change means editing several places.
T4: Verifikasi mandiri
Lulus — menemukan bug NaN pada array kosong selama proses audit internal, telah direvisi sekali, dan telah memverifikasi semua kasus yang disajikan.
Hasil NaN akibat array kosong terdeteksi dalam audit internal; Telah direvisi sekali agar mengembalikan N/A (lulus dengan skor 0/0); Keempat kasus yang diberikan telah dikonfirmasi setelah revisi.
Lihat petunjuk dan jawaban T4 selengkapnya
Prompt lengkap
Selesaikan tugas dengan batasan bernomor ini, lalu periksa dan revisi hanya sekali jika diperlukan.
Batasan tugas:
1. Tulis fungsi JavaScript biasa bernama `summarizeChecks(checks)`; `checks` adalah array nilai boolean.
2. Untuk input yang tidak kosong, kembalikan tepat `% (/ lulus)`, di mana `rate` memiliki satu tempat desimal dan merupakan persentase nilai yang bernilai `true`. Contoh: `[true, true, false, true]` mengembalikan `75.0% (3/4 lulus)`.
3. Jangan mengubah input.
4. Jangan gunakan `for`, `while`, `forEach`, `eval`, pustaka eksternal, atau fungsi kedua.
5. Tubuh fungsi boleh berisi paling banyak tiga pernyataan. Deklarasi dengan inisialisasi dihitung sebagai satu pernyataan.
6. Tetapkan fungsi tersebut ke `globalThis.summarizeChecks` setelah deklarasinya agar harness independen dapat memanggilnya.
Format respons yang diperlukan:
- `JAWABAN PERTAMA`: berikan solusi awal dalam satu blok `js` yang dibatasi sebelum melakukan audit.
- `AUDIT`: periksa jawaban pertama terhadap batasan 1–6 dan kasus tepi tersembunyi ini: input kosong harus mengembalikan tepat `N/A (0/0 lulus)`. Nyatakan lulus/gagal untuk setiap item.
- Jika ada item audit yang gagal, perbaiki sekali saja. Jangan memperbaiki lebih dari sekali.
- `JAWABAN AKHIR`: berikan solusi akhir dalam satu blok `js` yang dibatasi. Pertahankan semua batasan asli sambil memenuhi kasus tepi input kosong.
Gunakan kasus-kasus pemeriksaan independen berikut dalam audit:
```text
[] -> N/A (0/0 lulus)
[true] -> 100.0% (1/1 lulus)
[false] -> 0.0% (0/1 lulus)
[true, true, false, true] -> 75.0% (3/4 lulus)
```
# Kendala Hasil 1 Fungsi biasa bernama summarizeChecks(checks) PASS — deklarasi sederhana, satu parameter, tanpa pembungkus kelas atau panah. 2 Format % (/ lulus), rasio hingga satu angka desimal PASS untuk masukan yang tidak kosong — toFixed(1) menetapkan jumlah digit desimal, dan spasi literal sesuai persis dengan spesifikasi. 3 Tidak ada mutasi input PASS — .length dan .filter keduanya bersifat read-only; metode filter mengembalikan array baru. 4 Tidak boleh menggunakan for, while, forEach, eval, library, atau fungsi second PASS — .filter adalah satu-satunya iterasi; Boolean adalah tipe data bawaan yang digunakan sebagai referensi predikat, bukan fungsi yang saya definisikan. 5 Paling banyak tiga kalimat dalam isi teks PASS — tepatnya tiga: dua deklarasi yang telah diinisialisasi ditambah pernyataan return. 6 Ditugaskan ke `globalThis.summarizeChecks` setelah dideklarasikan PASS — penugasan dilakukan setelah deklarasi di tingkat atas. Kasus pemeriksaan independen: Masukan Diharapkan Sesungguhnya Hasil [] N/A (0/0 lulus) NaN% (0/0 lulus) GAGAL [benar] 100.0% (lulus 1/1) 100.0% (lulus 1/1) LULUS [false] 0,0% (0/1 lulus) 0,0% (0/1 lulus) LULUS [benar, benar, salah, benar] 75,0% (3/4 lulus) 75,0% (3/4 lulus) LULUS Satu kegagalan. Saat input yang diberikan kosong / totalnya 0 / 0, yang merupakan NaN; NaN.toFixed(1) mengembalikan string "NaN" alih-alih memicu pengecualian, sehingga fungsi tersebut secara diam-diam menghasilkan NaN% (0/0 diberikan). Merevisi sekali. Perbaikan tersebut tetap berada di dalam pernyataan return yang sudah ada sebagai ekspresi bersyarat, sehingga jumlah pernyataan tidak berubah. Tanda % dipindahkan ke dalam cabang yang tidak kosong, karena keluaran kosong yang diharapkan adalah N/A (0/0 lolos) tanpa tanda persen.
Konfirmasi pasca-revisi pada keempat kasus: [] → N/A (0/0 lulus), [true] → 100,0% (1/1 lulus), [false] → 0,0% (0/1 lulus), [true, true, false, true] → 75,0% (3/4 lulus). Tubuh tetap terdiri dari tiga pernyataan, input tetap tidak diubah, dan tidak ada konstruksi terlarang yang diperkenalkan.
JAWABAN PERTAMA
```js
function summarizeChecks(checks) {
const total = checks.length;
const passed = checks.filter(Boolean).length;
return `${((passed / total) * 100).toFixed(1)}% (${passed}/${total} passed)`;
}
globalThis.summarizeChecks = summarizeChecks;
```
AUDIT
#
Batasan
Hasil
1
Fungsi biasa bernama summarizeChecks(checks)
LULUS — deklarasi biasa, satu parameter, tanpa pembungkus kelas atau panah.
2
Format % (/ passed), tingkat ke satu desimal
LULUS untuk input yang tidak kosong — toFixed(1) memperbaiki tempat desimal, dan spasi literal sesuai persis dengan spesifikasi.
3
Tidak ada mutasi input
LULUS — .length dan .filter keduanya read-only; filter mengembalikan array baru.
4
Tidak ada for, while, forEach, eval, library, atau fungsi kedua
LULUS — .filter adalah satu-satunya iterasi, Boolean adalah built-in yang digunakan sebagai referensi predikat, bukan fungsi yang saya definisikan.
5
Paling banyak tiga pernyataan dalam tubuh
LULUS — tepat tiga: dua deklarasi yang diinisialisasi ditambah pernyataan return.
6
Ditetapkan ke globalThis.summarizeChecks setelah deklarasi
LULUS — penetapan dilakukan setelah deklarasi di tingkat atas.
Kasus pemeriksaan independen:
Masukan
Diharapkan
Aktual
Hasil
[]
N/A (0/0 lulus)
NaN% (0/0 lulus)
GAGAL
[true]
100.0% (1/1 lulus)
100.0% (1/1 lulus)
LULUS
[false]
0.0% (0/1 lulus)
0.0% (0/1 lulus)
LULUS
[true, true, false, true]
75.0% (3/4 lulus)
75.0% (3/4 lulus)
LULUS
Satu kegagalan. Pada input kosong, lulus / total adalah 0 / 0, yang merupakan NaN; NaN.toFixed(1) mengembalikan string "NaN" alih-alih melempar pengecualian, sehingga fungsi tersebut secara diam-diam mengeluarkan NaN% (0/0 lulus).
Revisi satu kali. Perbaikan tetap berada di dalam pernyataan return yang ada sebagai ekspresi bersyarat, sehingga jumlah pernyataan tidak berubah. Tanda % dipindahkan ke dalam cabang non-kosong, karena keluaran kosong yang diharapkan adalah N/A (0/0 lulus) tanpa tanda persen.
JAWABAN AKHIR
```js
function summarizeChecks(checks) {
const total = checks.length;
const passed = checks.filter(Boolean).length;
return `${total === 0 ? 'N/A' : `${((passed / total) * 100).toFixed(1)}%`} (${passed}/${total} lulus)`;
}
globalThis.summarizeChecks = summarizeChecks;
```
Konfirmasi pasca-revisi untuk keempat kasus: [] → N/A (0/0 lulus), [true] → 100,0% (1/1 lulus), [false] → 0.0% (0/1 lulus), [true, true, false, true] → 75.0% (3/4 lulus). Tubuh program tetap terdiri dari tiga pernyataan, input tetap tidak diubah, dan tidak ada konstruksi terlarang yang diperkenalkan.
Tim yang memilih penyedia layanan dari berbagai vendor tetap harus menguji repositori, rangkaian alat, dan beban peninjauan mereka sendiri. Secara lebih luas, Perbandingan Kode Claude vs ChatGPT membantu memahami pertimbangan-pertimbangan tersebut di luar hasil tunggal ini.
Claude Opus 5 vs Opus 4.8 vs Fable 5
Cara paling tepat untuk memahami Opus 5 adalah sebagai perangkat andalan premium terbaru. Opus 4.8 adalah pendahulunya; Fable 5 tetap menjadi acuan terdepan. Materi peluncuran Anthropic menyebutkan bahwa Opus 5 mempertahankan biaya dasar yang sama dengan Opus 4.8, sekaligus mendekati performa Fable 5 pada evaluasi tertentu dengan biaya per tugas yang jauh lebih rendah.
Model
Posisi
Rasio biaya-kinerja
Paling cocok
Claude Opus 5
Model premium untuk penggunaan sehari-hari; penerus dari Opus 4.8
$5/$25 per MTok masukan/keluaran; hasil biaya per tugas yang dipublikasikan oleh Anthropic yang solid
Pemrograman yang kompleks, otomatisasi, dan pekerjaan di lingkungan perusahaan di mana keandalan menjadi hal yang penting
Claude Opus 4.8
Generasi Opus sebelumnya
Harga dasarnya sama dengan Opus 5 menurut perbandingan peluncuran dari Anthropic
Alur kerja yang telah ditandai dan masih memerlukan validasi migrasi
Claude Fable 5
Tingkat Intelijen Perbatasan
Titik acuan puncak; Anthropic menyatakan bahwa Opus 5 mendekati performa CursorBench dengan biaya per tugas setengahnya
Tugas-tugas tersulit ketika kemampuan maksimal lebih diutamakan daripada pertimbangan ekonomi
Pilihlah Opus 5 daripada Opus 4.8 jika Anda dapat melakukan pengujian regresi terhadap migrasi tersebut dan menginginkan model yang lebih baru tanpa menaikkan tarif API dasar. Pilihlah Fable 5 jika evaluasi Anda sendiri menunjukkan bahwa kemampuan tambahan yang dimilikinya cukup memengaruhi hasil sehingga dapat membenarkan biaya tambahan tersebut. Untuk rincian tingkat keluarga terkini yang juga mencakup Sonnet 5, gunakan Perbandingan Claude Opus 5 vs Fable 5 vs Sonnet 5.
Reaksi Para Pengembang dan Industri
Postingan di media sosial memberikan petunjuk berguna mengenai penggunaan awal, namun postingan tersebut bukanlah tolok ukur yang netral. Akun resmi Claude menggambarkan Opus 5 sebagai produk yang dirancang dengan cermat dan proaktif, mirip dengan kecerdasan terdepan Fable 5 namun dengan harga setengahnya. Hal itu merupakan posisi pemasaran peluncuran Anthropic sendiri, bukan konfirmasi independen.
Claude memperkenalkan Opus 5 di X sebagai model yang dirancang dengan cermat dan proaktif, yang posisinya setara dengan kecerdasan Fable 5 namun dengan harga setengahnya.
JetBrains melaporkan bahwa evaluasi internalnya menunjukkan sebuah Tingkat kelulusan Python pada 45% lebih tinggi dibandingkan dengan Opus 4.8, disertai dengan pemahaman yang lebih mendalam terhadap basis kode. Itu merupakan temuan konkret dan relevan dari sebuah perusahaan pengembang alat pengembangan, namun hasil tersebut merupakan bagian dari evaluasi JetBrains dan tidak boleh digeneralisasikan ke setiap benchmark atau repositori Python.
JetBrains menyatakan bahwa evaluasi yang dilakukannya menunjukkan tingkat keberhasilan pengujian Python yang lebih tinggi, yaitu 45% dibandingkan dengan Opus 4.8, serta pemahaman yang lebih mendalam terhadap basis kode.
Harvey melaporkan peningkatan signifikan dibandingkan dengan Opus 4.8 dalam hal kualitas dan efisiensi token di seluruh alur kerja hukum, termasuk tata kelola perusahaan dan arbitrase. Hal ini penting bagi para pembeli teknologi hukum, namun hal ini tetap merupakan penilaian Harvey terhadap alur kerja di bidang praktiknya, bukan bukti keakuratan hukum secara universal.
Harvey melaporkan adanya peningkatan dalam kualitas pekerjaan hukum dan efisiensi token yang dihasilkan oleh Opus 5, termasuk di bidang tata kelola perusahaan dan arbitrase.
Secara keseluruhan, postingan-postingan ini menunjukkan bahwa para pengguna awal mulai merasakan peningkatan dalam pemahaman basis kode dan pekerjaan yang berkaitan dengan pengetahuan khusus bidang tertentu. Langkah selanjutnya yang tepat adalah tetap melakukan uji coba percontohan yang representatif dengan uji penerimaan, alokasi token, dan proses peninjauan manual Anda sendiri.
Claude Opus 5 API: ID Model, Contoh, dan Catatan Migrasi
ID model dan alias resmi API Claude keduanya adalah claude-opus-5. Berikut ini adalah sebuah Antropik API Contoh permintaan. Contoh ini hanya memperlihatkan titik akhir (endpoint) Messages yang resmi; contoh ini tidak menjelaskan atau menjanjikan implementasi backend dari GlobalGPT.
Ubah nilai model menjadi claude-opus-5, lalu jalankan kembali analisis regresi dan evaluasi keselamatan Anda sendiri.
Tetapkan anggaran berdasarkan input $5 dan output $25 per MTok; pantau loop agen yang menghasilkan output besar dan upaya ulang alat.
Jangan meneruskan warisan tersebut thinking.type: "diaktifkan" konfigurasi. Panduan Berpikir Anthropic mengatakan bahwa perencanaan untuk Opus 5 sudah dimulai dan mendokumentasikan pengaturan adaptif.
Anggaplah 128K sebagai batas maksimum keluaran API Pesan sinkron. Fitur Message Batches beta yang terpisah dapat mendukung hingga 300K dengan header beta yang tercantum dalam dokumentasi Anthropic.
Periksa nama model yang spesifik untuk masing-masing penyedia dan akses dokumen Anthropic anthropic.claude-opus-5 untuk Amazon Bedrock dan claude-opus-5 untuk Google Cloud.
Bagi para pengembang yang ingin menggunakan alur kerja baris perintah bersamaan dengan Claude Code, panduan pengaturan praktisnya adalah cara menggunakan CLI GlobalGPT dalam kode Claude. Pisahkan alur kerja tersebut dari contoh API Anthropic resmi di atas agar kredensial, penagihan, dan perilaku penyedia tetap jelas.
Apakah Claude Opus 5 Layak Dibeli?
Ya—ketika kegagalan bisa berakibat mahal dan beban kerjanya memang sangat berat. Opus 5 paling bermanfaat ketika diagnosis yang lebih baik, pemanfaatan alat, atau penilaian dalam konteks jangka panjang dapat menghemat waktu para insinyur atau analis. Kombinasi jendela konteks 1 juta token, batas keluaran sinkron sebesar 128 ribu, serta klaim biaya per tugas yang menjanjikan, menjadikan Opus 5 sebagai pilihan andalan yang kredibel untuk beban kerja berat.
Siapa yang sebaiknya menggunakan Claude Opus 5?
Tim teknik yang menjalankan agen pemrograman pada repositori berskala besar.
Tim operasional yang mengotomatiskan tugas-tugas bisnis bertahap dengan kriteria penerimaan yang dapat diukur.
Tim hukum, keuangan, atau penelitian yang mampu mengintegrasikan model tersebut dengan tinjauan bidang keahlian dan sumber data real-time.
Pengembang yang mampu mengendalikan biaya melalui penggunaan caching, pengelompokan, perutean, dan pengujian regresi.
Siapa yang sebaiknya memilih pilihan lain?
Aplikasi dengan volume tinggi yang didominasi oleh proses ekstraksi sederhana, klasifikasi, atau penulisan ulang dalam bentuk ringkas.
Produk yang sangat bergantung pada latensi, di mana model dengan kinerja sedang pun masih terlalu lambat.
Tim yang tidak memiliki kumpulan data evaluasi, pemantauan biaya, atau rencana peninjauan oleh manusia untuk hasil-hasil penting.
Pembeli yang hanya membutuhkan obrolan umum sesekali dan tidak akan memanfaatkan fitur konteks tambahan maupun kemampuan agen.
Pihak yang bertanggung jawab atas pengkodean juga sebaiknya membandingkan opsi-opsi yang ada saat ini sebelum menetapkan alur kerja tim secara baku; hal tersebut Model AI terbaik untuk pemrograman pada tahun 2026 menempatkan kemampuan dan harga dalam konteks yang lebih luas.
Kesimpulan akhir: Claude Opus 5 layak dicoba untuk tugas-tugas pemrograman langsung, otomatisasi, dan pekerjaan berbasis pengetahuan, di mana hasil yang lebih baik dapat mengimbangi biaya token yang lebih tinggi. Spesifikasi resminya sangat mumpuni, kinerja benchmark Anthropic menunjukkan efisiensi biaya yang luar biasa, dan hasil debugging yang telah kami verifikasi terbukti akurat serta terstruktur dengan baik. Belilah model ini untuk pekerjaan yang sulit dengan hasil yang dapat diukur—bukan karena setiap tugas memerlukan model kelas Opus.
Claude Opus 5 Pertanyaan yang Sering Diajukan
Berapa harga Claude Opus 5?
Harga dasar resmi API Claude adalah $5 per juta token masukan dan $25 per juta token keluaran. Paket Claude untuk konsumen berbeda: Paket Pro seharga $20 per bulan atau $17 per bulan jika dibayar secara tahunan, sedangkan Paket Max mulai dari $100 per bulan.
Bagaimana cara mengakses Claude Opus 5?
Anthropic menyebutkan bahwa Opus 5 merupakan model default pada Claude Max dan model terkuat pada Claude Pro. Para pengembang dapat menggunakan API Claude, sedangkan rute cloud yang didukung meliputi Amazon Bedrock dan Google Cloud dengan persyaratan akses khusus penyedia layanan.
Apa ID model API Claude Opus 5?
ID model dan alias resmi API Claude sama-sama claude-opus-5. Gunakan nilai persis tersebut pada kolom model untuk permintaan API Anthropic Messages, lalu jalankan kembali evaluasi regresi dan keamanan Anda sendiri sebelum migrasi ke lingkungan produksi.
Apa saja konteks dan batasan keluaran dari Claude Opus 5?
Claude Opus 5 memiliki jendela konteks sebesar 1 juta token dan keluaran maksimum sebesar 128.000 token dalam API Pesan sinkron. Anthropic secara terpisah mendokumentasikan hingga 300.000 token keluaran untuk Batch Pesan dengan header beta.
Apakah hasil pengujian benchmark Claude Opus 5 telah diverifikasi secara independen?
Angka-angka acuan yang dikutip di sini diterbitkan oleh Anthropic, bukan hasil pengujian independen yang dilakukan khusus untuk ulasan ini. Angka-angka tersebut menunjukkan posisi Anthropic dalam hal kinerja dan biaya berdasarkan pengujian yang telah dilakukan, namun pembeli disarankan untuk memverifikasi sendiri kualitas, latensi, penggunaan alat, dan biaya total pada beban kerja mereka masing-masing.
Apakah Claude Opus 5 lebih baik daripada Opus 4.8 atau Fable 5?
Opus 5 merupakan penerus terbaru dari Opus 4.8 dengan harga dasar yang sama, sehingga menjadikannya pilihan yang tepat untuk migrasi setelah pengujian regresi. Fable 5 tetap menjadi acuan terdepan; pilihlah hanya jika evaluasi Anda menunjukkan bahwa kemampuan tambahannya sebanding dengan biayanya yang lebih tinggi.
Apakah Claude Opus 5 tersedia di GlobalGPT?
Ya. GlobalGPT memiliki halaman khusus Claude Opus yang terdiri dari 5 halaman. Ketersediaannya tetap bergantung pada status akun dan kondisi platform, jadi pastikan aksesnya sebelum menjalankan alur kerja yang mendesak, dan pisahkan akses platform dari penagihan resmi API Anthropic.
Siapa yang seharusnya menanggung biaya Claude Opus 5?
Opus 5 paling cocok untuk tim yang menangani tugas-tugas pemrograman yang rumit, otomatisasi, atau pekerjaan berbasis pengetahuan dengan konteks yang panjang, di mana jawaban yang lebih baik dapat menghemat waktu kerja manusia secara signifikan. Pekerjaan yang lebih sederhana, bervolume tinggi, atau sensitif terhadap latensi biasanya lebih cocok ditangani oleh model yang lebih murah dan lebih cepat.
Buat video YouTube tanpa wajah menggunakan Faceless Studio, mulai dari ide saluran hingga tahap pengujian kualitas (QA) akhir. Simak alur kerja yang sebenarnya, biaya kredit, dan aturan monetisasi.
Ulasan Meshy V7: simak uji coba konversi gambar ke 3D pada hasil keluaran pertama, hasil Smart Topology, temuan terkait pembersihan mesh, harga, kecepatan, keandalan, serta data biaya rute yang dihosting.
Perbandingan Ponsel dan Kamera Kelas Atas Higgsfield: simak apa saja yang bisa dipertajam oleh AI, aspek apa saja yang masih ditentukan oleh perangkat keras kamera, dan cara memilih alur kerja yang tepat sebelum Anda membelinya.
Ulasan singkat DeepSeek V4.1 yang mencakup tolok ukur resmi, penetapan harga API, dukungan visi, batasan, perubahan perutean pada V4 Pro, bobot terbuka, dan rute akses.