yongol — Lunas Kapal SaaS yang Dikodekan AI

Endpoint ke-200

Anda membangun SaaS dengan vibe coding. Awalnya cepat. 5 tabel, 12 endpoint — dua puluh menit dan berjalan.

Tapi melewati 50 endpoint, sesuatu yang aneh terjadi. AI menghasilkan pola hari ini yang bertentangan dengan kemarin. Melewati 100, fitur yang ada diam-diam rusak. Melewati 200, menambahkan satu fitur biayanya 10x lipat dari sepuluh fitur pertama.

Bukan karena modelnya bodoh.


Keputusan dan implementasi

Tiga hal tercampur dalam kode sumber:

  • Keputusan pengguna — kolom ini adalah BIGINT, endpoint ini hanya untuk pemilik, pagination menggunakan cursor.
  • Logika bisnis — pricing, workflow, aturan lifecycle.
  • Detail implementasi — nama variabel, urutan pemanggilan library, pembungkusan error.

Ketika AI membaca kode ini, ia tidak bisa membedakan baris mana yang keputusan dan mana yang detail. Jadi ketika “refactoring” atau “membersihkan”, ia diam-diam menimpa keputusan yang dikira detail. Pengguna baru sadar setelah perilakunya sudah salah.

Inilah mengapa vibe coding runtuh di 200 endpoint. Model yang lebih besar tidak menyelesaikannya. Medium — kode mentah — tidak menyimpan keputusan. Setiap model akhirnya menabrak tembok yang sama.


Lunas kapal

Lunas adalah tulang pertama yang diletakkan saat membangun kapal. Ia menahan berat lambung, mencegah oleng ke samping, dan semua struktur lainnya dibangun di atasnya. Kapal tanpa lunas mengapung di air tenang tapi melengkung saat ombak datang.

SaaS yang dibangun dengan vibe coding sama seperti itu. Mengapung saat kecil. Melengkung saat membesar.

yongol adalah lunas SaaS yang dikodekan AI.


Pindahkan keputusan keluar dari kode

Inti yongol sederhana. Pisahkan keputusan dari kode.

Sepuluh spesifikasi deklaratif (SSOT) masing-masing menangani satu concern:

SSOTConcern
features.yamlKatalog fitur — apa yang akan dibangun
manifest.yamlKonfigurasi proyek — autentikasi, middleware, infrastruktur
OpenAPIKontrak API — rute, parameter, respons
SQL DDL + sqlcModel data — tabel, kolom, constraint, query
SSaCAlur layanan — urutan keputusan di dalam endpoint
RegoOtorisasi — siapa boleh melakukan apa
Mermaid stateDiagramTransisi state — lifecycle entitas
FuncSpecFungsi kustom — logika yang tidak bisa diekspresikan sebagai CRUD
HurlSkenario pengujian — verifikasi runtime
STMLFrontend — struktur halaman dan data binding

Delapan dari sepuluh adalah standar industri (OpenAPI, SQL, sqlc, Rego, Mermaid, Hurl, YAML). Hanya SSaC dan STML yang DSL buatan yongol. Yang harus dipelajari AI dari nol diminimalkan.

Setiap SSOT hanya berisi keputusan. Tanpa detail implementasi. AI mengedit SSOT; yongol generate merender kode darinya. Keputusan hidup permanen di SSOT; kode adalah proyeksi sekali pakai.


Memaksakan konsistensi

Keputusan sekarang tersebar di sepuluh file, jadi kontradiksi bisa muncul. DDL bilang BIGINT tapi OpenAPI bilang string? SSaC mendeklarasikan @auth tapi Rego tidak punya aturan yang cocok? Diagram state punya transisi tapi SSaC tidak punya fungsi yang sesuai?

SSOT yang bertentangan adalah keputusan yang rusak. Sebersih apa pun kodenya, jika keputusan bertentangan, perilakunya salah.

yongol validate menangkap ini.

✓ manifest        ✓ openapi_ddl       ✓ ssac_rego
✓ openapi         ✓ openapi_ssac      ✓ ssac_authz
✓ ddl             ✓ hurl_openapi      ✓ ssac_sqlc
✓ query           ✓ hurl_statemachine ✓ ddl_statemachine
✓ ssac            ✓ hurl_manifest     ✓ ddl_rego
✓ statemachine    ✓ openapi_manifest  ✓ rego_manifest
✓ rego            ✓ ssac_ddl          ✓ stml_openapi
✓ hurl            ✓ ssac_statemachine
✓ funcspec        ✓ ssac_func

0 errors, 0 warnings

Pertama memvalidasi setiap SSOT secara individual, kemudian menjalankan pemeriksaan silang antar lapisan. ~287 aturan memeriksa setiap referensi simbolik di antara kesepuluh SSOT. Jika ada satu kontradiksi, kompilasi ditolak.

AI menulis dengan bebas. Keluar dari rel, validate langsung menangkap. Kebebasan di atas rel.


operationId adalah batu kunci

Bagaimana mengikat sepuluh lapisan? Dengan satu identifier PascalCase.

Masukkan operationId ExecuteWorkflow:

── 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

Dari spesifikasi API ke skema database, dari kebijakan otorisasi ke transisi state, dari implementasi fungsi ke skenario pengujian — topologi lengkap satu fitur dalam satu layar. Puluhan grep digantikan satu perintah.

operationId adalah batu kunci karena dalam aplikasi full-stack, unit dari sebuah fitur adalah endpoint API. Pengguna menekan tombol, API dipanggil, dan API itu menembus setiap lapisan lainnya. Satu nama menghubungkan sepuluh lapisan secara fisik.


Benchmark: ZenFlow

ZenFlow — SaaS otomasi workflow multi-tenant. Claude Sonnet 4.6 menulis SSOT; yongol memvalidasinya.

TahapDeskripsiWaktuKumulatif
Build awalmulti-tenant, auth, state machine, 6 tabel, 10 endpoint23 mnt23 mnt
+ Versioningclone workflow, daftar versi, INSERT…SELECT salin aksi16 mnt39 mnt
+ Webhookpublikasi event, CRUD webhook, backend antrian8 mnt47 mnt
+ Marketplace templatepagination cursor, clone cross-org, endpoint publik7 mnt54 mnt
+ Lampiran filelaporan eksekusi, backend file7 mnt61 mnt
+ Penjadwalancron berbasis sesi, TTL10 mnt71 mnt
+ Log auditbackend cache, pagination, filter6 mnt77 mnt
+ DashboardAPI agregat, join relasi, tampilan detail14 mnt91 mnt
+ Operasi batchpenyimpanan massal aksi, serialisasi JSON10 mnt101 mnt
+ API eksternalimpor API geocoding, penyimpanan koordinat14 mnt115 mnt
+ Pembaruan kondisionalpenugasan otomatis, skor kepercayaan, percabangan kondisional16 mnt131 mnt

Final: 30 endpoint, 12 tabel, 64 permintaan pengujian. Semua hijau.

Sepuluh fitur ditambahkan secara berurutan. Menambahkan fitur tidak pernah melambat. Tes yang ada tidak pernah rusak. Tembok 200 endpoint tidak ada.

Menjalankan spesifikasi yang sama dengan Opus: 30 endpoint, 73 permintaan pengujian, ~76 menit. Model berubah, rel tetap sama.


Mengapa model yang lebih besar bukan jawabannya

“GPT-6 akan menyelesaikan ini.”

Tidak akan. Masalahnya bukan kecerdasan model — tapi medium-nya.

Kode sebagai medium tidak membedakan keputusan dari implementasi. Model apa pun yang membaca kode melihat teks di mana keputusan dan detail bercampur. Sepintar apa pun modelnya, jika medium tidak menyediakan pembedaan, model tidak bisa membedakan.

yongol mengubah medium. Memindahkan apa yang diedit AI dari kode ke spesifikasi deklaratif. Karena spesifikasi hanya berisi keputusan tanpa detail implementasi, AI tidak pernah salah mengira keputusan sebagai detail. Kelangsungan keputusan menjadi independen dari ukuran model.

LLM kecil yang hanya mengedit SSOT, dengan validate memberikan feedback presisi di setiap kesalahan, bisa mempertahankan integritas keputusan yang sama dengan model jauh lebih besar yang mengedit kode mentah. yongol menjembatani kesenjangan itu.


Mulai

npx skills add park-jun-woo/yongol

Instal skill yongol ke agen AI Anda (Claude Code, Cursor, Copilot, dan lainnya). Agen mempelajari alur kerja secara otomatis saat instalasi.

Untuk menggunakan CLI langsung:

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

git clone https://github.com/park-jun-woo/yongol && cd yongol
yongol validate examples/zenflow

0 errors, 0 warnings.

Arahkan AI ke spesifikasi ini dan suruh tambahkan fitur. validate memasang rel; AI berlari di atasnya. Tidak ada tembok.


Artikel terkait

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