Harness Engineering: Kenapa Aturan di Markdown Tidak Cukup

Abd. Asis
Harness Engineering: Kenapa Aturan di Markdown Tidak Cukup

Senin pagi, agent diminta menambah satu endpoint. Hasilnya rapi. Selasa, agent diminta hal serupa, hasilnya beda: file ditaruh di folder lain, format error berbeda, dan tidak ada test. Rabu, agent diminta melanjutkan pekerjaan Senin, dan dia mengabaikan keputusan yang sudah diambil dua hari sebelumnya.

Tidak ada satu pun dari kejadian itu yang disebabkan model yang buruk. Semuanya disebabkan hal yang sama: aturan proyek hanya ditulis sebagai permintaan di sebuah file markdown, dan permintaan tidak bisa menegakkan apa pun.

Di sinilah konsep harness masuk. Bukan cara menulis prompt yang lebih panjang, tapi cara membangun lingkungan tempat agent bekerja: batasan yang ditegakkan mesin, memori yang tidak hilang antar sesi, dan verifikasi yang tidak bisa dilewati.

Analogi yang menjelaskan namanya

Harness adalah perlengkapan yang dipasang pada kuda: pelana, kekang, dan tali kendali. Kuda punya tenaga jauh lebih besar dari penunggangnya, tapi tanpa perlengkapan itu tenaganya tidak terarah.

Agent AI mirip sekali. Kemampuannya besar, tapi dia tidak tahu ke mana harus pergi tanpa struktur yang mengarahkan. Markdown berisi aturan hanya memberitahu arah. Harness memberi arah itu bentuk: pagar yang tidak bisa dilewati, jejak yang bisa dibaca ulang, dan pemeriksaan yang menolak hasil kerja yang belum memenuhi syarat.

Satu definisi kerja yang saya pakai: setiap kali agent melakukan kesalahan, jangan hanya memperbaiki hasilnya. Ubah lingkungan supaya kesalahan yang sama tidak bisa terulang.

Tiga tahap yang hampir semua tim lewati

Perkembangan ini terjadi cukup cepat, dan sebagian besar tim melewati tahapannya berurutan tanpa menyadarinya.

TahapIsiYang masih kurang
Aturan satu filesatu CLAUDE.md atau AGENTS.md berisi stack dan konvensiaturan hanya permintaan, konteks hilang antar sesi
Aturan dipecahfolder rules/ per topik, standar lintas tooltidak ada penegakan, urutan kerja masih improvisasi
Harnessaturan plus skill, hook, memori, loop verifikasibutuh disiplin merawat

Tahap pertama terasa seperti lompatan besar karena hasil pertama biasanya bagus. Masalahnya muncul saat proyek membesar: kualitas jadi bervariasi, sesi terputus, dan daftar skill menumpuk sampai tidak ada yang tahu urutan menjalankannya.

Tahap kedua memperbaiki kerapian, tapi menambah satu ilusi: karena aturannya sudah ditulis dengan rapi, kita merasa aturan itu berlaku. Padahal tidak ada yang memeriksa.

Empat bagian harness

Harness bukan satu alat. Dia tersusun dari empat bagian yang saling menutup.

1. Skill: prosedur, bukan pengetahuan

Pengetahuan menjawab "apa". Skill menjawab "bagaimana, dalam urutan apa, dan bagaimana tahu sudah selesai".

Skill yang berguna punya bentuk yang khas: kapan dipakai, langkah bernomor dengan perintah persis, jebakan yang sudah diketahui, dan cara memverifikasi hasilnya.

MDMARKDOWN
---
name: tambah-endpoint
description: Pakai ketika menambah endpoint API baru di proyek ini.
---

# Menambah endpoint API

## Kapan dipakai
Permintaan berisi "tambah endpoint", "buat API", atau "buat route baru".

## Langkah
1. Tulis test permintaan lebih dulu di `tests/Feature/`.
2. Buat FormRequest dengan aturan validasi.
3. Buat controller yang hanya memanggil service.
4. Daftarkan route di `routes/api.php`, kelompokkan sesuai modul.
5. Jalankan `php artisan test --filter=NamaTest`.

## Jebakan
- Jangan menyimpan logika di controller; service sudah ada untuk itu.
- Format error mengikuti `App\Support\ApiResponse`, jangan bikin format baru.

## Verifikasi
- Test lulus.
- `composer types:check` bersih.

Perhatikan bagian verifikasi. Skill tanpa kriteria selesai akan dianggap selesai saat agent merasa sudah, bukan saat buktinya ada.

Kesalahan umum: menulis dua puluh skill sekaligus. Mulai dari dua yang paling sering dipakai, lalu tambah satu setiap kali ada kesalahan yang berulang.

2. Hook: aturan yang ditegakkan mesin

Hook adalah titik di mana lingkungan menolak, bukan mengingatkan. Dia berjalan otomatis pada kejadian tertentu: setelah file disimpan, sebelum perintah shell dijalankan, sebelum commit.

{}JSON
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          { "type": "command", "command": "python3 .harness/format_and_lint.py" }
        ]
      }
    ],
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          { "type": "command", "command": "python3 .harness/guard_danger.py" }
        ]
      }
    ]
  }
}

Isi skripnya bisa sesederhana ini:

PythonPYTHON
"""Tolak perintah yang menyentuh database produksi tanpa izin eksplisit."""
import json, sys

perintah = json.load(sys.stdin).get("tool_input", {}).get("command", "")
terlarang = ("migrate:fresh", "db:wipe", "DROP DATABASE", "TRUNCATE")

if any(kata in perintah for kata in terlarang):
    print("Ditolak: perintah destruktif butuh persetujuan manusia.", file=sys.stderr)
    sys.exit(2)  # exit 2 = blokir, bukan cuma peringatan

Tiga hook yang paling cepat memberi hasil:

  • format dan lint setelah file ditulis, supaya tidak ada lagi commit yang isinya cuma memperbaiki spasi
  • pola berbahaya sebelum perintah dijalankan: console.log, kredensial hardcoded, perintah destruktif
  • cek tipe atau build sebelum tugas dinyatakan selesai

Batasannya jelas: hook yang terlalu banyak akan melambatkan setiap langkah, dan hook yang salah akan memblokir pekerjaan yang sah. Mulai dari tiga, bukan tiga puluh.

3. Memori: ditulis di luar, bukan diandalkan di dalam

Konteks model hilang antar sesi. Itu bukan bug yang akan diperbaiki, itu sifat alatnya. Jadi keputusan penting harus ditulis ke berkas yang bisa dibaca ulang.

Yang layak ditulis:

  • keputusan arsitektur beserta alasannya, misalnya "autentikasi memakai NextAuth karena sesi sudah ada di reverse proxy"
  • konvensi yang tidak terlihat dari kode, misalnya "semua nominal disimpan dalam integer rupiah"
  • hal yang sudah dicoba dan gagal, supaya tidak diulang

Yang tidak layak ditulis: daftar aktivitas harian, isi commit, dan progres yang bisa dibaca dari git log.

MDMARKDOWN
# progress.md

## Keputusan
- 2026-11-04: autentikasi memakai NextAuth, bukan JWT buatan sendiri.
  Alasan: sesi sudah dikelola reverse proxy, dan refresh token sudah ada.
- 2026-11-06: nominal disimpan sebagai integer rupiah, tanpa desimal.

## Gagal dicoba
- 2026-11-07: migrasi kolom uang ke `numeric(12,2)` membuat laporan lama melambat 3x.

## Berikutnya
- Endpoint refund belum punya test idempotensi.

Struktur seperti ini membuat agent di sesi baru bisa mulai dari keputusan, bukan dari nol.

4. Loop verifikasi: definisi selesai yang tidak bisa ditawar

Bagian ini yang paling sering dilewati karena terasa lambat. Padahal tanpa ini, harness hanya menambah dokumentasi.

Tugas dianggap selesai hanya kalau semuanya benar:

BashBASH
php artisan test
composer types:check
npm run build

Kalau salah satu gagal, tugas belum selesai. Titik. Tidak ada negosiasi "nanti saya perbaiki di commit berikutnya", karena commit berikutnya biasanya tidak datang.

Kiat praktis: buat satu skrip tunggal yang menjalankan ketiganya, lalu minta agent selalu memanggil skrip itu. Satu perintah lebih mudah diingat daripada tiga, dan lebih mudah dipasang di hook.

Bedanya saat mengerjakan satu tugas nyata

Saya pakai satu tugas yang sama, "tambahkan API autentikasi", untuk melihat bedanya.

AspekHanya aturan markdownDengan harness
Keputusan lamadiabaikan, agent memilih pola sendiridibaca dari catatan keputusan, dipatuhi
Urutan kerjabervariasi antar sesimengikuti skill, jenis lalu logika lalu endpoint lalu test
Kebocoran rahasiaketahuan saat review manusiaditolak hook sebelum file tersimpan
Format errorberbeda dari endpoint laindipaksa memakai helper yang sudah ada
Testtidak adawajib, karena gate verifikasi
Kondisi akhir"kelihatannya jalan"terbukti lulus test, tipe, dan build

Perbedaan paling penting bukan pada satu baris hasil, tapi pada siapa yang menemukan masalah. Tanpa harness, manusia yang menemukan. Dengan harness, mesin yang menemukan lebih dulu, saat biaya perbaikannya masih rendah.

Membangun harness dalam satu hari

Kalau kamu ingin mulai besok, urutan ini cukup:

  1. Tulis satu berkas keputusan. Isi lima keputusan arsitektur terakhir beserta alasannya. Ini yang paling cepat memberi dampak.
  2. Pasang tiga hook. Format dan lint setelah menulis file, penolakan perintah destruktif, dan cek tipe sebelum selesai.
  3. Tulis dua skill. Pilih dua tugas yang paling sering kamu minta ke agent, lalu catat langkahnya persis seperti kamu mengerjakannya sendiri.
  4. Buat satu skrip verifikasi. Satu perintah yang menjalankan test, tipe, dan build.
  5. Kerjakan satu tugas nyata dari awal sampai selesai dengan harness itu. Catat di mana agent tersandung.
  6. Tambahkan satu guardrail untuk setiap kesalahan. Aturan baru hanya lahir dari kesalahan yang benar-benar terjadi, bukan dari daftar keinginan.

Langkah keenam yang membuat harness tumbuh. Harness yang baik tidak dirancang sekali jadi, dia menumpuk dari pengalaman.

Kesalahan yang membuat harness gagal

Hook terlalu banyak. Setiap hook menambah waktu dan titik gagal. Kalau agent butuh sepuluh menit hanya untuk memulai, orang akan mematikan hook-nya.

Skill terlalu panjang. Skill setebal dokumen tidak akan dibaca sampai selesai. Kalau perlu lebih dari satu halaman, pecah jadi dua skill.

Memori berubah jadi buku harian. Kalau catatan berisi semua yang terjadi, tidak ada yang bisa menemukan keputusan penting di dalamnya.

Verifikasi yang bisa dilewati. Begitu ada satu tugas yang lolos tanpa test, standarnya sudah turun untuk semua tugas berikutnya.

Aturan yang saling bertentangan. Dua aturan yang bertabrakan membuat agent memilih salah satunya secara acak, dan hasilnya jadi tidak bisa diprediksi.

Harness tidak menggantikan penilaian manusia. Dia memindahkan pekerjaan manusia dari memeriksa hal yang bisa diperiksa mesin, ke memeriksa hal yang butuh pertimbangan: apakah masalahnya benar, apakah desainnya masuk akal, apakah biayanya sepadan.

Cara mengukur apakah harness-mu bekerja

Jangan menilai harness dari seberapa rapi berkasnya. Nilai dari empat angka:

MetrikTarget sehat
Kesalahan yang sama terulangnol setelah guardrail dipasang
Waktu dari tugas mulai sampai semua gate hijaumenurun tiap bulan
Waktu review manusia per pull requestmenurun
Jumlah commit perbaikan setelah reviewmenurun

Kalau keempatnya tidak bergerak setelah sebulan, harness-mu kemungkinan hanya dokumentasi yang rapi. Itu bukan kegagalan fatal, tapi tanda bahwa bagian penegakan dan verifikasi belum benar-benar berjalan.

Penutup

Di dunia agent AI, yang membedakan tim bukan panjang prompt atau model terbaru. Yang membedakan adalah apakah lingkungannya dirancang untuk menolak hasil yang buruk, atau hanya berharap hasilnya baik.

Tiga prinsip yang bisa kamu bawa pulang:

  • aturan ditegakkan mesin, bukan diminta lewat tulisan
  • memori ditulis di luar agent, bukan diandalkan di dalam konteks
  • rancang dengan asumsi kegagalan akan terjadi, dan pastikan pemulihannya murah

Mulailah dari satu berkas keputusan dan tiga hook. Dalam beberapa hari, kamu akan melihat sendiri bedanya: agent berhenti mengulang kesalahan yang sama, dan waktumu pindah dari memperbaiki hasil menjadi memutuskan hal yang lebih penting.

Abd. Asis
Ditulis oleh
Abd. Asis

Software Developer dari Madura. Menulis tentang PHP, Laravel, dan pengembangan web modern dalam Bahasa Indonesia.

Artikel Terkait

Tulisan lain yang mungkin menarik buatmu.

Kenalan dengan REA: Reverse Engineer Anything untuk Agent AI
reverse-engineeringai

Kenalan dengan REA: Reverse Engineer Anything untuk Agent AI

REA menyambungkan agent ke binary yang sudah kehilangan source code. Ini kegunaannya, dampak baik dan buruknya, serta biaya yang benar-benar harus dibayar.

Abd. Asis
AI Tidak Menghapus Developer, Dia Mengubah Bentuknya
aikarier

AI Tidak Menghapus Developer, Dia Mengubah Bentuknya

Empat ratus baris diff saya setujui, tes hijau, tapi satu pengecekan null hilang. Yang rusak bukan pengetahuan saya, melainkan otot membaca kode.

Abd. Asis
Developer Terbaik Bukan Penulis Kode Terbaik
aispec-driven-development

Developer Terbaik Bukan Penulis Kode Terbaik

Nilai developer bergeser dari kecepatan menulis kode ke presisi niat dan ketelitian verifikasi. Ini bukti datanya, skill yang naik dan turun, serta cara menyiapkan diri dan tim.

Abd. Asis
Saat AI yang Menulis Kode, Programmer Harus Ngapain?
aikarier

Saat AI yang Menulis Kode, Programmer Harus Ngapain?

Produktivitas dari AI membuat banyak programmer malah burnout: semua dikerjakan sekaligus, konteks hilang, review jadi asal. Ini dua pekerjaan yang jauh lebih layak dilakukan sementara agent berjalan.

Abd. Asis
Lima Kebiasaan Prompting Claude yang Sudah Kedaluwarsa
claudeprompt-engineering

Lima Kebiasaan Prompting Claude yang Sudah Kedaluwarsa

Sebagian trik prompting yang dulu membuat Claude lebih patuh sekarang malah mengganggu. Ini lima kebiasaan yang perlu dilonggarkan atau justru diperketat, beserta alasan di baliknya.

Abd. Asis
Menjalankan Claude Code Seperti Tech Lead, Bukan Senior Engineer
claude-codeai

Menjalankan Claude Code Seperti Tech Lead, Bukan Senior Engineer

Empat sesi Claude Code berjalan bersamaan mengubah cara kerja: dari pair programming menjadi memimpin tim agent. Ini alur kerja, batas, dan kebiasaan yang membedakannya.

Abd. Asis