πŸ€– Coding Agent Harness β€” Feedforward & Feedback Controls

Agent Skills sebagai Modular Instructions & Deterministic Quality Gates untuk Self-Correction

Coding agents susut nilai ketika manusia keluar dari loop. Tapi terus-menerus mengawasi 24/7 juga tak realistis. Dua mekanisme β€” feedforward (Agent Skills: modular instructions injected sebelum aksi) dan feedback (deterministic sensors: linter/compiler/test yang trigger auto-correction setelah aksi) β€” membentuk harness engineering yang membuat agent tetap aman dan produktif. Catatan ini membedah keduanya, dari foundation control theory sampai implementasi Hermes skill system dan CI-level feedback loop, merujuk langsung ThoughtWorks Radar Vol.34 (April 2026) blip #7 Agent Skills dan #9 Feedback Sensors.

Hubungan ke Vault


Daftar Isi

  1. Foundation
  2. Technical Deep-Dive
  3. Advanced
  4. Case Studies
  5. Koneksi ke Vault
  6. Referensi
  7. Bottom Line

Foundation

Control theory bicara soal dua mekanisme yang membuat sistem tetap di jalur yang diinginkan:

MekanismeSaat di-applyAnalogi Coding AgentMitigasi Kegagalan
FeedforwardSebelum aksi (sebelum agent menulis kode)Agent Skills: modular instructions dimuat just-in-timeAgent keluar domain β†’ instructions kurang relevan/tak dimuat
FeedbackSetelah aksi (kode udah di-generate)Deterministic sensors: compiler, linter, type-checker, test suiteSensor true-negative (test pass tapi logic salah) β†’ over-reliance pada test coverage
Open-loopTanpa kontrol”Vibe coding” β€” agent generate, human shipDrift, cognitive debt, codebase rot
Closed-loopInput pada outputAgent + sensor + auto-correction, human review only on sensor failureSensor noise β†’ agent repair phantom issues

Plot twist pertama: feedforward dan feedback bukan pesaing. Mereka koma-kompositional β€” feedforward mengurangi expected work, feedback mengeliminasi unexpected errors. Skip feedforward β†’ agent banyak trial-and-error untuk masalah yang udah solved (instruction udah ada ditulis di skill). Skip feedback β†’ agent over-confidently ship broken code meski skill udah di-load.

Analogi konkret: imagine mobil self-driving. High-definition map (ter-embed di route planning) = feedforward. Camera, lidar, IMU real-time = feedback. Map telat update β†’ mobil butuh feedback sensor untuk deteksi kondisi baru; feedback sensor telat β†’ mobil relu pada map tapi bisa salah ambil jembatan yang udah di-renovasi. Begitu pula coding agent: skill (feedforward) β€œingatkan” dia soal project conventions; sensor (feedback) β€œcek” ulang setelah dia generate.

ThoughtWorks Radar Vol.34 (April 2026) menempatkan keduanya di ring Trial β€” bukan Adopt β€” karena pergeseran adoptability berkembang cepat tapi best-practice standar belum mature di seluruh industry. Let’s deep-dive masing-masing.


Technical Deep-Dive

Agent Skills sebagai Feedforward Control

Definisi (ThoughtWorks Radar Vol.34 blip #7): β€œAgent Skillsβ€”curated, modular sets of instructions that can be loaded into an agent’s context on demandβ€”have emerged as a major advancement. They allow teams to modularize instructions and conventions, loading them just in time rather than dumping everything into a single monolithic system prompt.”

Arsitektur: Monolithic System Prompt vs Modular Skills

LEGACY:            MODULAR (Agent Skills):
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ System   β”‚       β”‚  System  β”‚  β”‚ Skill A  β”‚  β”‚ Skill B  β”‚
β”‚ Prompt   β”‚       β”‚  Prompt  β”‚  β”‚ (loaded  β”‚  β”‚ (loaded  β”‚
β”‚ (50KB)   β”‚       β”‚  (3KB)   β”‚  β”‚  JIT)    β”‚  β”‚  JIT)    β”‚
β”‚ +        β”‚       β”‚ +        β”‚  β”‚          β”‚  β”‚          β”‚
β”‚ every    β”‚       β”‚  Router  β”‚  β”‚  SKILL.mdβ”‚  β”‚  SKILL.mdβ”‚
β”‚ rule     β”‚       β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
β”‚          β”‚            β”‚             β”‚             β”‚
β”‚  β†’ slow  β”‚            └─ router pick skill β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚  β†’ token β”‚
β”‚    burn  β”‚            β–Ό
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                   β”‚  Agent   β”‚  ← rich context, low token burn
                   β”‚  Action  β”‚
                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Token math sederhana: kalau system prompt 50KB β‰ˆ 12K tokens, setiap inference call burn 12K tokens buat prompt overhead. Dengan skill modular (3KB system + 2KB skill), only 1.25K tokens β€” ~90% hemat pada repetitive calls.

Anatomy of an Agent Skill

Sebuah Agent Skill punya 3 komponen wajib sesuai Hermes Agent & Anthropic Claude Code convention:

  1. SKILL.md β€” frontmatter YAML + body markdown. Frontmatter fields:
FieldRequiredFungsi
nameβœ…Lowercase, hyphen-separated, max 64 char
descriptionβœ…Trigger condition sebagai natural language β€” agent router baca ini untuk match user intent
platformsnoOS filter (linux/macos/windows)
tagsnoMulti-tag untuk discovery
metadatanoExtended attributes objek
related_skillsnoCross-skill navigation hint
---
name: agent-skills-feedback-sensors
description: "Use when user wants to set up harness engineering, modular agent skills, or feedback-loop CI for coding agents"
tags: [coding-agent, harness, ci, quality-gates]
metadata:
  hermes:
    skill_version: "1.0.0"
    minimum_hermes_version: "2.x"
related_skills:
  - test-driven-development
  - claude-code
platforms: [linux]
---
  1. Body Markdown β€” SKILL.md body berisi:

    • Trigger conditions (kapan invoke)
    • Numbered steps dengan exact commands (bukan vague β€œconfigure properly”)
    • Pitfalls section (error messages yang sering muncul + fix)
    • Verification steps (bukan-asumsi check)
  2. Linked files (fungsi modularitas):

    • references/ β€” Dokumen pendukung (API specs, deep dives)
    • templates/ β€” Boilerplate (.env.example, CLAUDE.md.hbs)
    • scripts/ β€” Executable shell/Python (auto-verification, sync)
    • assets/ β€” Static binary (icons, sample inputs)

Feedback Sensors sebagai Deterministic Quality Gates

Definisi (Radar blip #9): β€œTo make coding agents more effective and reduce the need for human supervision, teams are integrating deterministic quality gatesβ€”compilers, linters, type checkers, and test suitesβ€”directly into agent workflows so failures trigger auto-correction before human review.”*

Taxonomy of Sensors

KategoriMekanismeContohLatensiFalse Positive
Static analysisParse AST tanpa executeRust analyzer, ESLint, mypy, typerms-secondRendah
Type checkCompile-time type inferencecargo check, tsc, pyrightsecondSangat rendah
Unit/Integration testExecute code dengan fixturespytest, cargo test, Jestsecond-minuteModerate (mock drift)
Mutation testingInject bug ke codebase, cek test catchcargo-mutants (Radar blip #71), mutmut, Strykerminute-hourTinggi (early signal)
Fuzz testingGenerate malformed inputWuppieFuzz (Radar blip #96), AFL, libFuzzerhour-dayTinggi (novel paths)
Static quality metricsCode complexity, duplicationCodeScene (Radar blip #81), SonarQubesecond-minuteModerate
Formal verificationMathematical proof of propertyDafny, Coq, Lean, Kani (Rust)hour-daySangat rendah

Plot twist kedua: Mutation testing lebih jujur dari coverage. Coverage 100% dengan weak assertions = theater. Mutation testing inject bug, jika test gak catch β†’ assertion lemah. Ini yang membuat Radar Vol.34 meng-Adopt Mutation Testing (#11 Trial) sebagai bagian dari feedback sensor stack.

Code Example: Hermes Auto-Verification Pattern

# Hermes skill: write-file β†’ auto syntax check β†’ on-failure auto-repair
#!/usr/bin/env bash
# scripts/verify-and-repair.sh β€” Handcrafted pattern Hermes uses
set -euo pipefail
 
FILE="$1"                          # arg 1: file yang baru di-write
EXT="${FILE##*.}"
 
# 1. Syntax check by extension
case "$EXT" in
  py)  python3 -c "import ast; ast.parse(open('$FILE').read())" 2>&1 | head -5 ;;
  rs)  rustc --edition 2021 --crate-type lib "$FILE" -o /tmp/check 2>&1 | head -5 ;;
  ts)  tsc --noEmit "$FILE" 2>&1 | head -5 ;;
  go)  gofmt -l "$FILE" && gopls check "$FILE" 2>&1 | head -5 ;;
  *)   echo "skip: no sensor for $EXT" ;;
esac
 
# 2. Kalau failed, auto-prompt agent dengan error context
if [ -n "${SENSOR_ERR:-}" ]; then
  echo "SENSOR_FAILED"
  echo "$SENSOR_ERR"
  # Hermes akan re-prompt agent dengan error message + file content
  exit 2
fi
 
# 3. Functional smoke test kalau ada tests/fixture
if [ -f "tests/test_$(basename "$FILE" .py).py" ]; then
  pytest "tests/test_$(basename "$FILE" .py).py" -x --tb=short 2>&1 | tail -20
fi
 
exit 0

Pentingnya: set -euo pipefail β€” sensor wajib fail-loud. Silent sensor (set +e) bahaya besar karena agent akan assume semua OK dan lanjut.

Hermes Skill Mechanism (concrete)

Hermes Agent secara native mengimplementasikan Agent Skills. Setiap skill adalah directory ~/.hermes/skills/<name>/ dengan SKILL.md. Hermes inject deskripsi skill ke agent context; agent router mcp__skill_router__list_available_skills() meng-embat matching. Saat user prompt β€œset up Docker reverse proxy”, router match ke skill docker-patterns, load SKILL.md full content ke context, lalu agent pake numbered steps + pitfalls dari skill.

Harness Engineering β€” The Integration

Harness engineering (jadi Martin Fowler buat rubric artikel di martinfowler.com/articles/harness-engineering.html yang ThoughtWorks Radar refer dalam themes Vol.34) adalah istilah umum untuk kombinasi feedforward + feedback controls yang wrapping coding agent.

                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                β”‚                             β”‚
   User ───────►│  FEEDFORWARD LAYER           β”‚
   request      β”‚  - System prompt            β”‚
                β”‚  - Agent Skills (JIT loaded) β”‚
                β”‚  - Spec-driven dev context   β”‚
                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                             β”‚
                             β–Ό
                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                β”‚  AGENT ACTION                β”‚
                β”‚  - Tool call / code write    β”‚
                β”‚  - Filesystem touch          β”‚
                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                             β”‚
                             β–Ό
                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                β”‚  FEEDBACK LAYER              β”‚
                β”‚  - Syntax check (fail-loud)  β”‚
                β”‚  - Type check (fail-fast)    β”‚
                β”‚  - Test suite (fail-honest)  β”‚
                β”‚  - Mutation test (fail-true) β”‚
                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                β”‚ Sensor outcome?   β”‚
                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
            β–Ό                           β–Ό
       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
       β”‚  PASS    β”‚               β”‚   FAIL   β”‚
       β”‚  β†’ human β”‚               β”‚  β†’ self- β”‚
       β”‚    reviewβ”‚               β”‚    repairβ”‚
       β”‚    only  β”‚               β”‚  (retry  β”‚
       β”‚          β”‚               β”‚   sensor)β”‚
       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Key invariant: human review hanya di-trigger kalau sensor PASS. Kalau sensor FAIL, agent tidak boleh bounce ke human; dia wajib self-correct (retry) dengan feedback sensor sebagai context baru. Ini yang disebut β€œputting coding agents on a leash” β€” ThoughtWorks Radar Vol.34 themes #4.


Advanced

Agent Instruction Bloat (Radar #34, Caution)

β€œContext files such as AGENTS.md and CLAUDE.md tend to grow organically, accumulating outdated instructions, contradictory directives, and scope creep. Over time, this degrades agent performance because the agent wastes tokens processing stale or irrelevant rules.”

Mitigasi: splits + aliases, bukan grow monolit. Vault Azhar pakai self-skill system:

  • ~/.hermes/skills/hermes-agent/SKILL.md β€” only hermes-agent mechanics
  • ~/.hermes/skills/9router-web-fetch/SKILL.md β€” only web fetch via specific platform
  • Agent instruction hanya load skill spesifik saat trigger condition match

Anti-pattern: CLAUDE.md 8KB dengan bagian β€œRust conventions” + β€œReact conventions” + β€œPython conventions” + β€œdeployment rules”. Skill spindle: satu skill = satu trigger, satu domain.

Progressive Context Disclosure (Radar #12, Trial)

β€œProgressive context disclosure is a technique within agent harness engineering where the agent receives minimal context initially, then requests or loads more as needed based on the task’s progression.”

Ini mengubah Agent Skills dari β€œstatic load” ke β€œjust-enough just-in-time” 2-arah:

  1. Agent menerima trigger keyword + skill name only (summary)
  2. Agent decide apakah skill relevant
  3. Kalau relevant, agent invoke loader untuk dapat full skill content
  4. Kalau perlu deeper, agent baca references/ files on-demand

Hermes skill system sudah menerapkan pattern ini via skill_view(name) tanpa file_path (hanya SKILL.md), lalu agent baca linked files via skill_view(name, file_path="./references/api-spec.md") saat perlu.

MCP by Default (Radar #40, Caution)

β€œAs the Model Context Protocol (MCP) gains traction, teams reach for it as the default integration mechanism. But MCP exposes the agent to external systems and data β€” each tool is an attack surface. Not every integration needs to be an MCP server.”

Agent Skills sebagai controlled alternative:

  • MCP server = runtime integration, agent bisa invoke external system anytime β†’ lethal trifecta (private data + untrusted content + external action)
  • Agent Skill = compile-time instruction, agent lebih constrained karena hanya baca, tidak invoke arbitrary external system

Untuk operasi yang doesn’t need runtime choice (misal: β€œuntuk install package selalu pake uv pip install bukan pip install”), Agent Skill is the better mechanism β€” no MCP server overhead, no runtime exposure.

Skills as Executable Onboarding Documentation (Radar #28, Assess)

Skill bukan cuma untuk agent β€” bisa juga jadi single source of truth untuk onboarding human developer. Skill bernama deploy-prod-checklist yang nge-list numbered steps + pitfalls + verification = bisa dibaca oleh junior dev sebagai runbook yang sama persis yang agent pake.

Double-duty pitfall: kalau audience beda (human vs agent), mungkin perlu skill version terpisah. Audience human lebih butuh β€œkenapa” (reasoning), agent lebih butuh β€œapa” (command). Sebagian vault note Azhar (e.g. ai-assisted-dev-workflow.md) udah experiment dengan format ini.


Case Studies

Studi KasusKonteksTemuan KunciMitigasi Diimplementasi
Hermes Agent hermes-agent skillSkill built-in yang laod setiap session untuk mendokumentasikan hermes CLI mechanicsSkill frontmatter description di-jadikan trigger untuk prompt soal β€œconfiguring hermes”, β€œtroubleshooting hermes tools”Pemisahan description (trigger hint, 1 kalimat) vs body (numbered commands) β€” router match cepat, skill body loading just-in-time
Superpowers + Claude Code plugin marketplaceThoughtWorks Radar blip #72 (Trial) #115 Superpowers catalogDistribusi skill via plugin marketplace β†’ skill journey dari author β†’ consumer. Testing skill requires sandboxed environmentSkill packaging dengan manifest.json, versioning semver, trust establishment via maintainer repo + checksum verification
cargo-mutants in Rust CI loopThoughtWorks Radar blip #71 (Trial) β€” mutation testing untuk RustCoverage 100% but weak assertions. cargo-mutants inject bug β†’ identify test tidak catch. False positive tinggi early-stage, filter via baseline neededIntegration sebagai weekly CI job (bukan per-commit) untuk turunkan noise. Threshold: mutasi caught > 80%
WuppieFuzz untuk REST API agent outputThoughtWorks Radar blip #96 (Assess) β€” fuzzer untuk REST APIsAgent yang generate curl commands ke API butuh fuzzing untuk ensure response schema tidak hallucinatedWuppieFuzz sebagai post-action sensor: agent invoke API β†’ WuppieFuzz re-invoke dengan mutated input β†’ compare response, alert kalau mismatch
OpenClaw akibat Codebase Cognitive DebtThoughtWorks Radar blip #97 (Caution) + #36 Codebase Cognitive DebtOpen-source autonomous agent proyek β€” kode di-generate cepat tapi gap pemahaman pengembang akumulasi β†’ maintainer struggle debugForce plugin marketplace dengan mandatory RATIONALE.md per submission; mutation testing untuk catch weak assertions; skills-based modularization bukan monolithic agent

Koneksi ke Vault


Referensi

  1. ThoughtWorks Technology Radar Vol.34 (April 2026). https://www.thoughtworks.com/content/dam/thoughtworks/documents/radar/2026/04/tr_technology_radar_vol_34_en.pdf
  2. ThoughtWorks Radar blip #7 Agent Skills. https://www.thoughtworks.com/radar/techniques/agent-skills
  3. ThoughtWorks Radar blip #9 Feedback Sensors for Coding Agents. https://www.thoughtworks.com/radar/techniques/feedback-sensors-for-coding-agents
  4. ThoughtWorks Radar blip #34 Agent Instruction Bloat (Caution). https://www.thoughtworks.com/radar/techniques/agent-instruction-bloat
  5. ThoughtWorks Radar blip #12 Progressive Context Disclosure. https://www.thoughtworks.com/radar/techniques/progressive-context-disclosure
  6. ThoughtWorks Radar blip #28 Skills as Executable Onboarding Documentation. https://www.thoughtworks.com/radar/techniques/skills-as-executable-onboarding-documentation
  7. ThoughtWorks Radar blip #40 MCP by Default (Caution). https://www.thoughtworks.com/radar/techniques/mcp-by-default
  8. ThoughtWorks Radar blip #11 Mutation Testing β€” paling jujur signal. https://www.thoughtworks.com/radar/techniques/mutation-testing
  9. ThoughtWorks Radar blip #71 cargo-mutants. https://www.thoughtworks.com/radar/tools/cargo-mutants
  10. ThoughtWorks Radar blip #96 WuppieFuzz. https://www.thoughtworks.com/radar/tools/wuppiefuzz
  11. ThoughtWorks Radar blip #81 CodeScene. https://www.thoughtworks.com/radar/tools/codescene
  12. ThoughtWorks Radar blip #72 Claude Code plugin marketplace. https://www.thoughtworks.com/radar/tools/claude-code-plugin-marketplace
  13. ThoughtWorks Radar blip #115 Superpowers. https://www.thoughtworks.com/radar/languages-and-frameworks/superpowers
  14. ThoughtWorks Radar blip #97 OpenClaw (Caution). https://www.thoughtworks.com/radar/tools/openclaw
  15. ThoughtWorks Radar blip #36 Codebase Cognitive Debt (Caution). https://www.thoughtworks.com/radar/techniques/codebase-cognitive-debt
  16. Martin Fowler, β€œHarness Engineering: Putting Coding Agents on a Leash”. https://martinfowler.com/articles/harness-engineering.html
  17. Simon Willison, β€œThe Lethal Trifecta”. https://simonwillison.net/2025/Jun/16/the-lethal-trifecta/
  18. Anthropic, β€œAgent Skills Documentation”. https://docs.anthropic.com/en/docs/agents-and-tools/agent-skills
  19. Hermes Agent skill spec. https://hermes-agent.nousresearch.com/docs/skills
  20. Model Context Protocol (MCP) Specification. https://modelcontextprotocol.io/
  21. Hermes Agent β€” Skills router MCP. mcp__skill_router__list_available_skills
  22. Anthropic, β€œClaude Code Plugin Marketplace β€” Protocol”. https://docs.anthropic.com/en/docs/claude-code/plugins
  23. OpenSpec Specification. https://github.com/openspec-dev/openspec
  24. GitHub Spec-Kit. https://github.com/github/spec-kit
  25. JarsWAF coding conventions (internal). rust-systems-programming-tooling-keamanan

Bottom Line

Agent Skills + feedback sensors = harness engineering β€” kontrol ganda untuk coding agents yang produktif. Hanya pakai monolithic system prompt itu teknologi 2024; pakai modular skills yang loaded JIT itu konsep 2025; tapi gabung feedforward (skill) dengan feedback (sensor) yang fail-loud baru engineering disiplin 2026 ke atas. Mulai kecil: satu skill untuk satu pain domain, satu sensor untuk satu failure mode. Dari situ loop-powered self-correction akan tumbuh organik. Jangan lupa sensor yang baik = set -euo pipefail, bukan set +e silent-passer. Coverage tanpa mutation testing = theater; mutation testing tanpa human reason = noise. Kombinasi mereka β€” plus skill untuk pandu reasoning awalnya β€” itulah harness.