@htechcs/harness-kit 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.en.md +139 -0
- package/README.md +138 -0
- package/bin/cli.js +182 -0
- package/docs/harness-engineering-tutorial.en.md +322 -0
- package/docs/harness-engineering-tutorial.md +322 -0
- package/package.json +38 -0
- package/skills/init-harness/SKILL.md +121 -0
- package/templates/agents/README.md +43 -0
- package/templates/agents/repo-explorer.md +27 -0
- package/templates/evals/README.md +51 -0
- package/templates/evals/cases/example-task.md +33 -0
- package/templates/evals/observability.md +42 -0
- package/templates/guardrails/README.md +120 -0
- package/templates/long-running/README.md +48 -0
- package/templates/long-running/TASK.md +33 -0
- package/templates/mcp-audit.md +26 -0
- package/templates/new-worktree.sh +35 -0
- package/templates/settings.json +24 -0
- package/templates/setup.sh +51 -0
- package/templates/spec/FEATURE.md +40 -0
- package/templates/spec/README.md +34 -0
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
# Harness Engineering cho Team — Tutorial thực chiến (Claude Code & Codex)
|
|
2
|
+
|
|
3
|
+
**Tiếng Việt** · [English](harness-engineering-tutorial.en.md)
|
|
4
|
+
|
|
5
|
+
> Dành cho dev đã quen dùng AI coding agent, muốn hiểu sâu *vì sao* agent lúc tốt lúc tệ và *làm gì* để nó đáng tin cậy hơn.
|
|
6
|
+
> Tài liệu này là bản tinh gọn + thực hành, dựa trên các nguồn trong [Awesome Harness Engineering](https://github.com/walkinglabs/awesome-harness-engineering/blob/main/README.md). Mỗi phần đều có link đọc sâu.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Mục lục
|
|
11
|
+
|
|
12
|
+
1. [Harness Engineering là gì — và tại sao bạn cần nó](#1-harness-engineering-là-gì--và-tại-sao-bạn-cần-nó)
|
|
13
|
+
2. [Mô hình tư duy: 6 trụ cột của harness](#2-mô-hình-tư-duy-6-trụ-cột-của-harness)
|
|
14
|
+
3. [Trụ cột 1 — Context & Working State](#3-trụ-cột-1--context--working-state)
|
|
15
|
+
4. [Trụ cột 2 — Repo-local instructions & Specs (CLAUDE.md / AGENTS.md)](#4-trụ-cột-2--repo-local-instructions--specs-claudemd--agentsmd)
|
|
16
|
+
5. [Trụ cột 3 — Tools & Environment](#5-trụ-cột-3--tools--environment)
|
|
17
|
+
6. [Trụ cột 4 — Guardrails & Safe Autonomy](#6-trụ-cột-4--guardrails--safe-autonomy)
|
|
18
|
+
7. [Trụ cột 5 — Long-running, Orchestration & Resumability](#7-trụ-cột-5--long-running-orchestration--resumability)
|
|
19
|
+
8. [Trụ cột 6 — Evals & Observability](#8-trụ-cột-6--evals--observability)
|
|
20
|
+
9. [Hands-on: viết CLAUDE.md cho repo bằng `/init-harness`](#9-hands-on-viết-claudemd-cho-repo-bằng-init-harness)
|
|
21
|
+
10. [Checklist áp dụng cho team](#10-checklist-áp-dụng-cho-team)
|
|
22
|
+
11. [Lộ trình đọc thêm](#11-lộ-trình-đọc-thêm)
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 1. Harness Engineering là gì — và tại sao bạn cần nó
|
|
27
|
+
|
|
28
|
+
Ví von dễ nhớ nhất: một chiếc xe đua.
|
|
29
|
+
|
|
30
|
+
- **Model** (Claude, GPT…) = **động cơ**. Mạnh, nhưng tự nó chỉ sinh ra token.
|
|
31
|
+
- **Harness** = **toàn bộ phần còn lại của chiếc xe**: khung, vô-lăng, phanh, đồng hồ, hệ thống nhiên liệu, dây an toàn — tức là tất cả những gì *bao quanh* model để biến nó thành một agent làm được việc thật.
|
|
32
|
+
|
|
33
|
+
> **Harness Engineering** = nghề thiết kế và vận hành cái môi trường bao quanh agent (context, tools, ràng buộc, orchestration, đo lường) để agent làm việc **đáng tin cậy**, đặc biệt với task lập trình dài hơi.
|
|
34
|
+
|
|
35
|
+
Luận điểm cốt lõi của cả ngành: **khi agent code ra kết quả tệ, phần lớn là lỗi harness, không phải lỗi model.** Cùng một model, đổi harness có thể nhảy vọt điểm benchmark — LangChain đã chứng minh điều này bằng số liệu trong [Improving Deep Agents with harness engineering](https://blog.langchain.com/improving-deep-agents-with-harness-engineering/).
|
|
36
|
+
|
|
37
|
+
**Tại sao team code phải quan tâm?** Vì mọi triệu chứng khó chịu khi dùng Claude Code/Codex đều là vấn đề harness:
|
|
38
|
+
|
|
39
|
+
| Triệu chứng team hay gặp | Đây là vấn đề harness về… |
|
|
40
|
+
|---|---|
|
|
41
|
+
| Agent "quên" việc đang làm giữa task dài | Context & working state |
|
|
42
|
+
| Mỗi người dùng agent ra một kiểu, không nhất quán | Repo-local instructions / specs |
|
|
43
|
+
| Agent gọi sai tool, hoặc thiếu tool cần thiết | Tool design & environment |
|
|
44
|
+
| Agent sửa bừa, xoá nhầm, chạy lệnh nguy hiểm | Guardrails & safe autonomy |
|
|
45
|
+
| Task chạy 30 phút thì đứt, không resume được | Orchestration & resumability |
|
|
46
|
+
| Không ai biết agent làm tốt hay tệ | Evals & observability |
|
|
47
|
+
|
|
48
|
+
Đọc nền tảng:
|
|
49
|
+
- [Harness Engineering — Thoughtworks/Martin Fowler](https://martinfowler.com/articles/exploring-gen-ai/harness-engineering.html) — chia harness thành context engineering, architectural constraints, và "garbage collection" chống entropy.
|
|
50
|
+
- [The Anatomy of an Agent Harness — LangChain](https://blog.langchain.com/the-anatomy-of-an-agent-harness/) — agent = model + harness (prompts, tools, middleware, orchestration, runtime).
|
|
51
|
+
- [Skill Issue: Harness Engineering for Coding Agents — HumanLayer](https://www.humanlayer.dev/blog/skill-issue-harness-engineering-for-coding-agents) — bài "đập bàn" rằng kết quả yếu thường là lỗi harness.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 2. Mô hình tư duy: 6 trụ cột của harness
|
|
56
|
+
|
|
57
|
+
Một cách phân rã hàn lâm hơn là **CAR — Control / Agency / Runtime** (từ [position paper về harness layer](https://www.preprints.org/manuscript/202603.1756)): harness vừa *kiểm soát* agent, vừa cấp *quyền hành động*, vừa là *runtime* chạy nó.
|
|
58
|
+
|
|
59
|
+
Nhưng để team áp dụng được, mình dùng 6 trụ cột thực dụng (bám đúng cấu trúc của [README repo này](https://github.com/walkinglabs/awesome-harness-engineering/blob/main/README.md)):
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
┌─────────────────────────────┐
|
|
63
|
+
│ MODEL │
|
|
64
|
+
└─────────────┬───────────────┘
|
|
65
|
+
│
|
|
66
|
+
┌──────────────┬──────────────┼──────────────┬──────────────┐
|
|
67
|
+
│ │ │ │ │
|
|
68
|
+
1. Context 2. Specs/ 3. Tools & 4. Guardrails 5. Orchestration
|
|
69
|
+
& State AGENTS.md Environment & Safety & Resumability
|
|
70
|
+
│ │ │ │ │
|
|
71
|
+
└──────────────┴──────────────┴──────┬───────┴──────────────┘
|
|
72
|
+
│
|
|
73
|
+
6. Evals & Observability
|
|
74
|
+
(đo lường để cải tiến cả 5 cái trên)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Năm trụ cột đầu là *xây dựng* harness. Trụ cột 6 (evals) là *vòng phản hồi* — không đo thì không biết các thay đổi có thật sự tốt lên hay không.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 3. Trụ cột 1 — Context & Working State
|
|
82
|
+
|
|
83
|
+
**Nguyên tắc số 1:** coi context window là **ngân sách bộ nhớ làm việc (working memory budget)**, không phải thùng rác để nhồi mọi thứ vào. Mỗi token đưa vào context đều "loãng" sự chú ý của model. Đây là thông điệp trung tâm của [Effective context engineering for AI agents — Anthropic](https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents).
|
|
84
|
+
|
|
85
|
+
Các kỹ thuật thực chiến (tổng hợp từ [Manus](https://manus.im/blog/Context-Engineering-for-AI-Agents-Lessons-from-Building-Manus) và [OpenHands](https://openhands.dev/blog/openhands-context-condensensation-for-more-efficient-ai-agents)):
|
|
86
|
+
|
|
87
|
+
- **KV-cache locality:** giữ phần đầu prompt (system prompt, instructions) *ổn định, không đổi* giữa các bước → tận dụng cache, rẻ hơn và nhanh hơn. Đừng chèn timestamp/ID ngẫu nhiên vào đầu prompt.
|
|
88
|
+
- **Filesystem làm bộ nhớ ngoài:** thay vì nhồi cả file dài vào context, để agent ghi/đọc file (notes, scratchpad, kết quả trung gian). Context chỉ giữ *con trỏ* tới thông tin, không giữ toàn bộ thông tin.
|
|
89
|
+
- **Giữ lại failure trong context:** khi một lệnh fail, đừng giấu lỗi đi — để agent thấy stack trace để nó tự sửa. Che lỗi = agent lặp lại sai lầm.
|
|
90
|
+
- **Context condensation:** với session dài, nén lịch sử hội thoại nhưng *bảo toàn* mục tiêu, tiến độ, các file quan trọng, và test đang fail.
|
|
91
|
+
- **Backpressure:** đừng để agent đốt context vào việc nhiễu/giá trị thấp (xem [Context-Efficient Backpressure — HumanLayer](https://www.humanlayer.dev/blog/context-efficient-backpressure)).
|
|
92
|
+
|
|
93
|
+
**Trong Claude Code cụ thể:**
|
|
94
|
+
- Context tự được summarize khi dài (compaction) — nên các thông tin quan trọng *phải* nằm ở nơi bền vững (CLAUDE.md, file trong repo), đừng chỉ "nói miệng" trong chat.
|
|
95
|
+
- Dùng **subagents** để cô lập việc tốn context (vd: một agent đi đọc 50 file rồi chỉ trả về kết luận) → context chính không bị ngập.
|
|
96
|
+
- `/clear` khi đổi task để reset working state.
|
|
97
|
+
|
|
98
|
+
Đọc thêm: [Advanced Context Engineering for Coding Agents — HumanLayer](https://www.humanlayer.dev/blog/advanced-context-engineering), [Context Engineering for Coding Agents — Thoughtworks](https://martinfowler.com/articles/exploring-gen-ai/context-engineering-coding-agents.html).
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## 4. Trụ cột 2 — Repo-local instructions & Specs (CLAUDE.md / AGENTS.md)
|
|
103
|
+
|
|
104
|
+
Đây là **đòn bẩy rẻ nhất, hiệu quả nhất** cho một team — và là thứ nên làm đầu tiên.
|
|
105
|
+
|
|
106
|
+
Ý tưởng: thay vì mỗi dev tự "dạy" agent lại từ đầu mỗi lần, ta viết **một file hướng dẫn nằm trong repo** mà agent tự động đọc. Nó là "bộ nhớ chung, bền vững" của team.
|
|
107
|
+
|
|
108
|
+
- **Claude Code** đọc `CLAUDE.md` (ở root repo, và có thể phân tầng theo thư mục con).
|
|
109
|
+
- **Codex** đọc [`AGENTS.md`](https://github.com/agentsmd/agents.md) — một format mở, công cụ-trung lập (Codex, và nhiều agent khác cũng hỗ trợ).
|
|
110
|
+
|
|
111
|
+
> Mẹo cho team dùng *cả hai*: viết nội dung chính một lần, rồi để một file là nguồn thật và file kia symlink/đồng bộ sang. Tránh hai file lệch nhau.
|
|
112
|
+
|
|
113
|
+
**Một file hướng dẫn tốt nên có gì** (theo [Writing a good CLAUDE.md — HumanLayer](https://www.humanlayer.dev/blog/writing-a-good-claude-md)):
|
|
114
|
+
- **Cách build / test / lint / run** — kèm lệnh chạy *một* test đơn lẻ.
|
|
115
|
+
- **Kiến trúc tổng quan** — những thứ cần đọc nhiều file mới hiểu (big picture), không liệt kê từng file.
|
|
116
|
+
- **Quy ước riêng** của codebase mà agent không tự đoán được (naming, format entry, ordering…).
|
|
117
|
+
- **Ràng buộc** ("không sửa file generated", "luôn chạy test trước khi báo xong").
|
|
118
|
+
- **Tránh:** lời khuyên chung chung ("viết code sạch"), liệt kê cây thư mục (agent tự khám phá được).
|
|
119
|
+
|
|
120
|
+
**Spec-driven development** là bước nâng cao: với feature lớn, viết spec rõ ràng *trước*, rồi cho agent thực thi theo spec. Spec mạnh → kết quả ổn định hơn nhiều.
|
|
121
|
+
- [GitHub Spec Kit](https://github.com/github/spec-kit) — toolkit cho spec-driven dev.
|
|
122
|
+
- [Understanding Spec-Driven Development — Thoughtworks](https://martinfowler.com/articles/exploring-gen-ai/sdd-3-tools.html).
|
|
123
|
+
- [12 Factor Agents — HumanLayer](https://www.humanlayer.dev/blog/12-factor-agents) — nguyên tắc vận hành agent production: prompt tường minh, agent *sở hữu* state, pause/resume sạch.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 5. Trụ cột 3 — Tools & Environment
|
|
128
|
+
|
|
129
|
+
Agent hành động qua **tools** (đọc/ghi file, chạy lệnh, gọi API, MCP server). Chất lượng tool quyết định agent gọi đúng hay sai.
|
|
130
|
+
|
|
131
|
+
Nguyên tắc thiết kế tool tốt ([Writing effective tools for agents — Anthropic](https://www.anthropic.com/engineering/writing-tools-for-agents)):
|
|
132
|
+
- Tool ít mà rõ ràng > nhiều tool chồng chéo. Quá nhiều tool làm model "rối tay".
|
|
133
|
+
- Tên + mô tả + schema phải nói rõ *khi nào dùng* và *trả về gì*.
|
|
134
|
+
- Trả về thông tin gọn, đã chắt lọc — đừng đổ raw dump làm ngập context (liên hệ lại trụ cột 1).
|
|
135
|
+
- Lỗi trả về phải *actionable* (gợi ý cách sửa), vì agent đọc lỗi để tự điều chỉnh.
|
|
136
|
+
|
|
137
|
+
**MCP (Model Context Protocol)** — cách chuẩn để cắm tool/nguồn dữ liệu ngoài vào agent (cả Claude Code và Codex đều hỗ trợ). Đọc:
|
|
138
|
+
- [Code execution with MCP — Anthropic](https://www.anthropic.com/engineering/code-execution-with-mcp) — cấp quyền thực thi qua ranh giới tool tường minh, soi được.
|
|
139
|
+
- Benchmark đo chất lượng tích hợp MCP: [MCP Bench](https://github.com/modelscope/MCPBench), [MCPMark](https://github.com/eval-sys/mcpmark).
|
|
140
|
+
|
|
141
|
+
**Environment** = cái "thế giới" agent chạy trong đó (shell, filesystem, container, browser). Harness tốt kiểm soát môi trường này: sandbox để an toàn, và cung cấp đúng công cụ verify (test runner, linter, browser để tự kiểm chứng kết quả).
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## 6. Trụ cột 4 — Guardrails & Safe Autonomy
|
|
146
|
+
|
|
147
|
+
Mục tiêu: cho agent **tự chủ nhiều nhất có thể** mà vẫn **an toàn** — giảm số lần phải bấm "approve" thủ công nhưng không mất kiểm soát.
|
|
148
|
+
|
|
149
|
+
Các kỹ thuật:
|
|
150
|
+
- **Sandboxing & policy:** giới hạn agent chạy trong môi trường cô lập, định nghĩa rõ thao tác nào tự do / nào cần xác nhận. Xem [Beyond permission prompts — Anthropic](https://www.anthropic.com/engineering/claude-code-sandboxing).
|
|
151
|
+
- **Chống prompt injection:** khi agent đọc nội dung ngoài (web, file, issue), nội dung đó có thể chứa "lệnh ẩn" lừa agent. Phòng vệ bằng confirmation mode, analyzer, sandbox, hard policy — xem [Mitigating Prompt Injection — OpenHands](https://openhands.dev/blog/mitigating-prompt-injection-attacks-in-software-agents).
|
|
152
|
+
- **Quality-in-the-loop:** đưa kiểm tra chất lượng *vào trong vòng lặp* (lint/test/typecheck chạy tự động) thay vì review thủ công sau cùng. [Assessing internal quality — Thoughtworks](https://martinfowler.com/articles/exploring-gen-ai/ccmenu-quality.html).
|
|
153
|
+
- **Anchoring tới reference app:** ràng buộc agent bằng ví dụ mẫu cụ thể để output nhất quán. [Anchoring to a reference application — Thoughtworks](https://martinfowler.com/articles/exploring-gen-ai/anchoring-to-reference.html).
|
|
154
|
+
- **Quét rủi ro trước deploy:** [Lurkr](https://github.com/agentveil-protocol/lurkr) — static scanner chạy trong CI để phát hiện rủi ro năng lực agent (credentials lọt vào context LLM, `eval`/subprocess trong `@tool`, MCP endpoint chưa verify…).
|
|
155
|
+
|
|
156
|
+
**Trong Claude Code:** dùng permission modes, allowlist trong `settings.json`, và **hooks** (chạy lệnh tự động trước/sau tool call — vd auto-format, hoặc chặn lệnh nguy hiểm). Đây chính là cách "code hoá" guardrails cho cả team.
|
|
157
|
+
|
|
158
|
+
Mental model về vai trò con người: [Humans and Agents in Software Engineering Loops — Thoughtworks](https://martinfowler.com/articles/exploring-gen-ai/humans-and-agents.html) — con người nên *gia cố harness* thay vì soi từng dòng output.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 7. Trụ cột 5 — Long-running, Orchestration & Resumability
|
|
163
|
+
|
|
164
|
+
Đây là phần "khó và đáng giá" nhất: làm sao agent chạy được task dài *qua nhiều context window* mà không lạc.
|
|
165
|
+
|
|
166
|
+
Bài gốc bắt buộc đọc: [Effective harnesses for long-running agents — Anthropic](https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents). Các pattern chính:
|
|
167
|
+
- **Initializer agent:** một agent khởi tạo dựng sẵn môi trường/scaffolding trước khi agent chính bắt đầu.
|
|
168
|
+
- **Feature list / task state:** một danh sách việc bền vững (ghi ra file) làm "nguồn sự thật" về tiến độ — agent tick dần, context window mới đọc lại để biết đang ở đâu.
|
|
169
|
+
- **`init.sh`:** script chuẩn hoá việc setup môi trường để mọi run đều bắt đầu từ trạng thái sạch, lặp lại được.
|
|
170
|
+
- **Self-verification:** agent tự kiểm chứng kết quả (chạy test, build) trước khi tuyên bố xong.
|
|
171
|
+
- **Handoff artifacts:** khi context sắp đầy, ghi lại "biên bản bàn giao" để context window kế tiếp tiếp tục liền mạch.
|
|
172
|
+
|
|
173
|
+
Xem thêm bản follow-up: [Harness design for long-running application development — Anthropic](https://www.anthropic.com/engineering/harness-design-long-running-apps).
|
|
174
|
+
|
|
175
|
+
**Orchestration patterns:**
|
|
176
|
+
- **Multi-agent:** chia vai (planner, coder, reviewer) và phối hợp có cấu trúc — [How we built our multi-agent research system — Anthropic](https://www.anthropic.com/engineering/multi-agent-research-system).
|
|
177
|
+
- **Ralph pattern:** harness tối giản `while :; do cat PROMPT.md | claude-code; done` — vòng lặp một-task, prompt xếp chồng deterministic, subagent song song có giới hạn. Đọc cho vui mà sâu: [Ralph Wiggum as a Software Engineer](https://ghuntley.com/ralph/).
|
|
178
|
+
- **Framework vs Runtime vs Harness** — phân biệt rạch ròi để biết cái gì thuộc về đâu: [Agent Frameworks, Runtimes, and Harnesses, Oh My! — LangChain](https://blog.langchain.com/agent-frameworks-runtimes-and-harnesses-oh-my/).
|
|
179
|
+
|
|
180
|
+
**Reference implementations để học bằng cách đọc code:**
|
|
181
|
+
- [SWE-agent](https://github.com/SWE-agent/SWE-agent) — coding agent nghiên cứu, harness/prompt/tools/env đều soi được.
|
|
182
|
+
- [deepagents — LangChain](https://github.com/langchain-ai/deepagents) — patterns cho agent dài hơi.
|
|
183
|
+
- [Citadel](https://github.com/SethGammon/Citadel) — harness cho Claude Code & Codex với worktree cô lập, multi-agent, memory bền vững.
|
|
184
|
+
|
|
185
|
+
**Trong Claude Code:** subagents, plan mode, worktree isolation, và TodoWrite (task list bền vững trong session) chính là hiện thân của các pattern trên.
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## 8. Trụ cột 6 — Evals & Observability
|
|
190
|
+
|
|
191
|
+
Không đo thì không cải tiến được. Với agent, "đo" khó hơn code thường vì có *nhiều đường* dẫn tới thành công/thất bại.
|
|
192
|
+
|
|
193
|
+
**Observability — soi cái agent thực sự làm:**
|
|
194
|
+
- **Traces:** ghi lại từng bước (tool call, kết quả, quyết định) để debug và chấm điểm. Chuẩn hoá bằng [OpenTelemetry Semantic Conventions for GenAI](https://opentelemetry.io/docs/specs/semconv/gen-ai/) để trace portable giữa các backend.
|
|
195
|
+
- Công cụ: [AgentOps](https://github.com/AgentOps-AI/agentops) (monitoring, session replay, cost tracking), [agenttrace](https://github.com/luoyuctl/agenttrace) (TUI/CLI local-first audit trace coding-agent: cost spike, tool failure, latency gap, diff giữa các lần thử).
|
|
196
|
+
|
|
197
|
+
**Evals — chấm điểm chất lượng:**
|
|
198
|
+
- Biến trace thật thành eval lặp lại được (JSONL log + deterministic check): [Testing Agent Skills with Evals — OpenAI](https://developers.openai.com/blog/eval-skills/), [How to Evaluate Agent Skills — OpenHands](https://openhands.dev/blog/evaluating-agent-skills).
|
|
199
|
+
- **Trace grading:** chấm trực tiếp trên trajectory cho task nhiều bước — [Trace grading — OpenAI](https://platform.openai.com/docs/guides/trace-grading).
|
|
200
|
+
- Tư duy "đo cái gì khi có nhiều trajectory": [Demystifying Evals for AI Agents — Anthropic](https://www.anthropic.com/engineering/demystifying-evals-for-ai-agents).
|
|
201
|
+
- Framework eval mở: [Inspect AI — UK AISI](https://inspect.aisi.org.uk/) (solver, scorer, sandbox, tool-use, log viewer).
|
|
202
|
+
|
|
203
|
+
**Cảnh báo quan trọng:** cấu hình runtime/hạ tầng có thể làm điểm benchmark dao động *lớn hơn* khoảng cách giữa các model trên leaderboard — tức là "noise hạ tầng" dễ làm bạn kết luận sai. Đọc [Quantifying infrastructure noise in agentic coding evals — Anthropic](https://www.anthropic.com/engineering/infrastructure-noise) trước khi tin một con số.
|
|
204
|
+
|
|
205
|
+
**Benchmarks** (khi muốn so sánh *harness*, không chỉ model): bắt đầu với [SWE-bench Verified](https://www.swebench.com/) (sửa GitHub issue thật) và [Terminal-Bench](https://www.tbench.ai/) (agent terminal-native). Xem cả mục [Benchmarks trong README](https://github.com/walkinglabs/awesome-harness-engineering/blob/main/README.md#benchmarks) để chọn theo loại task.
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## 9. Hands-on: viết CLAUDE.md cho repo bằng `/init-harness`
|
|
210
|
+
|
|
211
|
+
Đây là bài thực hành đầu tiên nên làm với team — đòn bẩy lớn nhất, làm trong 1 buổi. Phần này tập trung `CLAUDE.md` (Claude Code); `AGENTS.md` cho Codex để đợt sau (xem cuối mục).
|
|
212
|
+
|
|
213
|
+
### ⚠️ Đừng auto-generate bằng `/init` mặc định
|
|
214
|
+
|
|
215
|
+
Nguồn chuẩn [Writing a good CLAUDE.md — HumanLayer](https://www.humanlayer.dev/blog/writing-a-good-claude-md) nói thẳng: ***"don't auto-generate with `/init` — carefully craft its contents"***. Lý do: `/init` chỉ **mô tả hiện trạng** repo, còn thiếu hai thứ làm nên "harness" — **Guardrails** (ràng buộc hành vi agent) và **Definition of Done** (bằng chứng để agent tự verify).
|
|
216
|
+
|
|
217
|
+
Team mình đã đóng gói đúng kỷ luật này thành một skill: **`/init-harness`**.
|
|
218
|
+
|
|
219
|
+
### Cách làm (khuyến nghị): gõ `/init-harness`
|
|
220
|
+
|
|
221
|
+
Trong Claude Code, ở repo mục tiêu:
|
|
222
|
+
|
|
223
|
+
```
|
|
224
|
+
/init-harness # hoặc: /init-harness <đường-dẫn-repo>
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Skill sẽ: (1) quét repo điền **WHAT/WHY/HOW** (stack, build/test/run, **lệnh chạy một test**, kiến trúc); (2) hỏi **một lượt** để chốt **Guardrails + Definition of Done** — đúng phần nó không tự đoán được; (3) sinh file theo kỷ luật bên dưới và tự self-check.
|
|
228
|
+
|
|
229
|
+
### File nó sinh ra trông như thế nào
|
|
230
|
+
|
|
231
|
+
```md
|
|
232
|
+
# CLAUDE.md
|
|
233
|
+
|
|
234
|
+
## Repo này là gì
|
|
235
|
+
<WHY + WHAT: 1–3 câu. Cái mà đọc 1 file không ra.>
|
|
236
|
+
|
|
237
|
+
## Build / Test / Run
|
|
238
|
+
- Build / Test toàn bộ / Lint / typecheck: <lệnh>
|
|
239
|
+
- Chạy MỘT test: <lệnh cụ thể copy-paste chạy ngay> ← tăng tốc feedback loop nhất
|
|
240
|
+
(repo không có build/test — vd awesome-list — thì mục này thành cách verify thật,
|
|
241
|
+
ví dụ: kiểm link bằng `curl -sI <url>` trước khi thêm.)
|
|
242
|
+
|
|
243
|
+
## Kiến trúc tổng quan
|
|
244
|
+
<Big picture cần đọc nhiều file mới hiểu. Dùng pointer path/file.ts:42, KHÔNG copy code.>
|
|
245
|
+
|
|
246
|
+
## Quy ước riêng (chỉ cái KHÔNG hiển nhiên)
|
|
247
|
+
<Pattern bắt buộc agent không tự đoán. KHÔNG ghi style/format — để linter lo.>
|
|
248
|
+
|
|
249
|
+
## Guardrails ← /init mặc định KHÔNG có
|
|
250
|
+
- KHÔNG sửa <file/thư mục generated>.
|
|
251
|
+
- LUÔN <chạy test/lint> trước khi báo hoàn thành.
|
|
252
|
+
- Cần xác nhận trước khi: <thao tác nguy hiểm>.
|
|
253
|
+
|
|
254
|
+
## Definition of Done ← /init mặc định KHÔNG có
|
|
255
|
+
Một thay đổi coi là xong khi: <bằng chứng cụ thể — test xanh, build ok, lint sạch>.
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
> **Ví dụ thật (before/after):** [CLAUDE.md của chính repo này](https://github.com/walkinglabs/awesome-harness-engineering/blob/main/CLAUDE.md) được sinh bằng `/init-harness`. Repo là một awesome-list không có build/test, nên mục "HOW" được điều chỉnh thành *verify link + lychee CI* — và có đủ `Guardrails` + `Definition of Done` mà bản `/init` cũ thiếu.
|
|
259
|
+
|
|
260
|
+
### Nguyên tắc viết (trích nguồn chuẩn)
|
|
261
|
+
|
|
262
|
+
Từ [Writing a good CLAUDE.md — HumanLayer](https://www.humanlayer.dev/blog/writing-a-good-claude-md):
|
|
263
|
+
- **"LLMs are stateless functions"** — `CLAUDE.md` là file *duy nhất* nạp vào *mọi* session. Mọi dòng phải xứng đáng.
|
|
264
|
+
- **"Less is more"** — model theo được ~150–200 instruction (system prompt đã chiếm ~50) → giữ file **<300 dòng, nhắm ~60–120**.
|
|
265
|
+
- **"Prefer pointers to copies"** — trỏ `path:line`, đừng copy snippet.
|
|
266
|
+
- **Không nhồi style/convention** — để linter/formatter lo.
|
|
267
|
+
- **Craft, đừng auto-dump** — phân tích để *đề xuất*, rồi chắt lọc.
|
|
268
|
+
|
|
269
|
+
### Dùng chung cho cả Claude Code + Codex (đợt sau)
|
|
270
|
+
|
|
271
|
+
Theo [agents.md](https://agents.md): agent đọc **file gần nhất trong cây thư mục — closest-file-wins** (repo chính của OpenAI có 88 file `AGENTS.md` lồng nhau), nên monorepo dùng root + override theo package (đúng ý "phân tầng" mà `/init-harness` hỏi khi repo lớn). Cách di trú chuẩn: ***"rename existing files to AGENTS.md and create symbolic links for backward compatibility"***.
|
|
272
|
+
|
|
273
|
+
→ Khi tới đợt thêm Codex: đổi nội dung sang `AGENTS.md` làm nguồn thật, rồi `ln -s AGENTS.md CLAUDE.md`. Một nguồn, hai công cụ, không bao giờ lệch.
|
|
274
|
+
|
|
275
|
+
> Chọn chiến lược theo loại codebase: [Greenfield AI, Brownfield AI, and the Vibecode You Just Inherited](https://sawinyh.com/blog/greenfield-vs-brownfield-ai-codebases) — greenfield agent-native, legacy brownfield, và code vừa vibecode xong; mỗi loại cần playbook khác (CLAUDE.md phân tầng, pre-commit hook siết dần, baseline lint).
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## 10. Checklist áp dụng cho team
|
|
280
|
+
|
|
281
|
+
Dán cái này vào wiki nội bộ. Đi từ trên xuống — mỗi mục là một nấc trưởng thành harness.
|
|
282
|
+
|
|
283
|
+
**Mức 1 — Nền tảng (làm ngay tuần này)**
|
|
284
|
+
- [ ] Mỗi repo chính có `CLAUDE.md` sinh bằng `/init-harness` (xem [Phần 9](#9-hands-on-viết-claudemd-cho-repo-bằng-init-harness)), KHÔNG dùng `/init` thô.
|
|
285
|
+
- [ ] File có đủ mục `Guardrails` + `Definition of Done`, không chỉ build/test/kiến trúc.
|
|
286
|
+
- [ ] Có lệnh chạy *một* test đơn lẻ (hoặc cách verify thật) ghi rõ trong file.
|
|
287
|
+
- [ ] Quy ước: thông tin quan trọng đi vào file repo, không "nói miệng" trong chat.
|
|
288
|
+
|
|
289
|
+
**Mức 2 — Context & Tools**
|
|
290
|
+
- [ ] Dùng subagents/worktree cho việc tốn context (đọc nhiều file, refactor lớn).
|
|
291
|
+
- [ ] `/clear` khi đổi task; nén context cho session dài.
|
|
292
|
+
- [ ] Rà soát MCP server đang cắm: cái nào thật sự cần, cái nào gây nhiễu context.
|
|
293
|
+
|
|
294
|
+
**Mức 3 — Guardrails**
|
|
295
|
+
- [ ] Cấu hình permission/allowlist trong `settings.json` cho thao tác an toàn.
|
|
296
|
+
- [ ] Hooks tự động (format, chặn lệnh nguy hiểm) cho cả team.
|
|
297
|
+
- [ ] Test/lint/typecheck chạy *trong vòng lặp*, không để review thủ công cuối cùng.
|
|
298
|
+
- [ ] (Nếu agent đọc nội dung ngoài) có biện pháp chống prompt injection.
|
|
299
|
+
|
|
300
|
+
**Mức 4 — Long-running**
|
|
301
|
+
- [ ] Task dài có feature-list/task-state bền vững (file hoặc TodoWrite).
|
|
302
|
+
- [ ] Agent tự verify (chạy test/build) trước khi báo xong.
|
|
303
|
+
- [ ] Có `init.sh`/script setup môi trường lặp lại được.
|
|
304
|
+
|
|
305
|
+
**Mức 5 — Evals & Observability**
|
|
306
|
+
- [ ] Bật trace/observability để soi agent làm gì + chi phí.
|
|
307
|
+
- [ ] Có ít nhất vài eval lặp lại được cho task quan trọng (kèm baseline "không harness").
|
|
308
|
+
- [ ] Khi so sánh số liệu, kiểm soát noise hạ tầng trước khi kết luận.
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## 11. Lộ trình đọc thêm
|
|
313
|
+
|
|
314
|
+
Đọc theo thứ tự này nếu bắt đầu từ con số 0:
|
|
315
|
+
|
|
316
|
+
1. **Khái niệm:** [Thoughtworks — Harness Engineering](https://martinfowler.com/articles/exploring-gen-ai/harness-engineering.html) → [LangChain — Anatomy of an Agent Harness](https://blog.langchain.com/the-anatomy-of-an-agent-harness/)
|
|
317
|
+
2. **Hai bài gốc nặng ký:** [Anthropic — Effective harnesses for long-running agents](https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents) + [OpenAI — Harness engineering với Codex](https://openai.com/index/harness-engineering/)
|
|
318
|
+
3. **Context (ăn tiền nhất khi code):** [Anthropic — Effective context engineering](https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents) + [Manus — Lessons](https://manus.im/blog/Context-Engineering-for-AI-Agents-Lessons-from-Building-Manus)
|
|
319
|
+
4. **Áp dụng:** [Writing a good CLAUDE.md](https://www.humanlayer.dev/blog/writing-a-good-claude-md) + [AGENTS.md](https://github.com/agentsmd/agents.md) → rồi chạy `/init-harness` để sinh file cho repo team ([Phần 9](#9-hands-on-viết-claudemd-cho-repo-bằng-init-harness))
|
|
320
|
+
5. **Đo lường:** [Anthropic — Demystifying Evals for AI Agents](https://www.anthropic.com/engineering/demystifying-evals-for-ai-agents)
|
|
321
|
+
|
|
322
|
+
> Toàn bộ danh mục đầy đủ (foundations, context, guardrails, specs, evals, benchmarks, runtimes) nằm ở [README của repo này](https://github.com/walkinglabs/awesome-harness-engineering/blob/main/README.md) — coi đó là thư viện tra cứu chính.
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@htechcs/harness-kit",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Harness Engineering starter kit — thiết lập repo cho coding agent theo 5 mức trưởng thành (CLAUDE.md, context, guardrails, long-running, evals).",
|
|
5
|
+
"bin": {
|
|
6
|
+
"harness-kit": "bin/cli.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin/",
|
|
10
|
+
"templates/",
|
|
11
|
+
"skills/",
|
|
12
|
+
"docs/harness-engineering-tutorial.md",
|
|
13
|
+
"docs/harness-engineering-tutorial.en.md"
|
|
14
|
+
],
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=18"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"claude-code",
|
|
20
|
+
"harness-engineering",
|
|
21
|
+
"ai-agents",
|
|
22
|
+
"context-engineering",
|
|
23
|
+
"CLAUDE.md"
|
|
24
|
+
],
|
|
25
|
+
"author": "HoangTechCS-AIE",
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"homepage": "https://github.com/HoangTechCS-AIE/harness-kit#readme",
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "git+https://github.com/HoangTechCS-AIE/harness-kit.git"
|
|
34
|
+
},
|
|
35
|
+
"bugs": {
|
|
36
|
+
"url": "https://github.com/HoangTechCS-AIE/harness-kit/issues"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: init-harness
|
|
3
|
+
description: Sinh file CLAUDE.md "đạt chuẩn harness engineering" cho một repo, thay cho /init mặc định. Phân tích codebase để điền WHAT/WHY/HOW (stack, build/test/run, kiến trúc, quy ước), rồi hỏi xác nhận đúng 2 phần không tự đoán được — Guardrails (ràng buộc hành vi agent) và Definition of Done (khi nào coi là xong) — những thứ /init bỏ sót. Tuân thủ kỷ luật của HumanLayer "Writing a good CLAUDE.md": ngắn (<300 dòng, lý tưởng ~60), pointer thay vì copy, không nhồi style/convention (để cho linter), craft thủ công chứ không auto-generate. Dùng skill này khi người dùng muốn tạo/chuẩn hóa CLAUDE.md, "init harness", thiết lập repo cho coding agent. Hiện chỉ làm CLAUDE.md (Claude Code); AGENTS.md/Codex sẽ bổ sung sau.
|
|
4
|
+
argument-hint: [đường dẫn repo, mặc định là thư mục hiện tại]
|
|
5
|
+
allowed-tools: Read, Write, Edit, Glob, Grep, Bash, AskUserQuestion
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# init-harness — CLAUDE.md đạt chuẩn harness engineering
|
|
9
|
+
|
|
10
|
+
Sinh ra một `CLAUDE.md` là **repo-local instruction bền vững** mà Claude Code đọc trong *mọi*
|
|
11
|
+
session. Khác `/init` mặc định ở chỗ: `/init` chỉ **mô tả hiện trạng** repo (đây là gì, build ra sao);
|
|
12
|
+
skill này còn **quy định hành vi agent** (Guardrails + Definition of Done) và tuân thủ kỷ luật
|
|
13
|
+
quản lý context của nguồn chuẩn.
|
|
14
|
+
|
|
15
|
+
## Nguyên tắc nền (không được vi phạm)
|
|
16
|
+
|
|
17
|
+
Trích từ [Writing a good CLAUDE.md — HumanLayer](https://www.humanlayer.dev/blog/writing-a-good-claude-md):
|
|
18
|
+
|
|
19
|
+
- **"LLMs are stateless functions"** — `CLAUDE.md` là file *duy nhất* nạp vào *mọi* session. Mọi dòng phải xứng đáng.
|
|
20
|
+
- **"Less is more"** — model theo được ~150–200 instruction; system prompt đã chiếm ~50. Giữ file **dưới 300 dòng, nhắm ~60–120**.
|
|
21
|
+
- **"Prefer pointers to copies"** — trỏ tới `path/file.ts:42`, KHÔNG copy snippet code vào file.
|
|
22
|
+
- **Không nhồi style/convention** — để linter/formatter lo. Đừng viết "dùng 2 space", "đặt tên camelCase".
|
|
23
|
+
- **Chỉ chứa cái universally relevant** — thông tin theo task cụ thể để riêng, link tới khi cần (progressive disclosure).
|
|
24
|
+
- **Right altitude — đừng hardcode luật cứng** — nguồn chuẩn cảnh báo HAI cực NGANG NHAU: quá mơ hồ *và* quá cứng ("overly complex hardcoded logic"). Viết heuristic/ranh giới ổn định, KHÔNG nhồi chuỗi if-this-then-that cho từng edge-case (làm `CLAUDE.md` giòn, mâu thuẫn, khó bảo trì). Quy tắc chỉ đúng trong một task cụ thể → đẩy ra file theo-task, đừng nhét vào `CLAUDE.md`.
|
|
25
|
+
- **Craft, đừng auto-dump** — nguồn chuẩn nói thẳng *don't auto-generate*. Skill này phân tích để *đề xuất*, nhưng phải chắt lọc, không đổ raw.
|
|
26
|
+
- **Viết cái KHÔNG hiển nhiên** — bỏ cây thư mục (agent tự khám phá), bỏ lời khuyên chung ("viết code sạch").
|
|
27
|
+
|
|
28
|
+
Hai phần làm nên "harness" (mà `/init` thiếu):
|
|
29
|
+
- **Guardrails** — agent *không được* làm gì, *phải* làm gì trước khi báo xong, thao tác nào cần xác nhận.
|
|
30
|
+
- **Definition of Done** — bằng chứng cụ thể (test pass, build xanh, lint sạch) để agent tự verify trước khi tuyên bố hoàn thành.
|
|
31
|
+
|
|
32
|
+
## Quy trình
|
|
33
|
+
|
|
34
|
+
### B1 — Xác định repo & quét hiện trạng
|
|
35
|
+
|
|
36
|
+
- Repo đích = `$ARGUMENTS` nếu có, ngược lại là thư mục hiện tại. Xác nhận là git repo (`git rev-parse --show-toplevel`).
|
|
37
|
+
- Nếu đã có `CLAUDE.md` → đọc, đề xuất *cải thiện* thay vì ghi đè mù. Hỏi trước khi overwrite.
|
|
38
|
+
- Gom nguồn sẵn có để hợp nhất (đừng để rải rác): `README.md`, `.cursorrules` / `.cursor/rules/`, `.github/copilot-instructions.md`, `AGENTS.md` nếu có.
|
|
39
|
+
|
|
40
|
+
### B2 — Suy ra WHAT / WHY / HOW (tự động, đậm đặc)
|
|
41
|
+
|
|
42
|
+
Phân tích codebase, KHÔNG hỏi những gì đoán được:
|
|
43
|
+
|
|
44
|
+
- **HOW (ưu tiên cao nhất — agent cần để chạy vòng lặp):**
|
|
45
|
+
- Build / run / test / lint / typecheck — đọc từ `package.json` scripts, `Makefile`, `justfile`, `pyproject.toml`, `Cargo.toml`, `go.mod`, CI workflow…
|
|
46
|
+
- **Lệnh chạy MỘT test đơn lẻ** — bắt buộc tìm cho ra (vd `pytest path::test_x`, `vitest run -t "name"`, `go test -run`). Đây là thứ tăng tốc feedback loop nhất.
|
|
47
|
+
- Tool đặc thù: `bun` vs `node`, `uv` vs `pip`, package manager nào.
|
|
48
|
+
- **WHAT:** tech stack, ranh giới module, "map" codebase (đặc biệt quan trọng với monorepo). Mô tả *big picture cần đọc nhiều file mới hiểu*, KHÔNG liệt kê từng file.
|
|
49
|
+
- **WHY:** mục đích dự án, vai trò từng phần chính — 1–3 câu.
|
|
50
|
+
|
|
51
|
+
### B3 — Hỏi xác nhận ĐÚNG 2 phần không đoán được (gom 1 lượt duy nhất)
|
|
52
|
+
|
|
53
|
+
Dùng AskUserQuestion, gộp tất cả vào một lượt (tôn trọng context budget):
|
|
54
|
+
|
|
55
|
+
1. **Guardrails** — gợi ý ứng viên từ repo rồi nhờ xác nhận:
|
|
56
|
+
- File/thư mục KHÔNG được sửa (generated, migrations đã chạy, lockfile, `dist/`, `vendor/`).
|
|
57
|
+
- Thao tác cần xác nhận trước (chạy migration, xoá data, push, sửa CI/secrets).
|
|
58
|
+
- Quy tắc bắt buộc ("luôn chạy test trước khi báo xong", "không thêm dependency mới nếu không hỏi").
|
|
59
|
+
2. **Definition of Done** — một thay đổi coi là xong khi nào? (vd: `<lệnh test>` xanh + `<lint>` sạch + `<typecheck>` pass). Đây là cái agent dùng để self-verify.
|
|
60
|
+
|
|
61
|
+
Nếu repo quá lớn / đa module → hỏi có muốn **phân tầng**: `CLAUDE.md` gọn ở root + file con cho module phức tạp (closest-file-wins). Mặc định: chỉ root.
|
|
62
|
+
|
|
63
|
+
### B4 — Viết CLAUDE.md theo khung
|
|
64
|
+
|
|
65
|
+
Bắt buộc mở đầu bằng:
|
|
66
|
+
|
|
67
|
+
```md
|
|
68
|
+
# CLAUDE.md
|
|
69
|
+
|
|
70
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Khung nội dung (bỏ mục nào không có thực — đừng bịa):
|
|
74
|
+
|
|
75
|
+
```md
|
|
76
|
+
## Repo này là gì
|
|
77
|
+
<WHY + WHAT: 1–3 câu. Cái mà đọc 1 file không ra.>
|
|
78
|
+
|
|
79
|
+
## Build / Test / Run
|
|
80
|
+
- Build: <lệnh>
|
|
81
|
+
- Test toàn bộ: <lệnh>
|
|
82
|
+
- Chạy MỘT test: <lệnh cụ thể copy-paste chạy ngay>
|
|
83
|
+
- Lint / typecheck: <lệnh>
|
|
84
|
+
- Tool đặc thù: <bun/uv/...>
|
|
85
|
+
|
|
86
|
+
## Kiến trúc tổng quan
|
|
87
|
+
<Big picture cần đọc nhiều file mới hiểu: luồng chính, ranh giới module,
|
|
88
|
+
"trái tim" hệ thống nằm ở đâu. Dùng pointer path/file.ts:line, không copy code.>
|
|
89
|
+
|
|
90
|
+
## Quy ước riêng (chỉ cái KHÔNG hiển nhiên)
|
|
91
|
+
<Pattern bắt buộc mà agent không tự đoán. KHÔNG ghi style/format — để linter lo.>
|
|
92
|
+
|
|
93
|
+
## Guardrails
|
|
94
|
+
- KHÔNG sửa: <file/thư mục>.
|
|
95
|
+
- LUÔN <chạy test/lint> trước khi báo hoàn thành.
|
|
96
|
+
- Cần xác nhận trước khi: <thao tác nguy hiểm>.
|
|
97
|
+
|
|
98
|
+
## Definition of Done
|
|
99
|
+
Một thay đổi coi là xong khi: <bằng chứng cụ thể — test xanh, build ok, lint sạch>.
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### B5 — Tự kiểm trước khi giao (self-check)
|
|
103
|
+
|
|
104
|
+
Đối chiếu file vừa viết với checklist, sửa nếu vi phạm:
|
|
105
|
+
|
|
106
|
+
- [ ] Dưới 300 dòng (lý tưởng <120). Nếu dài → cắt, đẩy chi tiết theo-task ra file riêng + link.
|
|
107
|
+
- [ ] Không có cây thư mục, không lời khuyên chung chung, không style/convention thừa.
|
|
108
|
+
- [ ] Dùng pointer (`path:line`) thay vì copy snippet.
|
|
109
|
+
- [ ] Có lệnh chạy MỘT test, copy-paste chạy được.
|
|
110
|
+
- [ ] Có mục Guardrails và Definition of Done (đây là phần làm nên "harness").
|
|
111
|
+
- [ ] Guardrails/Quy ước là heuristic ở mức ranh giới, KHÔNG phải chuỗi luật cứng/edge-case; luật chỉ đúng 1 task đã đẩy ra file theo-task.
|
|
112
|
+
- [ ] Mọi lệnh đã kiểm là tồn tại thật trong repo (đừng bịa script không có).
|
|
113
|
+
|
|
114
|
+
### B6 — Báo cáo
|
|
115
|
+
|
|
116
|
+
Tóm tắt cho người dùng: đã tạo/cập nhật file gì, đã hợp nhất nguồn nào (Cursor/Copilot/README), số dòng, và các Guardrails/DoD đã chốt. Nhắc: **AGENTS.md cho Codex sẽ làm ở đợt sau** (khi đó chỉ cần `ln -s AGENTS.md CLAUDE.md` để dùng chung một nguồn).
|
|
117
|
+
|
|
118
|
+
## Ngoài phạm vi (hiện tại)
|
|
119
|
+
|
|
120
|
+
- Không sinh `AGENTS.md` / không symlink — để dành đợt sau theo yêu cầu (focus Claude Code trước).
|
|
121
|
+
- Không thiết lập hooks/settings.json/MCP — đó là các trụ cột harness khác, làm riêng.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Subagents — quy tắc viết đúng (Mức 2)
|
|
2
|
+
|
|
3
|
+
Subagent là **đòn bẩy chính của Mức 2**: đẩy việc nặng (đọc nhiều file, refactor lớn,
|
|
4
|
+
chạy thử lặp) sang một **context riêng**, để context chính chỉ nhận *kết luận* — không bị ngập.
|
|
5
|
+
|
|
6
|
+
## Cài đặt
|
|
7
|
+
|
|
8
|
+
Mỗi subagent là một file `.md` trong `.claude/agents/` (cấp repo) hoặc `~/.claude/agents/` (cấp user).
|
|
9
|
+
Copy file mẫu vào đó là Claude Code tự nhận:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
mkdir -p .claude/agents
|
|
13
|
+
cp repo-explorer.md .claude/agents/
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Cấu trúc file
|
|
17
|
+
|
|
18
|
+
```md
|
|
19
|
+
---
|
|
20
|
+
name: <kebab-case>
|
|
21
|
+
description: <KHI NÀO dùng — Claude đọc dòng này để tự quyết có gọi agent này không>
|
|
22
|
+
tools: Read, Grep, Glob # (tuỳ chọn) chỉ trang bị tool agent CẦN, để nó gọn
|
|
23
|
+
---
|
|
24
|
+
<system prompt: vai trò + cách làm + ĐẶC BIỆT là cách TRẢ VỀ>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 4 quy tắc không được quên
|
|
28
|
+
|
|
29
|
+
1. **`description` viết theo "khi nào dùng", không phải "là gì".** Đây là thứ agent chính
|
|
30
|
+
đọc để quyết định có ủy thác hay không. Mơ hồ → không bao giờ được gọi.
|
|
31
|
+
2. **Subagent phải trả về *kết luận chắt lọc*, không phải nhật ký.** Cả lý do tồn tại của
|
|
32
|
+
subagent là để context chính KHÔNG phải nuốt thứ nó đọc. Trả raw dump = phá mục tiêu.
|
|
33
|
+
3. **`tools` chỉ liệt kê cái thật cần.** Đây KHÔNG phải guardrail an toàn (đó là Mức 3) —
|
|
34
|
+
mà để agent gọn, tập trung. Agent đọc-hiểu chỉ cần `Read, Grep, Glob`.
|
|
35
|
+
4. **Một subagent = một việc rõ.** Đừng gộp "đọc + sửa + test" vào một agent. Việc nặng
|
|
36
|
+
khác nhau → context riêng khác nhau.
|
|
37
|
+
|
|
38
|
+
## Khi nào KHÔNG cần viết subagent mới
|
|
39
|
+
|
|
40
|
+
Claude Code đã có sẵn `Explore` (quét read-only), `Plan` (thiết kế), `general-purpose`.
|
|
41
|
+
Chúng lo phần lớn nhu cầu cô lập context rồi. **Chỉ viết subagent riêng khi** bạn có một
|
|
42
|
+
việc lặp lại, đặc thù domain mà built-in không nắm được — đừng đẻ bản generic trùng lặp,
|
|
43
|
+
vì chính tool thừa là cái nhiễu context mà Mức 2 dạy phải tránh.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: repo-explorer
|
|
3
|
+
description: Đọc nhiều file để trả lời câu hỏi "cái gì nằm ở đâu / luồng này chạy ra sao" mà KHÔNG làm ngập context chính. Dùng khi cần quét rộng codebase và chỉ cần kết luận, không cần nội dung từng file. Read-only.
|
|
4
|
+
tools: Read, Grep, Glob
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Bạn là agent **đọc-hiểu codebase**. Việc của bạn là quét nhiều file rồi trả về
|
|
8
|
+
một **kết luận chắt lọc** cho agent chính — agent chính KHÔNG thấy được những gì
|
|
9
|
+
bạn đọc, chỉ thấy phần bạn trả về. Vì vậy:
|
|
10
|
+
|
|
11
|
+
## Cách làm
|
|
12
|
+
|
|
13
|
+
1. Bám sát đúng câu hỏi được giao. Đừng mở rộng phạm vi.
|
|
14
|
+
2. Dùng `Grep`/`Glob` để khoanh vùng trước, chỉ `Read` file thật sự liên quan.
|
|
15
|
+
3. Đọc *đủ để kết luận*, không đọc cho hết.
|
|
16
|
+
|
|
17
|
+
## Cách trả về (quan trọng nhất)
|
|
18
|
+
|
|
19
|
+
Trả về **kết luận, không phải nhật ký**. Cụ thể:
|
|
20
|
+
|
|
21
|
+
- Câu trả lời trực tiếp cho câu hỏi, lên đầu.
|
|
22
|
+
- Các con trỏ `đường-dẫn/file.ts:dòng` cho mỗi điểm quan trọng (để agent chính tự mở khi cần).
|
|
23
|
+
- TUYỆT ĐỐI không dán nguyên nội dung file dài vào câu trả lời — đó chính là cái
|
|
24
|
+
làm ngập context mà subagent này sinh ra để tránh.
|
|
25
|
+
- Nếu không tìm thấy, nói thẳng "không tìm thấy X", đừng đoán.
|
|
26
|
+
|
|
27
|
+
Mục tiêu: agent chính đọc 15 dòng của bạn là hiểu, thay vì phải tự đọc 50 file.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Evals & Observability — đo agent có làm đúng không (Mức 5)
|
|
2
|
+
|
|
3
|
+
Mức 1–4 *dựng* harness. Mức 5 là **vòng phản hồi**: làm sao biết khi bạn sửa CLAUDE.md /
|
|
4
|
+
settings / skill thì agent **tốt lên hay tệ đi**? Không có Mức 5, mọi thay đổi harness chỉ là đoán.
|
|
5
|
+
|
|
6
|
+
## Hai nửa
|
|
7
|
+
|
|
8
|
+
| Nửa | Trả lời | File |
|
|
9
|
+
|-----|---------|------|
|
|
10
|
+
| **Evals** | "Agent ra kết quả *đúng* không?" (pass/fail đo được) | [`cases/`](./cases/) |
|
|
11
|
+
| **Observability** | "Agent đã *làm gì*, vì sao hỏng?" | [`observability.md`](./observability.md) |
|
|
12
|
+
|
|
13
|
+
Evals nói **đúng/sai**. Observability nói **tại sao** — và thường lộ bệnh ở mức thấp hơn
|
|
14
|
+
(đọc lại file hoài = context bẩn → Mức 2; hỏi quyền liên tục → chỉnh `allow` ở Mức 3).
|
|
15
|
+
|
|
16
|
+
## Vòng lặp (đây mới là cốt lõi, không phải file)
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
define → run → read → fix → (chạy lại)
|
|
20
|
+
golden cho đọc sửa
|
|
21
|
+
task agent trace harness
|
|
22
|
+
chạy / kết (CLAUDE.md,
|
|
23
|
+
quả settings, skill)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Đòn bẩy thật: bộ golden task là **lưới chống regression cho chính harness**. Sửa CLAUDE.md xong,
|
|
27
|
+
chạy lại bộ case — case trước đậu mà giờ rớt → gần như chắc chắn do thay đổi của mình (xác nhận
|
|
28
|
+
bằng cách chạy lại vài lần để loại nhiễu), không phải đoán.
|
|
29
|
+
|
|
30
|
+
## Sự thật: Mức 5 ít "gói thành file" nhất
|
|
31
|
+
|
|
32
|
+
Eval *thật* thì **đặc thù domain** — không kit nào ship sẵn "agent của bạn làm đúng chưa".
|
|
33
|
+
Kit này chỉ cho **khung + kỷ luật**:
|
|
34
|
+
|
|
35
|
+
- ✅ File: cấu trúc thư mục + template golden-task + guide observability.
|
|
36
|
+
- 🧠 Discipline (phần lớn): *định nghĩa* "đúng" cho task của bạn, dựng bộ case, đọc trace,
|
|
37
|
+
**đóng vòng lặp** (eval phát hiện regression → sửa harness → chạy lại).
|
|
38
|
+
|
|
39
|
+
Kit cố ý **không** ship runner code — runner là đặc thù repo, giả vờ generic sẽ thành rác.
|
|
40
|
+
|
|
41
|
+
## Bắt đầu
|
|
42
|
+
|
|
43
|
+
1. Copy `cases/example-task.md` thành một case thật, điền done-criteria *khách quan*.
|
|
44
|
+
2. Gom 3–5 task **đại diện** (việc agent làm thường xuyên nhất) — không cần nhiều, cần đúng.
|
|
45
|
+
3. **Lấy baseline "không harness" TRƯỚC.** Chạy bộ case một lần ở trạng thái chưa áp harness
|
|
46
|
+
(CLAUDE.md trống / trước khi cài Mức 1–4) và ghi điểm. Đây là cái **định lượng ROI của harness**:
|
|
47
|
+
chạy lại sau khi đã áp harness rồi so delta — chính là luận điểm mở đầu của ngành (đổi harness
|
|
48
|
+
làm điểm nhảy; xem `docs/harness-engineering-tutorial.md`). *Khác* với regression ở bước sau.
|
|
49
|
+
4. Sau đó, trước/sau **mỗi lần sửa** harness, chạy lại bộ case và đối chiếu (chạy vài lần để loại
|
|
50
|
+
nhiễu trước khi kết luận nhân-quả).
|
|
51
|
+
5. Khi một case rớt, mở [`observability.md`](./observability.md) để truy *vì sao*.
|