Fitur Utamanya
Fitur paling khas di Zero bukan bagian dari sintaks. Fitur itu adalah cara compiler berbicara kepada siapa pun, atau apa pun, yang membaca output-nya.
Jalankan program yang rusak lewat zero check --json, dan kamu akan mendapat output yang bisa langsung dibaca agen:
{
"ok": false,
"diagnostics": [
{
"code": "NAM003",
"message": "unknown identifier",
"line": 3,
"repair": { "id": "declare-missing-symbol" }
}
]
}
Itu potongan data yang kecil tetapi padat makna. Mari kita bedah setiap field dan pilihan desain di baliknya.
Anatomi Sebuah Diagnostik
Diagnostik adalah objek terstruktur yang menjelaskan satu masalah di kode sumber. Field standarnya:
code: identifier yang stabil (misalnyaNAM003). Artinya selalu sama, apa pun versi compiler-nya.message: deskripsi yang mudah dibaca manusia. Kata-katanya bisa berubah antarversi, karena artinya ditetapkan olehcode, bukan oleh pesannya.line(dan field lokasi lainnya): tempat masalahnya berada.repair: metadata terstruktur opsional yang menjelaskan perbaikan yang menurut compiler bisa menyelesaikan diagnostik itu. Bentuk field ini sendiri sudah didokumentasikan dan stabil.
Bentuk tingkat atasnya memuat boolean ok untuk keseluruhan proses dan array diagnostics. Bahkan saat prosesnya berhasil, array itu bisa berisi peringatan atau catatan.
Kode Error yang Stabil
Kontrak pada code adalah bagian yang paling mungkin mengejutkanmu. NAM003 hari ini berarti "unknown identifier". NAM003 bulan depan dan tahun depan juga akan berarti "unknown identifier". Agen (dan manusia) bisa mengandalkan hal itu.
Ini penting karena model bahasa dan tooling cenderung menyimpan atau menghafal apa yang pernah dilihatnya. Kalau arti NAM003 bergeser di setiap rilis, setiap pencarian yang tersimpan menjadi tidak aman. Dengan kode yang tetap:
- Data latihan agen tetap berlaku di berbagai versi.
- Dokumentasi bisa diindeks berdasarkan kode.
- Pipeline tooling tetap stabil.
message yang ditujukan untuk manusia bebas berubah saat tim memperbaiki kata-katanya. code adalah identifier yang menjadi tumpuan.
Metadata Perbaikan
Field repair, kalau ada, memberi tahu pembacanya jenis perbaikan yang menurut compiler akan berhasil:
{
"code": "NAM003",
"message": "unknown identifier",
"line": 3,
"repair": { "id": "declare-missing-symbol" }
}
declare-missing-symbol di sini adalah jenis perbaikannya, yaitu maksud tingkat tinggi. Untuk mendapat edit yang sebenarnya, panggil zero fix --plan --json. Perintah itu mengembalikan rencana yang memuat path file, rentang byte yang perlu diubah, dan teks barunya:
{
"diagnostic": { "code": "NAM003", "line": 3 },
"plan": {
"id": "declare-missing-symbol",
"edits": [
{ "kind": "insert", "line": 1, "text": "fun answer() -> i32 { return 42 }\n" }
]
}
}
(Nama field dan bentuk persisnya bisa berbeda di versi toolchain kamu. Prinsipnya adalah "data terstruktur, bukan kalimat".)
Agen yang membaca rencana itu punya beberapa pilihan:
- Menerapkan edit apa adanya.
- Menerapkan edit dengan beberapa perubahan.
- Menolak rencana itu dan mencari perbaikan lain.
Dalam setiap kasus, agen bekerja dengan data terstruktur, bukan mencoba menafsirkan saran dalam bahasa Inggris. Itulah perbedaan antara rencana perbaikan dan petunjuk "did you mean ...?" di compiler pada umumnya.
Cara Agen Benar-Benar Memakainya
Alur sederhana dari awal sampai akhir yang mungkin dijalankan sebuah agen:
- Membuat atau mengubah sebuah file Zero.
- Menjalankan
zero check --jsonpada file itu. - Kalau hasilnya
{ "ok": true, ... }, lanjut ke tugas berikutnya. - Kalau tidak, untuk setiap diagnostik:
- Cari arti
codeuntuk memahami apa yang salah (denganzero explainatau tabel lokal). - Kalau ada
repairyang ditawarkan dan terlihat aman, panggilzero fix --plan --jsonuntuk mendapat edit-nya. - Terapkan (atau simulasikan) edit tersebut.
- Cari arti
- Kembali ke langkah 2.
Bandingkan dengan bekerja dari pesan berbentuk kalimat: agen harus mengurai bahasa Inggris, mengambil nomor baris yang mungkin, menebak jenis perbaikannya, dan menyimpulkan teks persis yang harus disisipkan atau diganti. Setiap langkah serba tidak pasti. Jalur JSON mengganti setiap langkah itu dengan pencarian terhadap skema yang terdokumentasi.
Bukan Hanya Error: Graph dan Size
--json bukan hanya untuk diagnostik. Perintah lain menyediakan data terstruktur dengan cara yang sama:
zero graph --json: menghasilkan dependency graph sebuah package sebagai data terstruktur. Berguna untuk memahami apa bergantung pada apa, dan untuk agen yang ingin menalar tempat-tempat pemanggilan sebelum menyentuhnya.zero size --json: melaporkan ukuran hasil kompilasi di disk, dirinci per target. Datanya sama dengan yang dilihat manusia dizero size, hanya saja bisa di-parse.
Bentuk-bentuk ini adalah bagian dari desainnya: setiap kali compiler punya data yang berguna, data itu tersedia sebagai JSON untuk dipakai tool tanpa harus mengambil teks dari layar.
Seperti Apa Skemanya
Nama field dan bentuk persisnya didokumentasikan di repository Zero dan akan terus berkembang selama proyek ini masih di bawah 1.0. Kategori yang bisa kamu harapkan:
- Metadata proses:
ok,version, waktu eksekusi. - Diagnostik:
code,message, lokasi (file/baris/kolom/rentang byte), tingkat keparahan (error/peringatan/catatan), danrepairyang opsional. - Rencana perbaikan: saat diambil, berupa daftar edit yang terstruktur.
Kalau kamu membangun tooling di atas bagian ini, pola yang aman adalah membaca field yang kamu kenal, mengabaikan field yang tidak dikenal dengan baik, dan mendasarkan keputusan perilaku pada code.
Contoh Singkat dari Awal sampai Akhir
Misalkan kode sumbermu memakai identifier yang belum dideklarasikan:
pub fun main(world: World) -> Void raises {
check world.out.write(answer()) // 'answer' is not defined anywhere
}
Menjalankan zero check --json menghasilkan kira-kira seperti ini:
{
"ok": false,
"diagnostics": [
{
"code": "NAM003",
"message": "unknown identifier 'answer'",
"line": 2,
"column": 27,
"repair": { "id": "declare-missing-symbol" }
}
]
}
zero fix --plan --json mengembalikan edit-nya:
{
"diagnostic": { "code": "NAM003", "line": 2 },
"plan": {
"id": "declare-missing-symbol",
"edits": [
{ "kind": "insert", "line": 1, "text": "fun answer() -> i32 { return 42 }\n" }
]
}
}
zero fix (tanpa --plan) menerapkan edit itu langsung di file, setelah itu zero check mengembalikan ok: true. Setiap langkah adalah transaksi terpisah yang bisa diperiksa.
Kenapa Ini Penting, Bukan Hanya untuk Agen
Sifat-sifat yang sama, yaitu output terstruktur, kode yang stabil, dan rencana perbaikan, juga memudahkan:
- Editor dan IDE. Garis bergelombang dan ikon bola lampu yang bekerja berdasarkan ID
repair, bukan teks yang di-parse. - Pipeline CI. Kegagalan dicatat dengan
codesehingga mudah dicari dengan grep dan ditampilkan di dashboard. - Tool code-mod. Perbaikan massal yang menargetkan sebuah kode, bukan regex atas pesan.
Sistem ini dirancang dengan agen sebagai sasaran utama, tetapi tooling untuk manusia mendapat manfaat yang sama.
Berikutnya: Desain yang Mengutamakan Agen
Sistem diagnostik adalah contoh paling konkret dari filosofi Zero yang mengutamakan agen. Dokumen berikutnya, desain yang mengutamakan agen, kembali melihat gambaran besarnya, yaitu prinsip-prinsip dasarnya (permukaan yang kecil, tooling yang deterministik, efek yang eksplisit) dan alasan masing-masing prinsip layak dipertahankan.
Pertanyaan yang sering diajukan
Apa itu diagnostik JSON di Zero?
Saat kamu menjalankan zero check --json (atau perintah lain dengan --json), compiler menghasilkan temuannya sebagai JSON terstruktur, bukan teks yang diformat untuk manusia. Setiap diagnostik membawa kode error yang stabil seperti NAM003, lokasi di kode sumber, pesan yang mudah dibaca manusia, dan, kalau ada, field repair terstruktur yang menjelaskan cara memperbaikinya.
Kenapa Zero menghasilkan JSON, bukan teks biasa?
Agen perlu mem-parsing output compiler. Diagnostik berbentuk teks biasa ditulis untuk manusia, sehingga butuh regex atas kalimat bahasa Inggris untuk mengambil nomor baris atau menebak perbaikannya. JSON tidak ambigu: agen membaca field code, mencari arti yang sudah didokumentasikan, lalu menjalankan rencana repair yang terstruktur tanpa pernah mengurai kalimat.
Apa itu kode error yang stabil di Zero?
Setiap diagnostik yang bisa dihasilkan compiler punya identifier pendek dan stabil seperti NAM003 (unknown identifier). Kontraknya, kode itu tetap punya arti yang sama di semua versi compiler, meskipun kata-kata di pesan untuk manusia berubah. Agen dan tooling bisa mencocokkan kode itu tanpa khawatir pesannya bergeser.
Apa itu rencana perbaikan (repair plan)?
Saat compiler merasa tahu cara memperbaiki sebuah diagnostik, compiler menempelkan field repair terstruktur yang menyebut jenis perbaikan yang akan diusulkannya. Memanggil zero fix --plan --json mengembalikan rencana lengkapnya: operasi edit yang perlu diterapkan, serta file dan rentang yang terdampak. Agen bisa menerapkan, mengubah, atau menolak rencana itu secara terprogram.
Apa hubungan zero explain dengan diagnostik JSON?
zero explain <code> mengembalikan penjelasan yang mudah dibaca manusia untuk sebuah kode diagnostik: arti error-nya, kenapa compiler menghasilkannya, dan perbaikan yang biasa dilakukan. Ini sisi kalimat dari diagnostik. Kodenya stabil, jadi penjelasan yang sudah disimpan tetap berlaku, dan agen mengambilnya saat menemukan kode yang tidak ada di data latihannya.