> ## Documentation Index
> Fetch the complete documentation index at: https://docs.intention.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Layanan program

> Layanan yang menurunkan state akun secara off-chain dari riwayat trading yang sudah terkomit, lalu mengomit hasilnya kembali lewat transaksi protokol.

Ada hal tentang akun yang perlu diketahui venue tetapi tidak bisa dihitung saat blok dieksekusi. Tier volume bergantung pada trading selama tiga puluh hari. Reward bergantung pada jendela yang belum tertutup. Atribusi referral bergantung pada hubungan yang terbentuk berbulan-bulan lalu.

Menaruh pekerjaan itu di dalam eksekusi blok salah dalam dua hal sekaligus: setiap blok harus membayar biaya komputasi yang nyaris tidak dibutuhkan blok mana pun, dan kernel harus menyimpan riwayat yang tidak punya alasan lain untuk disimpan.

Layanan program menyelesaikannya dengan membalik arah. Komputasi berjalan **di luar** blok, di atas catatan yang sudah terkomit. *Hasilnya* kemudian dikomit **kembali** ke chain sebagai state protokol, tempat eksekusi bisa membacanya dalam waktu konstan seperti konfigurasi lain mana pun.

<div className="dg" data-dg="program-writeback">
  <div className="dg-c" style={{aspectRatio:"720 / 348"}}>
    <svg className="dg-w" viewBox="0 0 720 348" aria-hidden="true">
      <path className="dg-wire" d="M 144.00 70.00 L 169.60 70.00" />

      <path className="dg-head" d="M 176.00 70.00 L 169.60 74.40 L 169.60 65.60 Z" />

      <path className="dg-wire dg--sky" d="M 344.00 70.00 L 369.60 70.00" />

      <path className="dg-head dg--sky" d="M 376.00 70.00 L 369.60 74.40 L 369.60 65.60 Z" />

      <path className="dg-wire" d="M 534.00 70.00 L 561.75 38.78" />

      <path className="dg-head" d="M 566.00 34.00 L 565.04 41.71 L 558.46 35.86 Z" />

      <path className="dg-wire dg--blue" d="M 534.00 70.00 L 561.33 95.62" />

      <path className="dg-head dg--blue" d="M 566.00 100.00 L 558.32 98.83 L 564.34 92.41 Z" />

      <path className="dg-wire dg--blue" d="M 645.00 128.00 L 645.00 136.00 L 465.00 136.00 L 465.00 142.00" />

      <path className="dg-head dg--blue" d="M 465.00 142.00 L 460.60 135.60 L 469.40 135.60 Z" />

      <path className="dg-wire dg--green" d="M 554.00 181.00 L 567.60 181.00" />

      <path className="dg-head dg--green" d="M 574.00 181.00 L 567.60 185.40 L 567.60 176.60 Z" />
    </svg>

    <div className="dg-b" style={{left:"0.0000%",top:"11.4943%",width:"19.4444%",height:"17.2414%"}}><span className="dg-t">Riwayat trading terkomit</span></div>
    <div className="dg-b dg--sky" style={{left:"25.0000%",top:"5.7471%",width:"22.2222%",height:"28.7356%"}}><span className="dg-t">Layanan program</span><span className="dg-s">komputasi berjendela, di luar blok</span><span className="dg-n">membaca tabel biaya langsung dari chain</span></div>
    <div className="dg-b dg--yellow dg-round" style={{left:"52.7778%",top:"10.3448%",width:"20.8333%",height:"19.5402%"}}><span className="dg-t">Berubah sejak diterapkan?</span></div>
    <div className="dg-b" style={{left:"79.1667%",top:"2.8736%",width:"20.8333%",height:"13.7931%"}}><span className="dg-t">Tidak ditulis</span></div>
    <div className="dg-b dg--blue" style={{left:"79.1667%",top:"21.8391%",width:"20.8333%",height:"13.7931%"}}><span className="dg-t">Transaksi protokol</span></div>
    <div className="dg-b dg--green" style={{left:"52.7778%",top:"41.9540%",width:"23.6111%",height:"20.1149%"}}><span className="dg-t">State on-chain</span></div>
    <div className="dg-b dg--green" style={{left:"80.2778%",top:"41.9540%",width:"19.7222%",height:"20.1149%"}}><span className="dg-t">Dibaca saat eksekusi</span><span className="dg-s">waktu konstan</span></div>
    <div className="dg-b dg-dashed dg-left" style={{left:"0.0000%",top:"70.1149%",width:"48.8889%",height:"24.1379%"}}><span className="dg-t">Diff terhadap tarif, bukan posisi tier</span><span className="dg-s">Ambang batas yang bergeser, atau tier yang tarifnya diubah, mengubah apa yang dibayar akun tanpa mengubah indeks tier-nya.</span></div>
    <div className="dg-b dg-dashed dg-left" style={{left:"51.1111%",top:"70.1149%",width:"48.8889%",height:"24.1379%"}}><span className="dg-t">Chain yang menentukan tarif final</span><span className="dg-s">Periode baru dicatat sebagai diterapkan setelah semua batch terkomit; crash me-replay seluruh periode, dan itu aman karena komputasinya idempoten.</span></div>
  </div>
</div>

Chain tetap menjadi otoritasnya. Layanan tidak memegang state yang menjadi sandaran jaringan — layanan hanya mengusulkan nilai, dan hanya yang diterima chain-lah yang nyata.

<h2 id="what-runs-today">
  Yang berjalan hari ini
</h2>

**Tier biaya berbasis volume.** Layanan ini mengonsumsi riwayat trading yang di-stream dari node, mengakumulasi volume per akun, dan mengambil snapshot secara terjadwal. Ketika periode ditutup, layanan menghitung volume rolling-window setiap akun, memetakannya melalui konfigurasi biaya yang **dibaca langsung dari chain**, lalu menulis kembali akun yang berubah secara batch.

Beberapa detail dalam kalimat itu bersifat menentukan:

* **Tabel tier dibaca dari chain, tidak pernah di-hard-code.** Layanan yang memegang salinannya sendiri akan terus menerapkan jadwal kemarin setelah jaringan mengubahnya.
* **Diff dilakukan terhadap tarif, bukan terhadap posisi tier.** Membandingkan *indeks* tier melewatkan dua kasus nyata: ambang batas yang bergeser sehingga akun yang tidak berubah jatuh ke tier lain, dan tier yang tarifnya diubah sementara indeksnya tetap sama. Keduanya mengubah apa yang dibayar akun; tidak satu pun mengubah indeksnya.
* **Chain yang menentukan tarif final.** Transaksi membawa indeks tier; eksekusi menyelesaikannya terhadap konfigurasi biaya yang sedang berlaku. Indeks tier di luar rentang yang valid menggagalkan seluruh batch, bukan diterapkan sebagian.
* **Periode baru dicatat sebagai sudah diterapkan setelah semua batch terkomit.** Crash di tengah periode akan me-replay seluruh periode itu, dan itu aman karena komputasinya idempoten — jendela yang sama menghasilkan hasil yang sama.

<h2 id="the-failure-model">
  Model kegagalan
</h2>

Layanan ini berada di antara dua sistem yang masing-masing akan sesekali tidak tersedia. Desainnya mengasumsikan hal itu, bukan memperlakukannya sebagai kejadian luar biasa.

Kegagalan dependensi — database, stream dari node, API node — dicoba ulang dengan backoff. Kegagalan itu tidak mengakhiri proses, karena restart tidak memperbaiki dependensi yang tak terjangkau; restart hanya menambahkan cold start ke dalam masa gangguan. Yang tetap fatal adalah hal yang *bisa* diperbaiki oleh restart atau yang harus dilihat operator: konfigurasi tidak valid saat startup, gagal mengikat health endpoint, dan panic.

Selama gangguan, proses tetap berjalan, melaporkan dirinya not-ready, dan menghitung error. Karena itu sinyal operasionalnya adalah **“sudah berapa menit ini not-ready”** dan bukan **“apakah prosesnya hidup”** — dan itulah pertanyaan yang berguna, sebab proses yang hidup tetapi gagal melakukan ingest selama satu jam justru insiden yang sebenarnya.

Shutdown berlangsung graceful pada sinyal yang dikirim orchestrator: pekerjaan berhenti, checkpoint di-flush, dan proses keluar dengan bersih. Tanpa itu, setiap deployment rutin akan menelan biaya satu jendela yang belum di-flush dan satu replay.

<Note>
  Periode yang sudah dihitung tetapi belum diterapkan bukanlah periode yang hilang. Karena komputasinya idempoten dan periode yang diterapkan baru dicatat setelah penulisan berhasil, proses yang terputus melanjutkan dengan mengulang jendela itu, bukan melewatinya.
</Note>

<h2 id="why-the-pattern-generalizes">
  Mengapa polanya bisa digeneralisasi
</h2>

Jalur write-back bersifat generik. Ada transaksi protokol untuk menetapkan konfigurasi di tingkat akun dan untuk menetapkan konfigurasi global, dan layanan program adalah proses apa pun yang menghitung nilai bagi salah satunya dari riwayat yang sudah terkomit.

Tier biaya adalah satu-satunya yang berjalan. Program insentif, atribusi referral, dan kelayakan kampanye akan berbentuk sama: komputasi berjendela di atas riwayat trading, diff terhadap apa yang sedang diterapkan, dan write-back secara batch. Semuanya akan berada di sini, bukan di dalam kernel, dengan alasan yang sama seperti tier biaya — komputasinya periodik dan historis, sementara eksekusi butuh jawaban itu tersedia sebagai lookup waktu konstan. Tidak satu pun dari semua itu sudah dibangun; yang bisa digeneralisasi adalah polanya, bukan komitmen bahwa semuanya akan memakainya.

Ketentuan komersial program-program ini ada di [Biaya & Program](/id/programs/fees). Halaman ini membahas bagaimana hasilnya sampai ke on-chain.

<h2 id="where-to-go-next">
  Ke mana selanjutnya
</h2>

<CardGroup cols={2}>
  <Card title="Indexer" href="/id/protocol/architecture/indexer">
    Stream yang dikonsumsi layanan ini.
  </Card>

  <Card title="Biaya" href="/id/programs/fees">
    Sisi komersialnya: apa saja tier-nya dan berapa biayanya.
  </Card>

  <Card title="IntentionKernel" href="/id/protocol/architecture/kernel">
    Bagaimana konfigurasi yang ditulis kembali dibaca saat eksekusi.
  </Card>

  <Card title="Model state" href="/id/protocol/architecture/state/model">
    Mengapa key konfigurasi diberi versi, dan mengapa klien harus me-resolve-nya secara langsung.
  </Card>
</CardGroup>
