whyso — Apa yang Tidak Ditunjukkan git blame

git blame menunjukkan siapa, kapan, dan apa yang diubah. whyso menunjukkan mengapa diubah.


Masalah

Ketika ingin tahu mengapa satu baris kode ditulis seperti itu, yang bisa kita lakukan hanyalah melihat git blame dan pesan commit.

$ git blame internal/handler/page.go
a3f1b2c (parkjunwoo 2026-03-08) func CreatePage(c *gin.Context) {

Siapa, kapan, dan apa yang diubah — itu terlihat. Mengapa diubah — itu tidak ada.

Bukankah alasannya bisa ditulis di pesan commit? Kenyataannya seperti ini:

fix: update handler
refactor: clean up
wip

Menulis pesan commit yang baik adalah soal disiplin. Tidak peduli seberapa ketat konvensi tim, sangat jarang ada orang yang berpikir “aku harus mencatat konteks dan alasan perubahan ini dengan baik di pesan commit” ketika sedang memperbaiki bug di tengah malam.

Namun di era AI coding, situasinya berbeda. Alasan perubahan sudah tercatat.


Data Sesi Claude Code

Claude Code menyimpan semua percakapan sebagai file JSONL di bawah ~/.claude/projects/. Setiap record berisi pesan pengguna, respons AI, panggilan tool_use (Write, Edit, Bash), dan rantai parentUuid yang menghubungkan semuanya.

Pengguna: "mulai implementasi perintah whyso validate"
  → AI: Write internal/crosscheck/crosscheck.go
    → AI: Edit internal/crosscheck/crosscheck.go
      → AI: "membuat paket crosscheck awal — validasi pencocokan operationId SSaC↔OpenAPI"

Mengapa file dibuat, mengapa dimodifikasi — semuanya tersimpan dalam percakapan itu sendiri. Lebih kaya dari pesan commit, dan tidak perlu ditulis secara sengaja. Jika percakapan terjadi, rekaman otomatis tersimpan.

whyso mem-parsing data ini dan mengekstrak riwayat perubahan per file.


Siklus Hidup File Terlihat

file: internal/crosscheck/crosscheck.go
created: 2026-03-08T14:23:01Z
history:
  - timestamp: 2026-03-08T14:23:01Z
    session: 09351222-d7be-41fe-994f-87c2d7067e5d
    user_request: "mulai implementasi perintah whyso validate"
    answer: "membuat paket crosscheck awal — validasi pencocokan operationId SSaC↔OpenAPI"
    tool: Write

  - timestamp: 2026-03-09T10:15:33Z
    session: 4e9b4e5e-3a50-43f2-be6e-e5db228ecc3b
    user_request: "tambahkan validasi apakah kolom x-sort ada di DDL"
    answer: "menambahkan validasi silang kolom x-sort/x-filter → DDL"
    tool: Edit

  - timestamp: 2026-03-10T09:41:22Z
    session: b2e43b4f-cb21-4286-975d-1eb9de8a16c0
    user_request: "tambahkan juga validasi silang spesifikasi Func"
    answer: "menambahkan validasi silang jumlah/tipe argumen @call ↔ Func spec"
    tool: Edit

Mengapa file dibuat, permintaan apa yang mendorongnya, dan bagaimana ia berkembang. Seluruh siklus hidup satu file terlihat jelas.


Mengapa Ini Diperlukan

Celah dalam Code Review

Saat me-review PR, ada momen ketika muncul pertanyaan “mengapa perubahan ini dilakukan?”. Jika alasannya tidak ada di pesan commit, harus bertanya kepada penulisnya. Jika penulis tidak ingat, harus membaca ulang kode dan menyimpulkannya.

Di lingkungan AI coding, jawaban dari pertanyaan ini ada di data sesi. whyso mengambil jawaban itu.

Onboarding

Cara tercepat bagi anggota tim baru untuk memahami codebase adalah mengetahui “mengapa kode ini menjadi seperti ini”. git log adalah daftar kronologis perubahan, dan dokumentasi adalah snapshot dari kondisi saat ini. Riwayat per file dari whyso menunjukkan ruang di antaranya — rangkaian niat.

Catatan Pribadi

Bahkan saat mengembangkan sendiri, ada momen ketika kita tidak ingat mengapa kita menulis kode seperti itu tiga bulan lalu. whyso memulihkan percakapan antara diri kita di masa lalu dan AI. Konteks yang tidak ditulis di pesan commit ada di sana.


Hubungannya dengan git blame

whyso tidak menggantikan git blame. Ia melengkapinya.

git blamewhyso
SiapaO
KapanOO
Apa yang diubahO (per baris)O (per tool_use)
Mengapa diubah△ (pesan commit)O (permintaan pengguna + penjelasan AI)
Sumber datagit historysesi Claude Code

Jika git blame adalah “catatan resmi” berbasis commit, maka whyso adalah “jurnal kerja” berbasis percakapan. Konteks yang tidak bisa ditulis di catatan resmi tersimpan di jurnal kerja.


Struktur di Mana AI Membaca Catatannya Sendiri

Kasus penggunaan whyso yang paling menarik adalah bukan manusia, melainkan AI itu sendiri yang membacanya.

Claude Code melupakan segalanya ketika sesi berakhir. Ketika membuka proyek yang sama di sesi berikutnya, semua hilang — mengapa kita menulis kode seperti itu kemarin, pilihan apa yang ditinjau dan ditolak, konteks apa yang ada saat pengguna membuat permintaan. Ia hanya bisa membaca kode dan menyimpulkan.

Bayangkan menambahkan satu baris ke CLAUDE.md:

Sebelum memodifikasi file, wajib jalankan `whyso history <file>`. Jika ada riwayat, baca dulu baru modifikasi.

Yang diubah oleh satu baris ini:

Mengetahui Perubahan yang Tidak Boleh Dibalik

Saat membaca file yang akan dimodifikasi, ada kode yang terlihat aneh. Melihat kondisi saat ini saja, mungkin terpikir “apakah ini kesalahan?” dan ingin memperbaikinya. Namun jika riwayat whyso mencatat “pengguna secara eksplisit meminta struktur ini, alasannya bukan performa tapi keterbacaan”, maka tidak akan diubah.

Tidak Mengusulkan Kembali Pilihan yang Sudah Ditolak

Di sesi sebelumnya ada percakapan “coba cara A?” → “tidak, pakai B saja”, tapi AI di sesi baru tidak tahu itu. Jadi ia mengusulkan A lagi. Ini membuat pengguna frustrasi. Dengan whyso, sudah tahu arah yang sudah ditinjau dan ditolak.

Menyambung Konteks Pekerjaan yang Berkelanjutan

Jika berkata “lanjutkan refactoring kemarin”, saat ini harus menyimpulkan dari diff. Dengan riwayat whyso, bisa langsung membaca permintaan pengguna dari sesi kemarin dan dasar pertimbangan AI. Bukan lagi inferensi, melainkan pekerjaan berkelanjutan berdasarkan fakta.

Catatan Terakumulasi Melampaui Sesi

Dengan struktur ini, riwayat whyso terus bertambah setiap sesi. Alasan perubahan di sesi ini juga diteruskan ke AI di sesi berikutnya. Masalah tidak adanya memori antar-sesi terpecahkan per file. Tanpa sistem memori terpisah.

Yang tercatat di whyso adalah pekerjaan AI. Namun AI tidak mengingat itu. Situasi di mana catatan yang dibuat sendiri paling dibutuhkan oleh diri sendiri. Inilah titik unik whyso ketika dikombinasikan dengan alat AI coding.

Bagi manusia, whyso adalah “alat yang secara otomatis meninggalkan pesan commit yang baik”. Bagi AI, whyso adalah memori yang melampaui sesi.


Cara Penggunaan

Instalasi

go install github.com/park-jun-woo/whyso/cmd/whyso@latest

Melihat Riwayat File

# File tunggal
whyso history README.md

# Seluruh direktori
whyso history internal/ --all

# Output dengan mencerminkan struktur file
whyso history . --all --output .file-histories/

# Format JSON
whyso history README.md --format json

Daftar Sesi

whyso sessions

Cara Kerja

Menelusuri Balik Rantai parentUuid

Setiap record dalam JSONL terhubung melalui uuid dan parentUuid. Dengan menelusuri ke atas rantai parentUuid dari tool_use di mana AI memodifikasi file, kita sampai pada permintaan asal pengguna yang memicu modifikasi tersebut.

user message (uuid: A)          ← "tambahkan validasi apakah kolom x-sort ada di DDL"
  → assistant tool_use (parentUuid: A)
    → tool_result (parentUuid: B)
      → assistant Edit (parentUuid: C)  ← alasan modifikasi ini = A

Karena ada pesan bertipe tool_result di tengah, dengan mengekstrak hanya yang bertipe "user" dan content-nya berupa string, kita bisa menemukan permintaan pengguna yang sebenarnya.

Keputusan Desain

Hanya melacak Write/Edit. Write dan Edit tool_use dari Claude Code secara eksplisit menyertakan path file dan konten perubahan. Manipulasi file melalui perintah Bash (rm, mv, cp) dideteksi secara heuristik, namun Write/Edit adalah target pelacakan utama. Karena Claude Code dirancang untuk menggunakan Write/Edit saat memodifikasi file, kedua alat ini saja sudah bisa menangkap sebagian besar perubahan.

Termasuk sub-agent. Saat Claude Code menangani tugas kompleks, kadang ia membuat sub-agent. Sesi sub-agent disimpan di bawah direktori sesi induk. whyso juga mem-parsing sesi sub-agent ini untuk membangun riwayat yang lengkap.

Pembaruan inkremental. Saat output ke direktori dengan opsi --output, sesi yang sudah di-parsing dilewati. Meskipun sesi bertambah hingga ratusan, tidak perlu mem-parsing ulang semuanya setiap kali.

Angka-angka

Hasil melacak proses pengembangan proyek whyso itu sendiri dengan whyso:

ItemAngka
Jumlah sesi17
Panggilan Write660
Panggilan Edit1.415
Manipulasi file Bash206
Jumlah file unik yang diubah480

Riwayat perubahan 480 file diekstrak dari 17 sesi. Setiap file memiliki catatan “mengapa dibuat dan mengapa berubah”.


Keterbatasan

  • Khusus Claude Code. Data sesi dari alat AI coding lain memiliki format yang berbeda. Saat ini hanya mendukung format JSONL dari Claude Code.
  • Hanya melacak file teks. Write/Edit tool_use menargetkan file teks. Perubahan pada gambar dan file biner tidak dilacak.
  • Data sesi harus ada secara lokal. File sesi harus ada di ~/.claude/projects/. Jika sudah dihapus atau dikerjakan di mesin lain, rekaman itu tidak ada.

Kesimpulan

Di era menulis kode bersama AI, alasan perubahan tidak perlu lagi hanya mengandalkan pesan commit. Percakapan itu sendiri adalah rekaman, dan dari rekaman itu riwayat perubahan per file bisa diekstrak secara otomatis.

Jika git blame menunjukkan “siapa, kapan, dan apa yang diubah”, maka whyso menunjukkan “mengapa diubah”.

Kode: github.com/park-jun-woo/whyso