
File apa saja yang harus disentuh untuk memodifikasi satu fitur? Ketik satu operationId, jawabannya muncul.
Masalahnya
Dalam aplikasi full-stack, “satu fitur” tidak hidup dalam satu file.
Misalkan kamu harus memodifikasi fitur bernama “ExecuteWorkflow”. Fitur itu ada di spesifikasi API, di logika service, di skema database, di kebijakan otorisasi, di diagram transisi status, di panggilan fungsi eksternal, di skenario pengujian, dan di komponen frontend.
Secara historis ada dua cara untuk memahami seluruh ruang lingkup ini:
- Menjalankan grep puluhan kali
- Melacak kode secara manual
Keduanya lambat, dan keduanya selalu melewatkan sesuatu. Terutama referensi lintas lapisan — dari spesifikasi API ke service, dari service ke skema DB, dari service ke kebijakan otorisasi — praktis mustahil dilacak tuntas oleh manusia.
Lebih parah lagi ketika penyuntingan diserahkan ke AI. Pada 200 endpoint, AI tidak lagi mampu memegang konteks penuh. Konteks runtuh, pola melenceng, dan fitur ke-201 jadi 10× lebih mahal daripada ke-21. Inilah tembok yang ditabrak vibe coding.
Namun jika setiap lapisan memiliki sumber yang secara simbolik mereferensikan lapisan lain, cukup ikuti referensi itu — seluruh ruang lingkupnya otomatis terungkap.
Apa itu Feature Chain
Feature Chain adalah himpunan semua node sumber yang terhubung ke satu fitur API (operationId).
Berawal dari satu operationId, ia mengikuti referensi simbolik antar sumber dan mencetak sekaligus semua file dan nomor baris yang terkait. Puluhan grep digantikan dengan satu perintah.
yongol chain ExecuteWorkflow specs/
── Feature Chain: ExecuteWorkflow ──
OpenAPI api/openapi.yaml POST /workflows/{id}/execute
SSaC service/workflow/execute_workflow.ssac @get @empty @auth @state @call @publish @response
DDL db/workflows.sql CREATE TABLE workflows
DDL db/execution_logs.sql CREATE TABLE execution_logs
Rego policy/authz.rego resource: workflow
StateDiag states/workflow.md diagram: workflow → ExecuteWorkflow
FuncSpec func/billing/check_credits.go @func billing.CheckCredits
FuncSpec func/billing/deduct_credit.go @func billing.DeductCredit
FuncSpec func/worker/process_actions.go @func worker.ProcessActions
FuncSpec func/webhook/deliver.go @func webhook.Deliver
Hurl tests/scenario-happy-path.hurl scenario: scenario-happy-path.hurl
Struktur penuh sebuah fitur tampil di satu layar. Lapisan yang tidak terhubung tidak dicetak.
Mengapa ini mungkin
Ini bukan sihir. Mungkin karena sumber-sumber memang sudah saling mereferensi.
Di framework yongol, tiap lapisan SSOT (Single Source of Truth) menunjuk secara simbolik pada lapisan lain:
@get Model.Methodpada SSaC → tabel DDL@auth action resourcepada SSaC → kebijakan otorisasi Rego@state diagramIDpada SSaC → diagram status Mermaid@call pkg.Funcpada SSaC → implementasi FuncSpec@publish "topic"pada SSaC → fungsi-fungsi yang berlangganan topic yang sama- operationId pada OpenAPI → nama file SSaC
- Skenario Hurl → endpoint OpenAPI
apiClient.<op>()pada React TSX → operationId OpenAPI
Referensi ini pada awalnya dirancang untuk yongol validate — tahap yang memvalidasi silang konsistensi 9 SSOT sebelum compile-time. Karena validate sudah memparse mereka, memakai ulang infrastruktur yang sama mengubah ekstraksi feature chain menjadi penelusuran graf.
Jalur penelusuran
Dengan operationId sebagai titik awal, graf referensi terbuka seperti ini:
operationId (titik masuk)
├── OpenAPI → path + method
├── SSaC → file fungsi service
│ ├── @get → tabel DDL
│ ├── @auth → aturan kebijakan Rego
│ ├── @state → transisi Mermaid stateDiagram
│ ├── @call → implementasi FuncSpec
│ └── @publish → pelanggan antrian
├── Hurl → skenario pengujian yang mereferensi operationId
└── React TSX → file frontend yang memanggil endpoint via apiClient
Tiap cabang hanya mengikuti satu langkah referensi simbolik. Ini penelusuran melebar, bukan mendalam. Setiap lapisan tempat sebuah fitur meninggalkan jejak akan muncul.
Apa yang berubah
Menentukan cakupan perubahan
“Untuk mengubah fitur ini, di mana yang harus kusentuh?”
Untuk menjawab itu kita membaca kode, menjalankan grep, bertanya ke rekan. Feature Chain mengganti pertanyaan itu dengan satu perintah. Tidak ada file yang lolos — selama referensi simboliknya ada.
Penyuntingan oleh AI
Yang paling sulit saat mendelegasikan perubahan fitur ke AI adalah “memberi tahu cakupannya”. AI hanya bisa menyunting secara benar saat file-file yang relevan ada di jendela konteksnya, dan manusialah yang harus menentukan mana yang relevan.
Dengan Feature Chain, lain ceritanya. Beri satu operationId, seluruh cakupan teridentifikasi otomatis. Konteks untuk AI disiapkan tanpa ada yang terlewat. Karena 9 SSOT adalah spesifikasi deklaratif — jauh lebih padat daripada kode Go yang dihasilkan — seluruh chain bisa dimasukkan ke jendela konteks dengan ruang tersisa.
Code review
Saat mereview PR, “kalau mereka menyentuh fitur ini, bukankah file itu juga harus berubah?” jadi sepele untuk diverifikasi — cukup bandingkan dengan chain. Ketidaksesuaian antar lapisan ditangkap oleh struktur, bukan oleh orang.
Onboarding
Saat orang yang baru bergabung berkata “saya ingin mengerti cara kerja ExecuteWorkflow”, tinggal tunjukkan Feature Chain-nya. Dari API sampai DB, dari kebijakan otorisasi sampai skenario pengujian — seluruh medan sebuah fitur terlihat dalam satu layar.
Mengapa operationId
Memilih titik awal itu penting. Feature Chain memilih operationId.
Alasannya sederhana. Di aplikasi full-stack, unit sebuah fitur adalah endpoint API. User menekan tombol, API dipanggil, logika service berjalan, DB dibaca, otorisasi diperiksa, transisi status terjadi. Awal dari seluruh alur itu adalah operationId.
operationId sudah didefinisikan di spesifikasi OpenAPI dan merupakan nama yang dibagi seluruh tim. Katakan “kita perlu memodifikasi ExecuteWorkflow” dan engineer backend, engineer frontend, maupun QA memikirkan hal yang sama. Feature Chain dirancang seputar nama universal itu sebagai benang yang menembus seluruh stack.
yongol menyebut ini “operationId adalah batu penjuru (keystone)”. Satu identifier PascalCase mengikat 9 lapisan secara fisik.
Prasyarat
Agar Feature Chain bekerja, ada asumsi:
Sumber harus saling mereferensi secara simbolik. Direktif
@get,@auth,@state,@call,@publishdi SSaC harus menunjuk secara eksplisit pada SSOT lain. Kalau referensinya implisit — misalnya nama tabel DB yang hanya muncul sebagai string di dalam kode — tidak bisa dilacak.yongol validateharus lulus. Feature Chain mengikuti referensi simbolik, jadi kalau referensi tidak valid, hasilnya salah. validate menjamin integritas referensi; Feature Chain menelusuri di atasnya.
Itulah sebabnya Feature Chain bukan alat serba guna. Tidak bisa diterapkan ke sembarang proyek. Ia hanya bekerja di proyek yang referensi antar sumbernya dirancang secara eksplisit — struktur seperti yongol, tempat SSOT saling menunjuk satu sama lain secara eksplisit.
Masa depan: GEUL + SILK
Saat ini Feature Chain menelusuri dengan memanggil tiap parser SSOT secara bergiliran. Memanggil parser SSaC, parser DDL, parser Rego, parser Mermaid, parser Hurl, dan parser TSX, lalu menggabungkan hasilnya.
Ketika semua SSOT diterjemahkan menjadi graf GEUL, Feature Chain menjadi satu kueri indeks. Dengan operasi AND bitwise SIDX di SILK, semua node yang terhubung ke operationId dapat diekstrak dalam satu kueri.
Dari penelusuran per-parser ke kueri graf. Antarmuka Feature Chain tetap sama, tetapi bagian dalamnya berubah secara mendasar.
Penutup
Di aplikasi full-stack, “satu fitur” tidak hidup di satu file. Ia membentang di banyak lapisan, dan lapisan-lapisan itu saling mereferensi. Feature Chain mengikuti referensi itu untuk mengekstrak otomatis seluruh cakupan sebuah fitur.
Ketik satu operationId dan kamu dapat semuanya: dari spesifikasi API hingga skema DB, dari kebijakan otorisasi hingga skenario pengujian, dari implementasi fungsi hingga komponen frontend. Puluhan grep digantikan satu perintah. AI mendapat konteks tanpa yang terlewat; manusia mendapat kebebasan di atas rel.