achmadya.dev
Terbuka untuk pekerjaan
COMMAND PALETTE

Cari sesuatu

10 hasilGunakan tautan di bawah untuk membuka halaman
Proyek
proyekMandor PlateA reusable SaaS boilerplate with an API, dashboard, database, and tests in one monorepo.proyekMCP QueryA suite of MCP servers for querying Excel and four databases over npx and stdio, with a small runtime and explicit error handling.
Tulisan
TulisanRecording Personal Finances in a Spreadsheet with HermesHow I turn a transaction message into a structured Financial Planner entry with metadata, approval, and verification.TulisanBuilding a Dedicated Workspace for Hermes to Work ReliablyHow I separated AI conversation from deterministic execution with a workspace, the kw CLI, skills, jobs, and an approval lifecycle.TulisanHow I render Markdown and Mermaid in ReactThe rendering pipeline I use for safe Markdown, highlighted code, and responsive Mermaid diagrams.TulisanDesigning an MCP tool call I can traceHow I separate protocol handling, database adapters, and public errors in a small MCP query server.TulisanInstalling Hermes Agent and Understanding Its ArchitectureA complete guide to installing Hermes Agent and understanding profiles, skills, tools, gateway, schedules, Kanban, memory, and agent architecture.TulisanA monorepo as a context boundary for AIWhat changed when I put contracts, backend, frontend, and tests in one workspace for AI-assisted development.TulisanLearning Microsoft SQL Server and its backup mechanismNotes on learning Microsoft SQL Server through an online-store case: from containers and queries to recovery models, backup chains, and restore operations.TulisanBuilding CCTV Live Streaming and Playback on the Web with FFmpegR&D notes on taking Hikvision video from RTSP to the browser, including H.265 transcoding, MPEG-TS, WebSocket delivery, and time-based playback.
~/tulisan / hermes-finance-spreadsheet-workflow

Mencatat Keuangan ke Spreadsheet dengan Workflow Hermes

Hermespersonal financeGoogle Sheetsautomationworkflow

Artikel ini adalah lanjutan dari Membuat Workspace Khusus agar Hermes Bekerja Lebih Terarah. Di artikel sebelumnya, saya menjelaskan kenapa Hermes saya pisahkan dari execution plane yang deterministik. Di sini saya menerapkan pola yang sama untuk satu pekerjaan yang lebih konkret: mencatat transaksi keuangan ke spreadsheet Financial Planner.

Masalahnya bukan hanya menulis satu baris

Pencatatan transaksi terlihat sederhana. Saya bisa saja membuka spreadsheet, mencari baris kosong, lalu mengisi nominal dan deskripsi.

Masalahnya muncul ketika pencatatan dilakukan berulang kali:

  • nama kategori harus konsisten;
  • account asal dan tujuan tidak boleh tertukar;
  • transaksi transfer tidak boleh dianggap sebagai income atau expense;
  • piutang baru dan pelunasannya perlu hubungan yang jelas;
  • angka dan tanggal harus memiliki format yang sama;
  • perubahan ke spreadsheet eksternal perlu bisa diaudit;
  • agent tidak boleh menganggap pesan yang ambigu sebagai izin untuk menulis.

Karena itu, saya tidak menjadikan Hermes sebagai spreadsheet editor yang bebas. Hermes memahami pesan dan membantu menyiapkan transaksi. Workspace dan CLI menerapkan aturan, meminta approval, menjalankan write, lalu membaca kembali hasilnya.

Hubungan dengan artikel Hermes workspace

Pola arsitekturnya sama dengan artikel sebelumnya:

Merender diagram...

Hermes berada di sisi percakapan dan routing. CLI menjadi kontrak yang bisa dipanggil secara manual maupun dari scheduler. Spreadsheet tetap menjadi tempat pencatatan, tetapi tidak menerima perubahan langsung dari prompt tanpa lifecycle.

Bentuk input yang saya gunakan

Saya tidak membutuhkan format command yang panjang untuk setiap transaksi. Pesan natural language biasanya sudah cukup, selama field pentingnya jelas.

Contoh:

Bayar makan siang 35.000 dari account utama

Atau:

Terima pembayaran freelance 2.500.000 ke account utama

Pesan tersebut belum langsung menjadi baris spreadsheet. Agent harus menormalkan maksudnya terlebih dahulu dan memastikan informasi yang wajib tidak hilang.

Untuk transaksi yang ambigu, saya lebih memilih bertanya daripada mengarang. Contohnya, jika ada dua account yang namanya mirip, atau kategori tidak dapat dipetakan dengan yakin, proses berhenti di tahap draft.

Metadata selalu dibaca sebelum transaksi

Kategori dan account bukan daftar yang boleh ditebak dari memory percakapan. Sebelum membuat plan, workflow membaca metadata Financial Planner yang sedang aktif.

Secara konsep, metadata tersebut berisi:

  • daftar account yang valid;
  • daftar kategori;
  • aturan cashflow;
  • pilihan field lain yang diwajibkan oleh spreadsheet;
  • konfigurasi setup yang sedang digunakan.

Command yang digunakan:

.venv/bin/kw finance metadata --json

Output JSON menjadi sumber validasi. Jika spreadsheet memakai nama kategori yang berbeda dari istilah sehari-hari, adapter melakukan mapping sesuai metadata, bukan membuat kategori baru secara diam-diam.

Ini juga menjaga workflow dari masalah yang sering terjadi pada spreadsheet personal: kategori yang sama muncul dengan beberapa ejaan, account tujuan masuk ke kolom yang salah, atau transaksi lama memakai nilai yang sudah tidak berlaku.

Memetakan maksud ke cashflow rule

Satu pesan transaksi harus cocok dengan satu cashflow rule. Saya tidak membiarkan satu pesan diproses sebagai beberapa jenis transaksi sekaligus tanpa kejelasan.

Secara konseptual, rule dapat mewakili beberapa jenis berikut:

MaksudContohHal yang harus jelas
ExpenseMembayar makannominal, kategori, account asal
IncomeMenerima pembayarannominal, kategori, account tujuan
TransferMemindahkan uang antar-accountaccount asal dan account tujuan
Piutang baruMeminjamkan uangnominal, kategori, account asal, pihak terkait
Pelunasan piutangSeseorang membayar utangtransaksi piutang asal dan account tujuan

Nama rule dan pilihan field sebenarnya tetap berasal dari metadata live. Tabel ini hanya menjelaskan cara berpikirnya, bukan menggantikan konfigurasi spreadsheet.

Perbedaan account asal dan account tujuan sangat penting. Pada expense, uang keluar dari From Account. Pada income, uang masuk ke To Account. Pada transfer, kedua sisi harus terisi dan transaksi tidak boleh dihitung sebagai pendapatan baru.

Dari pesan menjadi frozen payload

Setelah metadata dan rule cocok, workflow membuat plan. Plan menyimpan payload yang akan dipakai jika saya menyetujui transaksi.

Contoh bentuk konseptualnya:

{
  "cashflow_type": "expense",
  "date": "2026-08-04",
  "description": "Makan siang",
  "amount": 35000,
  "category": "<category-from-live-metadata>",
  "from_account": "<account-from-live-metadata>",
  "to_account": null
}

Nilai account dan kategori pada contoh sengaja tidak ditulis sebagai data nyata. Dalam eksekusi sebenarnya, nilai tersebut harus berasal dari metadata setup yang aktif.

Payload ini kemudian dibekukan bersama action ID dan hash. Setelah approval diberikan, workflow tidak membangun ulang transaksi dari context percakapan. Ia mengeksekusi payload yang sama.

Lifecycle plan, approval, execute, verify

Inilah bagian yang paling saya pertahankan dari desain workspace:

metadata
  → normalize intent
  → match one cashflow rule
  → plan frozen payload
  → show fields for review
  → explicit approval
  → execute spreadsheet write
  → read-back verification

1. Metadata

Workflow mengambil pilihan account, kategori, dan rule terbaru.

2. Normalize intent

Pesan natural language diubah menjadi field terstruktur: jenis cashflow, tanggal, deskripsi, nominal, dan account yang relevan.

3. Plan

CLI membuat durable action. Payload, hash, dan action ID disimpan sebelum ada write eksternal.

4. Review

Saya melihat ringkasan transaksi yang akan dicatat. Ringkasan ini menggunakan bullet agar mudah diperiksa dari Telegram atau mobile:

Jenis: Expense
Tanggal: 2026-08-04
Deskripsi: Makan siang
Nominal: Rp35.000
Kategori: <hasil metadata>
Dari Account: <hasil metadata>

5. Approval

Kata seperti ok atau approve hanya dianggap approval jika konteksnya jelas. Jika ada beberapa draft atau field yang belum pasti, workflow tidak menebak transaksi mana yang dimaksud.

6. Execute

Action yang sudah disetujui dieksekusi menggunakan payload beku. Tidak ada perubahan field secara diam-diam di antara approval dan execute.

7. Verify

Adapter membaca kembali hasil pencatatan atau memeriksa bukti yang disediakan spreadsheet. Status selesai hanya boleh dilaporkan ketika action dan verification sama-sama berhasil.

Kenapa tidak langsung memakai Google Sheets API?

Secara teknis, agent bisa saja memanggil Google Sheets API langsung. Namun pola itu membuat beberapa tanggung jawab tercampur:

  • prompt ikut menentukan struktur spreadsheet;
  • validasi kategori tidak selalu konsisten;
  • approval hanya menjadi kalimat di percakapan;
  • retry dan verification mudah terlewat;
  • perubahan sulit direproduksi dari log.

Dengan CLI, Hermes hanya membutuhkan kontrak sederhana. Contohnya, skill mengarahkan percakapan ke command finance, sedangkan implementasi di workspace menangani metadata, payload, spreadsheet adapter, dan verification.

Hermes skill
      → kw finance metadata
      → kw finance plan
      → explicit approval
      → kw action execute
      → verified transaction result

Skill tetap tipis. Ia menjelaskan kapan workflow dipakai dan aturan apa yang harus dijaga, tetapi tidak menyimpan business logic transaksi di dalam prompt.

Kasus khusus: pelunasan piutang

Pelunasan piutang tidak saya catat sebagai income biasa. Workflow perlu mencari transaksi piutang yang cocok terlebih dahulu.

Contoh pesan:

Andi bayar utang 500.000 ke account utama

Jika ada satu transaksi pada kategori piutang baru yang cocok, workflow dapat memetakan:

  • jenis menjadi pelunasan piutang;
  • kategori mengikuti transaksi piutang asal;
  • account tujuan menjadi account penerima;
  • hubungan dengan transaksi asal dipertahankan.

Jika tidak ada kecocokan tunggal, workflow harus meminta klarifikasi. Mencatatnya sebagai income umum hanya karena uang masuk akan merusak histori dan analisis cashflow.

Apa yang saya lihat dari desain ini

Spreadsheet tetap sederhana bagi manusia, tetapi proses di sekitarnya memiliki boundary yang jelas:

  • Hermes memahami maksud pesan;
  • metadata menjaga pilihan tetap valid;
  • rule membedakan income, expense, transfer, dan piutang;
  • plan membuat perubahan bisa direview;
  • approval mencegah write tanpa izin;
  • adapter mengurus detail spreadsheet;
  • verification memastikan catatan benar-benar tersimpan.

Ini bukan upaya membuat pencatatan lebih rumit. Tujuannya adalah memindahkan kerumitan dari percakapan yang tidak konsisten ke workflow yang dapat diuji.

Batasan dan keamanan

Workflow keuangan tidak boleh menganggap spreadsheet sebagai tempat aman untuk semua hal. Saya tetap menjaga beberapa batas:

  • spreadsheet ID dan credential tidak masuk repository;
  • token OAuth berada di secret storage lokal;
  • data transaksi tidak dikirim ke channel publik;
  • hasil konfirmasi tidak menampilkan total saldo kecuali memang diminta;
  • command read-only dan external write dibedakan;
  • approval tidak boleh dilewati hanya karena scheduler atau agent menganggap transaksi terlihat jelas.

Untuk operasi yang berasal dari email, import job hanya membuat draft atau status pending_review. Deteksi email tidak otomatis menjadi transaksi tercatat.

Penutup

Pencatatan keuangan adalah contoh kecil dari prinsip yang saya jelaskan di artikel Hermes workspace: agent boleh fleksibel dalam memahami tujuan, tetapi eksekusi eksternal perlu kontrak, state, approval, dan bukti.

Dengan pola ini, saya bisa menulis pesan transaksi secara natural tanpa menjadikan spreadsheet sebagai area eksperimen. Hermes membantu saya berbicara dengan sistem. CLI dan adapter memastikan pencatatan mengikuti aturan Financial Planner.

metadata
published
2026-08-04
topic
Hermespersonal financeGoogle Sheetsautomationworkflow
read time
5 min
Terkait