codex-harness-engineering 0.1.5 → 0.1.6
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/AGENTS.md +18 -6
- package/LICENSE +21 -0
- package/README.md +69 -6
- package/docs/harness-engineering/implementation-playbook.md +232 -286
- package/docs/harness-engineering/index.md +7 -4
- package/docs/harness-engineering/research-note.md +294 -274
- package/docs/harness-engineering/sources.md +166 -72
- package/package.json +5 -4
- package/scripts/install-skills.mjs +73 -15
- package/scripts/publish.sh +2 -2
- package/scripts/verify-harness.mjs +61 -4
- package/skills/acceptance-contract/SKILL.md +39 -49
- package/skills/acceptance-contract/agents/openai.yaml +2 -2
- package/skills/cleanup-harness/SKILL.md +48 -59
- package/skills/cleanup-harness/agents/openai.yaml +2 -2
- package/skills/creator-harness/SKILL.md +79 -95
- package/skills/creator-harness/agents/openai.yaml +2 -2
- package/skills/creator-harness/references/harness-artifacts.md +63 -62
- package/skills/lessons-harness/SKILL.md +68 -0
- package/skills/lessons-harness/agents/openai.yaml +4 -0
- package/templates/harness/AGENTS.md +77 -0
- package/templates/harness/feature_list.json +16 -0
- package/templates/harness/init.sh +15 -0
- package/templates/harness/lessons.md +18 -0
- package/templates/harness/memory/README.md +22 -0
- package/templates/harness/progress.md +33 -0
- package/templates/harness/rotate-state.mjs +131 -0
- package/templates/harness/verify-state.mjs +117 -0
- package/templates/team/roles/evaluator.md +43 -0
- package/templates/team/roles/implementer.md +29 -0
- package/templates/team/roles/planner.md +28 -0
- package/templates/team/sprint-template.md +36 -0
- package/templates/team/verify-team.mjs +71 -0
- package/templates/team/workflow.md +62 -0
|
@@ -1,318 +1,338 @@
|
|
|
1
|
-
# Harness Engineering
|
|
1
|
+
# Harness Engineering White Paper
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## Abstract
|
|
4
4
|
|
|
5
|
-
Harness engineering là
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
Harness engineering là thiết kế lớp môi trường quanh AI agent để biến năng
|
|
6
|
+
lực mô hình thành tiến triển phần mềm có thể tiếp tục, kiểm chứng, và duy trì
|
|
7
|
+
qua nhiều session [S1], [S2], [S3], [S4], [S5]. Năm nguồn trong phạm vi này
|
|
8
|
+
cho cùng một kết luận thực dụng: agent không trở thành công cụ production chỉ
|
|
9
|
+
nhờ prompt tốt hơn; nó cần repository-local state, tool dễ đọc, quan sát
|
|
10
|
+
runtime, tiêu chí done, guardrail cơ học, cleanup định kỳ, và khi cần thì lớp
|
|
11
|
+
bọc thực thi sinh tự động [S1], [S2], [S4], [S5].
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
loại bỏ để giữ trọng tâm.
|
|
13
|
+
## Executive Summary
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
Để triển khai thực tế, harness nên được xây theo thứ tự sau:
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
1. Bắt đầu bằng harness tối thiểu: `AGENTS.md`, `init.sh`, `feature_list.json`,
|
|
18
|
+
`progress.md`, test/smoke command, và git checkpoint [S1], [S2].
|
|
19
|
+
2. Đưa state dài hạn ra ngoài chat history để session mới khôi phục được bối
|
|
20
|
+
cảnh mà không đoán mò [S2].
|
|
21
|
+
3. Mã hóa invariant lặp lại thành check chạy được thay vì chỉ ghi trong prose
|
|
22
|
+
[S1].
|
|
23
|
+
4. Thêm browser, API, log, metric, trace, hoặc evaluator riêng chỉ khi failure
|
|
24
|
+
mode thực sự cần [S1], [S2], [S4].
|
|
25
|
+
5. Khi rule quá phức tạp để giữ tay, xem xét wrapper code sinh tự động theo
|
|
26
|
+
hướng AutoHarness [S5].
|
|
19
27
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
- agent nhìn thấy vài feature đã xong rồi tuyên bố cả dự án hoàn thành;
|
|
24
|
-
- agent sửa code nhưng không kiểm thử đầu-cuối;
|
|
25
|
-
- agent không thấy UI, log, metric, trace, hoặc trạng thái runtime;
|
|
26
|
-
- throughput cao làm pattern xấu lan rộng nhanh hơn tốc độ con người review.
|
|
27
|
-
|
|
28
|
-
Anthropic mô tả vấn đề multi-session như một bài toán khôi phục trạng thái:
|
|
29
|
-
context window không đủ để bảo toàn toàn bộ tiến triển, nên harness phải đặt
|
|
30
|
-
state vào artifact bền vững như feature list, progress file, `init.sh`, và git
|
|
31
|
-
history [S2]. OpenAI mô tả cùng vấn đề ở quy mô repository: khi agent tạo code
|
|
32
|
-
nhanh hơn con người có thể QA thủ công, công việc kỹ sư chuyển sang thiết kế
|
|
33
|
-
môi trường, feedback loop, và control system quanh agent [S1].
|
|
34
|
-
|
|
35
|
-
Một ràng buộc quan trọng đến từ Anthropic: không phải mọi task đều cần agent hay
|
|
36
|
-
harness phức tạp. Nên bắt đầu bằng giải pháp đơn giản nhất, dùng workflow khi
|
|
37
|
-
đường đi đã rõ, và chỉ dùng agent tự chủ hoặc orchestration nhiều bước khi
|
|
38
|
-
tradeoff về cost, latency, và lỗi tích lũy được biện minh bằng outcome [S3].
|
|
39
|
-
|
|
40
|
-
## 2. Định nghĩa
|
|
41
|
-
|
|
42
|
-
Trong phạm vi năm nguồn này, **harness** là lớp scaffold ngoài mô hình giúp
|
|
43
|
-
agent làm việc đáng tin hơn. Nó có thể bao gồm:
|
|
44
|
-
|
|
45
|
-
- prompt và acceptance criteria;
|
|
46
|
-
- file state như feature list và progress log;
|
|
47
|
-
- script setup như `init.sh`;
|
|
48
|
-
- git history và commit discipline;
|
|
49
|
-
- tool để chạy app, browser automation, API check, log, metric, trace;
|
|
50
|
-
- planner, generator, evaluator khi task cần tách vai trò;
|
|
51
|
-
- linter, structural test, CI rule, và cleanup cadence;
|
|
52
|
-
- tự động tổng hợp lớp bọc thực thi (code harness/wrapper) để chặn hành động lỗi [S5];
|
|
53
|
-
- hệ thống đánh giá vết chạy (trajectory evaluation) và LLM-as-a-judge [S5].
|
|
54
|
-
|
|
55
|
-
Harness engineering là việc thiết kế, đo, và điều chỉnh lớp scaffold đó. Nó
|
|
56
|
-
khác với prompt engineering ở chỗ trọng tâm không chỉ là câu lệnh cho một lượt
|
|
57
|
-
model, mà là toàn bộ môi trường giúp nhiều lượt agent tiếp tục, quan sát, sửa,
|
|
58
|
-
và để lại bằng chứng.
|
|
59
|
-
|
|
60
|
-
## 3. Vai trò mới của kỹ sư
|
|
61
|
-
|
|
62
|
-
OpenAI tóm tắt mô hình vận hành bằng ý tưởng: con người định hướng, agent thực
|
|
63
|
-
thi. Trong case study của họ, Codex viết application logic, test, CI,
|
|
64
|
-
documentation, observability, và internal tooling; con người ưu tiên công việc,
|
|
65
|
-
dịch phản hồi thành acceptance criteria, xác minh outcome, và biến failure thành
|
|
66
|
-
cải tiến môi trường [S1].
|
|
67
|
-
|
|
68
|
-
Điểm quan trọng không phải là thay con người bằng agent, mà là chuyển tầng làm
|
|
69
|
-
việc của con người. Khi agent thất bại, câu hỏi tốt không phải "nhắc mạnh hơn
|
|
70
|
-
được không?", mà là "agent thiếu capability, context, tool, guardrail, hoặc
|
|
71
|
-
feedback loop nào?" [S1].
|
|
72
|
-
|
|
73
|
-
## 4. Nguyên lý vận hành
|
|
74
|
-
|
|
75
|
-
### 4.1 Bắt đầu đơn giản
|
|
76
|
-
|
|
77
|
-
Anthropic phân biệt workflow và agent. Workflow dùng đường đi định sẵn; agent
|
|
78
|
-
tự điều khiển process và tool usage. Vì agentic system đổi latency và cost lấy
|
|
79
|
-
performance, harness nên bắt đầu từ cấu trúc nhỏ nhất: một LLM call có retrieval,
|
|
80
|
-
tool, memory, hoặc một workflow đơn giản nếu task phân rã rõ [S3].
|
|
81
|
-
|
|
82
|
-
Chỉ thêm planner, evaluator, nhiều agent, hoặc vòng lặp dài khi failure mode cụ
|
|
83
|
-
thể xuất hiện: mất context, tự đánh giá yếu, runtime vô hình, scope drift, hoặc
|
|
84
|
-
QA không đủ [S2], [S4].
|
|
85
|
-
|
|
86
|
-
### 4.2 Ngoại hóa trạng thái
|
|
87
|
-
|
|
88
|
-
Harness cho agent dài hạn cần đưa bộ nhớ ra khỏi hội thoại. Anthropic dùng
|
|
89
|
-
initializer agent để tạo `init.sh`, progress file, feature list, và commit ban
|
|
90
|
-
đầu. Coding agent sau đó đọc các artifact này, chọn một feature chưa pass, làm
|
|
91
|
-
từng bước, cập nhật progress, và commit trạng thái sạch [S2].
|
|
92
|
-
|
|
93
|
-
Feature list có vai trò như contract bền vững. Mỗi feature nên có mô tả, bước
|
|
94
|
-
kiểm tra, và trạng thái pass/fail. Agent chỉ được đổi trạng thái sau khi xác
|
|
95
|
-
minh. Cách này giảm hai lỗi phổ biến: làm quá rộng và đánh dấu xong quá sớm
|
|
96
|
-
[S2].
|
|
97
|
-
|
|
98
|
-
Việc Anthropic dùng `feature_list.json` thay vì prose thuần cũng cho thấy một
|
|
99
|
-
điểm thiết kế quan trọng: trạng thái công việc nên đủ có cấu trúc để session
|
|
100
|
-
mới đọc, lọc, và cập nhật pass/fail nhất quán mà không phải suy diễn lại từ
|
|
101
|
-
văn bản tự do [S2].
|
|
102
|
-
|
|
103
|
-
Git history trong mẫu harness này cũng không chỉ là nhật ký. Anthropic nêu rõ
|
|
104
|
-
việc để agent kết thúc session bằng commit message mô tả rõ và progress update
|
|
105
|
-
giúp nó có recovery point để revert thay đổi xấu và quay về working state sạch
|
|
106
|
-
hơn trong vòng sau [S2].
|
|
107
|
-
|
|
108
|
-
OpenAI áp dụng cùng logic ở mức repository knowledge: `AGENTS.md` nên là bản đồ
|
|
109
|
-
ngắn trỏ tới tài liệu sâu hơn, còn source of truth nằm trong `docs/`, plan,
|
|
110
|
-
schema, test, lint, và artifact version hóa. Nếu quyết định chỉ nằm trong chat,
|
|
111
|
-
Google Docs riêng, hoặc trí nhớ con người, agent khó dùng nó trong lúc chạy
|
|
112
|
-
[S1].
|
|
28
|
+
Paper này không cổ vũ nhiều agent hơn. Nó chỉ ra cách xây một hệ điều khiển
|
|
29
|
+
đủ nhỏ để dùng được ngay, nhưng đủ chặt để không phụ thuộc vào trí nhớ hội
|
|
30
|
+
thoại.
|
|
113
31
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
OpenAI còn đi xa hơn ở chỗ không chỉ lưu tri thức trong repo, mà còn tổ chức nó
|
|
121
|
-
theo progressive disclosure và kiểm tra freshness/cross-link bằng cơ chế cơ
|
|
122
|
-
học. Hệ quả là source of truth không nên chỉ "được viết xuống", mà còn nên có
|
|
123
|
-
cách để phát hiện doc cũ, liên kết hỏng, hoặc map điều hướng không còn phản ánh
|
|
124
|
-
thực tế của codebase [S1].
|
|
125
|
-
|
|
126
|
-
Anthropic còn cho thấy một điểm mạnh hơn: context reset không nhất thiết là
|
|
127
|
-
mất mát phải chịu đựng, mà có thể trở thành cơ chế chủ đích của harness. Khi
|
|
128
|
-
state handoff đủ tốt qua feature list, progress file, git log, và setup script,
|
|
129
|
-
session mới có thể khởi động lại với ngữ cảnh gọn hơn và ít bị context anxiety
|
|
130
|
-
hơn là cố kéo dài một chuỗi hội thoại suy giảm dần [S2], [S4].
|
|
131
|
-
|
|
132
|
-
### 4.3 Làm môi trường dễ đọc với agent
|
|
133
|
-
|
|
134
|
-
Agent chỉ sửa đáng tin những gì nó quan sát được. Anthropic cho thấy browser
|
|
135
|
-
automation giúp Claude kiểm thử feature web như người dùng thật và phát hiện lỗi
|
|
136
|
-
không thấy được từ code hoặc unit test đơn lẻ [S2]. OpenAI mở rộng ý tưởng này:
|
|
137
|
-
app, UI, log, metric, trace, và môi trường dev theo worktree phải trở thành tín
|
|
138
|
-
hiệu agent đọc được [S1].
|
|
139
|
-
|
|
140
|
-
Trong harness tốt, tool là giác quan của agent. Một web agent không có browser
|
|
141
|
-
automation không thật sự thấy app. Một backend agent không có log, metric, hoặc
|
|
142
|
-
trace khó suy luận về hành vi runtime. Một agent không biết setup app sẽ mất
|
|
143
|
-
thời gian đoán cách chạy trước khi làm việc thật [S1], [S2].
|
|
144
|
-
|
|
145
|
-
Anthropic cũng nhấn mạnh agent-computer interface. Tool nên có tên, tham số,
|
|
146
|
-
description, ví dụ, edge case, và ranh giới rõ. Tool khó dùng với con người mới
|
|
147
|
-
vào dự án thường cũng khó dùng với model [S3].
|
|
148
|
-
|
|
149
|
-
OpenAI bổ sung một hệ quả thiết kế ít hiển nhiên hơn: ngay cả lựa chọn
|
|
150
|
-
dependency và abstraction cũng là một phần của legibility. Công nghệ có API ổn
|
|
151
|
-
định, hành vi dễ mô hình hóa, và phần logic nằm trong repo thường dễ cho agent
|
|
152
|
-
reason hơn lớp upstream opaque. Vì vậy harness không chỉ thêm tool; nó còn có
|
|
153
|
-
thể ưu tiên stack và helper mà agent inspect, validate, và sửa trực tiếp được
|
|
154
|
-
[S1].
|
|
32
|
+
## Scope
|
|
33
|
+
|
|
34
|
+
Phạm vi này chỉ dùng năm nguồn [S1] đến [S5]. Mọi luận điểm quan trọng trong
|
|
35
|
+
paper đều phải truy vết về một trong năm nguồn đó hoặc được đánh dấu rõ là
|
|
36
|
+
diễn giải triển khai.
|
|
155
37
|
|
|
156
|
-
|
|
38
|
+
## Problem Statement
|
|
39
|
+
|
|
40
|
+
Agent có thể tạo tiến triển ngắn hạn nhanh nhưng vẫn thất bại ở dự án dài hạn.
|
|
41
|
+
Các failure mode lặp lại là:
|
|
42
|
+
|
|
43
|
+
- session mới không biết session trước đã làm gì;
|
|
44
|
+
- agent làm quá rộng thay vì chốt một feature;
|
|
45
|
+
- agent tự tuyên bố done sớm;
|
|
46
|
+
- runtime fail nhưng code review không thấy;
|
|
47
|
+
- generator tự đánh giá quá lạc quan;
|
|
48
|
+
- throughput cao làm drift kiến trúc và drift quy trình tăng nhanh [S1], [S2],
|
|
49
|
+
[S4].
|
|
50
|
+
|
|
51
|
+
Vì vậy harness engineering là bài toán thiết kế hệ điều khiển: state, sensing,
|
|
52
|
+
standards, constraints, và cleanup phải được đặt sao cho agent có thể tiếp tục
|
|
53
|
+
qua nhiều session mà vẫn giữ được bằng chứng [S1], [S2], [S4].
|
|
54
|
+
|
|
55
|
+
## Core Thesis
|
|
56
|
+
|
|
57
|
+
1. Kỹ sư chuyển từ “viết code cho agent” sang “thiết kế môi trường để agent
|
|
58
|
+
làm việc đúng” [S1].
|
|
59
|
+
2. Với task dài hạn, state phải được externalize vào file, commit, và script
|
|
60
|
+
để session mới phục hồi bối cảnh [S2].
|
|
61
|
+
3. Harness nên bắt đầu đơn giản nhất có thể; workflow đủ thì dùng workflow,
|
|
62
|
+
agent tự chủ chỉ nên xuất hiện khi failure mode thật đòi hỏi [S3].
|
|
63
|
+
4. Invariant quan trọng phải được cưỡng chế bằng máy, không trông chờ prose
|
|
64
|
+
hoặc nhắc nhở thủ công [S1], [S5].
|
|
65
|
+
5. Khi chất lượng chủ quan khó chấm hoặc self-review bị thiên lệch, tách
|
|
66
|
+
generator khỏi evaluator [S4].
|
|
67
|
+
|
|
68
|
+
## Minimal Working Definition
|
|
69
|
+
|
|
70
|
+
Trong paper này, **harness** là scaffold ngoài mô hình gồm:
|
|
71
|
+
|
|
72
|
+
- file state như feature list, progress log, lesson log;
|
|
73
|
+
- setup command hoặc `init.sh`;
|
|
74
|
+
- docs làm source of truth trong repo;
|
|
75
|
+
- browser, API, log, metric, trace, hoặc test runtime;
|
|
76
|
+
- acceptance contract, sprint contract, evaluator rubric;
|
|
77
|
+
- lint, structural test, CI rule, cleanup cadence;
|
|
78
|
+
- wrapper code sinh tự động khi rule quá phức tạp để viết tay [S1], [S2],
|
|
79
|
+
[S4], [S5].
|
|
80
|
+
|
|
81
|
+
**Harness engineering** là việc thiết kế và vận hành scaffold đó để agent có
|
|
82
|
+
thể làm việc qua nhiều session mà không phụ thuộc chủ yếu vào chat history.
|
|
83
|
+
|
|
84
|
+
## Operating Principles
|
|
85
|
+
|
|
86
|
+
### 1. Start with the smallest useful harness
|
|
87
|
+
|
|
88
|
+
Nếu task có đường đi rõ, dùng workflow và acceptance criteria trước. Chỉ thêm
|
|
89
|
+
planner, evaluator, nhiều agent, hoặc orchestration nhiều bước khi failure mode
|
|
90
|
+
cụ thể chứng minh nó đáng giá [S3], [S4].
|
|
91
|
+
|
|
92
|
+
### 2. Externalize state
|
|
93
|
+
|
|
94
|
+
State dài hạn nên sống trong artifact bền vững: feature list, progress file,
|
|
95
|
+
git history, và `init.sh` [S2]. Feature list nên đủ cấu trúc để session mới
|
|
96
|
+
đọc được pass/fail mà không phải suy diễn lại từ prose tự do. Git commit mô tả
|
|
97
|
+
rõ và progress update không chỉ phục vụ audit; chúng tạo checkpoint để agent
|
|
98
|
+
revert thay đổi xấu và khôi phục working state sạch hơn khi cần [S2]. Khi state
|
|
99
|
+
handoff đủ tốt, context reset có thể là một phần chủ đích của harness: reset
|
|
100
|
+
giúp model bám task thay vì trượt theo context anxiety tích lũy qua một context
|
|
101
|
+
window dài [S4].
|
|
102
|
+
|
|
103
|
+
### 3. Keep the repo as the source of truth
|
|
104
|
+
|
|
105
|
+
`AGENTS.md` nên là bản đồ ngắn trỏ tới nguồn sâu hơn, không phải manual khổng
|
|
106
|
+
lồ. Quyết định quan trọng phải nằm trong repo, không chỉ trong chat [S1]. Tri
|
|
107
|
+
thức trong repo nên theo progressive disclosure: lớp ngoài cùng ngắn gọn, trỏ
|
|
108
|
+
tới chi tiết sâu hơn khi cần, kèm kiểm tra cơ học cho freshness và cross-link
|
|
109
|
+
để source of truth không drift theo thời gian [S1]. Khi chọn dependency hoặc
|
|
110
|
+
abstraction, ưu tiên thứ agent có thể inspect, validate, và modify trực tiếp
|
|
111
|
+
trong repo; hành vi opaque ở upstream làm giảm leverage của agent [S1].
|
|
112
|
+
|
|
113
|
+
### 4. Make runtime legible
|
|
114
|
+
|
|
115
|
+
Agent chỉ sửa đáng tin những gì nó thấy. Browser automation, API checks, log,
|
|
116
|
+
metric, và trace biến hành vi runtime thành tín hiệu mà agent có thể đọc và
|
|
117
|
+
kiểm chứng [S1], [S2], [S4]. Tool cũng phải được mô tả như interface rõ ràng,
|
|
118
|
+
với tham số, ranh giới, và ví dụ sử dụng rõ ràng [S3].
|
|
119
|
+
|
|
120
|
+
### 5. Separate generation from evaluation
|
|
121
|
+
|
|
122
|
+
Generator tự chấm output của chính nó thường quá tích cực. Evaluator riêng cho
|
|
123
|
+
phép feedback hoài nghi hơn, cụ thể hơn, và bám vào rubric thay vì cảm tính
|
|
124
|
+
[S4]. Sprint contract giữa generator và evaluator nên nêu rõ phạm vi công việc,
|
|
125
|
+
tiêu chí done, và phương thức QA để cả hai bên đồng thuận trước khi generator
|
|
126
|
+
bắt đầu [S4].
|
|
127
|
+
|
|
128
|
+
### 6. Encode repeated rules mechanically
|
|
129
|
+
|
|
130
|
+
Documentation không đủ để giữ architecture coherent khi throughput cao. Các
|
|
131
|
+
quy tắc lặp lại nên được mã hóa thành lint, structural test, custom rule, hoặc
|
|
132
|
+
CI gate để chặn drift đúng thời điểm nó phát sinh [S1].
|
|
133
|
+
|
|
134
|
+
### 7. Clean up continuously
|
|
135
|
+
|
|
136
|
+
Throughput cao làm entropy tích lũy nhanh. Cleanup, targeted refactor, và
|
|
137
|
+
review lại artifact bền vững là một phần của harness, không phải việc phụ
|
|
138
|
+
[S1].
|
|
157
139
|
|
|
158
|
-
|
|
159
|
-
chủ quan như frontend design. Anthropic giải quyết bằng cách tách generator và
|
|
160
|
-
evaluator. Generator tạo sản phẩm; evaluator dùng tiêu chí chấm, Playwright, và
|
|
161
|
-
quan sát runtime để đưa phản hồi cụ thể; generator lặp lại dựa trên phản hồi đó
|
|
162
|
-
[S4].
|
|
140
|
+
### 8. Synthesize wrappers when rules get too complex
|
|
163
141
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
142
|
+
AutoHarness cho thấy lớp bọc thực thi có thể được sinh tự động bằng iterative
|
|
143
|
+
code refinement dựa trên feedback môi trường để chặn hành vi không hợp lệ trước
|
|
144
|
+
khi nó tác động tới hệ thống. Với cách này, một model nhỏ hơn như
|
|
145
|
+
Gemini-2.5-Flash có thể vượt model lớn hơn trên các môi trường TextArena nhờ
|
|
146
|
+
harness sinh tự động bù lại năng lực mô hình [S5]. Khi phù hợp, code-as-policy
|
|
147
|
+
còn loại bỏ LLM call ở thời điểm ra quyết định để giảm latency và cost runtime
|
|
148
|
+
[S5].
|
|
167
149
|
|
|
168
|
-
|
|
169
|
-
và **LLM-as-a-judge** tự động. Việc đánh giá một agent dài hạn không chỉ đo lường
|
|
170
|
-
kết quả đầu ra tĩnh (static final evaluation) mà phải giám sát và chấm điểm toàn bộ
|
|
171
|
-
chuỗi hành động (gọi tool, suy luận) để phát hiện sai lệch hiệu năng sớm. Hơn nữa,
|
|
172
|
-
cơ chế **Meta-Evaluation (VeRO)** có thể được sử dụng để liên tục tối ưu hóa chính
|
|
173
|
-
cấu trúc của harness (prompt, tool) dựa trên vết chạy của session trước [S5].
|
|
150
|
+
## Reference Architecture
|
|
174
151
|
|
|
175
|
-
|
|
152
|
+
Một harness trưởng thành có thể đọc như hệ điều khiển bốn lớp:
|
|
176
153
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
154
|
+
| Lớp | Câu hỏi | Artifact điển hình | Nguồn |
|
|
155
|
+
| --- | --- | --- | --- |
|
|
156
|
+
| State | Agent có biết việc đã xảy ra chưa? | feature list, progress log, git history | [S2] |
|
|
157
|
+
| Senses | Agent có thấy hành vi thật chưa? | browser, API check, log, metric, trace | [S1], [S2], [S4] |
|
|
158
|
+
| Standards | Done nghĩa là gì? | acceptance criteria, sprint contract, evaluator rubric | [S3], [S4] |
|
|
159
|
+
| Constraints | Điều gì không được drift? | lint, structural test, CI, cleanup, synthesized wrapper | [S1], [S5] |
|
|
180
160
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
Nếu task dài, contract nên nêu user path, API/data path, negative case, và cách
|
|
185
|
-
quan sát runtime [S3], [S4].
|
|
161
|
+
Thứ tự triển khai nên đi từ rẻ đến đắt: state trước, verification trước, tool
|
|
162
|
+
quan sát khi cần, evaluator khi self-review yếu, planner khi scope mơ hồ, và
|
|
163
|
+
guardrail khi invariant đã rõ [S2], [S3], [S4], [S5].
|
|
186
164
|
|
|
187
|
-
|
|
165
|
+
## Practical Rollout Plan
|
|
188
166
|
|
|
189
|
-
|
|
190
|
-
do agent sinh ra tăng nhanh. Họ mã hóa architecture rule, dependency direction,
|
|
191
|
-
data boundary parsing, structured logging, file size limit, naming convention,
|
|
192
|
-
và reliability rule bằng custom linter hoặc structural test [S1].
|
|
167
|
+
### Phase 1: Minimum viable harness
|
|
193
168
|
|
|
194
|
-
|
|
195
|
-
làm. Khi review comment hoặc bug lặp lại, harness tốt biến judgment đó thành
|
|
196
|
-
doc, lint, test, hoặc tool để agent tương lai không phải học lại từ đầu [S1].
|
|
169
|
+
Mục tiêu: làm cho session mới khởi động được và biết phải làm gì.
|
|
197
170
|
|
|
198
|
-
|
|
199
|
-
bằng code). Thay vì con người phải tự viết thủ công tất cả luật linter hay guardrail,
|
|
200
|
-
mô hình có thể tự động phân tích và sinh ra lớp bọc (code harness/wrapper) để lọc/chặn
|
|
201
|
-
các hành động không hợp lệ trước khi chúng tác động tới môi trường [S5]. Cơ chế này
|
|
202
|
-
thậm chí có thể biên dịch toàn bộ chính sách quyết định thành code tĩnh
|
|
203
|
-
(**Harness-as-Policy**), giúp chạy trực tiếp mà không tốn chi phí và độ trễ gọi mô hình
|
|
204
|
-
ở runtime [S5].
|
|
171
|
+
Artifacts tối thiểu:
|
|
205
172
|
|
|
206
|
-
|
|
173
|
+
- `AGENTS.md`
|
|
174
|
+
- `README.md`
|
|
175
|
+
- `init.sh`
|
|
176
|
+
- `feature_list.json`
|
|
177
|
+
- `progress.md`
|
|
178
|
+
- `lessons.md`
|
|
179
|
+
- test/smoke command
|
|
207
180
|
|
|
208
|
-
|
|
209
|
-
nhiều và lan truyền pattern lệch". OpenAI mô tả recurring cleanup process,
|
|
210
|
-
quality grade, và targeted refactoring pull request như một dạng garbage
|
|
211
|
-
collection cho codebase agent-first [S1].
|
|
181
|
+
Acceptance:
|
|
212
182
|
|
|
213
|
-
|
|
214
|
-
|
|
183
|
+
- session mới đọc được thứ tự đọc;
|
|
184
|
+
- setup chạy được;
|
|
185
|
+
- feature có trạng thái rõ;
|
|
186
|
+
- progress ghi được việc đang làm;
|
|
187
|
+
- commit trở thành checkpoint [S1], [S2].
|
|
215
188
|
|
|
216
|
-
|
|
189
|
+
### Phase 2: Verification harness
|
|
217
190
|
|
|
218
|
-
|
|
191
|
+
Mục tiêu: chặn done sớm và thiếu handoff.
|
|
219
192
|
|
|
220
|
-
|
|
221
|
-
list, progress file, git history, và `init.sh` giảm thời gian khởi động và giúp
|
|
222
|
-
agent chọn phần việc kế tiếp có phạm vi rõ [S2].
|
|
193
|
+
Thêm:
|
|
223
194
|
|
|
224
|
-
|
|
195
|
+
- test hoặc smoke test rẻ;
|
|
196
|
+
- gate kiểm state update;
|
|
197
|
+
- evidence trong `feature_list.json`;
|
|
198
|
+
- entry progress mới nhất phải nêu artifact đã đổi và command verify [S1], [S2].
|
|
225
199
|
|
|
226
|
-
|
|
227
|
-
kiểm chứng hành vi thay vì chỉ đọc code. Evaluator riêng có thể bắt gap mà
|
|
228
|
-
generator bỏ sót, như feature display-only, interaction thiếu chiều sâu, hoặc
|
|
229
|
-
stub chưa được thay bằng hành vi thật [S1], [S2], [S4].
|
|
200
|
+
### Phase 3: Runtime observability
|
|
230
201
|
|
|
231
|
-
|
|
232
|
-
sát độ an toàn và hiệu năng của agent liên tục, phát hiện lỗi suy luận hoặc lỗi
|
|
233
|
-
gọi công cụ một cách có hệ thống trước khi tích hợp [S5].
|
|
202
|
+
Mục tiêu: thấy hành vi thật thay vì chỉ thấy code.
|
|
234
203
|
|
|
235
|
-
|
|
204
|
+
Thêm khi cần:
|
|
236
205
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
206
|
+
- browser automation;
|
|
207
|
+
- API checks;
|
|
208
|
+
- log, metric, trace;
|
|
209
|
+
- database state checks [S1], [S2], [S4].
|
|
240
210
|
|
|
241
|
-
###
|
|
211
|
+
### Phase 4: Evaluation separation
|
|
242
212
|
|
|
243
|
-
|
|
244
|
-
sinh ra, nhưng họ cũng cảnh báo mức tự chủ đó phụ thuộc mạnh vào cấu trúc và
|
|
245
|
-
tooling cụ thể của repository [S1]. Vì vậy lợi ích không nên được đọc như lời
|
|
246
|
-
hứa phổ quát; nó là kết quả của đầu tư vào harness.
|
|
213
|
+
Mục tiêu: giảm self-review bias.
|
|
247
214
|
|
|
248
|
-
|
|
215
|
+
Thêm khi task có UI, design, hoặc chất lượng chủ quan:
|
|
249
216
|
|
|
250
|
-
|
|
217
|
+
- evaluator riêng;
|
|
218
|
+
- rubric rõ;
|
|
219
|
+
- sprint contract;
|
|
220
|
+
- handoff artifact giữa generator và evaluator [S4].
|
|
251
221
|
|
|
252
|
-
|
|
253
|
-
giờ và token. Anthropic nêu các run ứng dụng dài hạn kéo dài hàng giờ với chi
|
|
254
|
-
phí đáng kể. Vì vậy harness phức tạp phải được dùng như tradeoff có chủ đích,
|
|
255
|
-
không phải mặc định [S4].
|
|
222
|
+
### Phase 5: Mechanical guardrails and cleanup
|
|
256
223
|
|
|
257
|
-
|
|
224
|
+
Mục tiêu: giữ kiến trúc ổn định qua throughput cao.
|
|
258
225
|
|
|
259
|
-
|
|
260
|
-
model mới tốt hơn. Anthropic khuyến nghị re-examine harness khi model thay đổi:
|
|
261
|
-
loại bỏ phần không còn load-bearing và thêm phần mới nếu model mở ra khả năng
|
|
262
|
-
khác [S4].
|
|
226
|
+
Thêm:
|
|
263
227
|
|
|
264
|
-
|
|
228
|
+
- lint;
|
|
229
|
+
- structural tests;
|
|
230
|
+
- CI rule;
|
|
231
|
+
- cleanup cadence;
|
|
232
|
+
- doc-gardening hoặc freshness check nếu source of truth drift [S1].
|
|
265
233
|
|
|
266
|
-
|
|
267
|
-
mà nó thiếu giác quan trực tiếp. Anthropic nêu ví dụ âm thanh: QA về musical
|
|
268
|
-
taste bị giới hạn nếu model không thực sự nghe được output [S4].
|
|
234
|
+
### Phase 6: Auto-synthesized wrappers
|
|
269
235
|
|
|
270
|
-
|
|
236
|
+
Mục tiêu: xử lý rule quá phức tạp cho việc viết tay.
|
|
271
237
|
|
|
272
|
-
|
|
273
|
-
trúc và tooling của repository. Đội khác không nên kỳ vọng outcome tương tự nếu
|
|
274
|
-
chưa có source of truth cục bộ, setup lặp lại, tool quan sát, test, lint, review
|
|
275
|
-
loop, và cleanup [S1].
|
|
238
|
+
Chỉ chọn khi:
|
|
276
239
|
|
|
277
|
-
|
|
240
|
+
- rule dày đặc và lặp lại;
|
|
241
|
+
- hành vi không hợp lệ cần chặn trước runtime;
|
|
242
|
+
- cost runtime của LLM call là vấn đề;
|
|
243
|
+
- wrapper code có thể được tổng hợp và kiểm soát bằng verify [S5].
|
|
278
244
|
|
|
279
|
-
|
|
245
|
+
## Artifact Contract
|
|
280
246
|
|
|
281
|
-
|
|
|
247
|
+
| Artifact | Nên chứa | Không nên chứa | Nguồn |
|
|
282
248
|
| --- | --- | --- | --- |
|
|
283
|
-
|
|
|
284
|
-
|
|
|
285
|
-
|
|
|
286
|
-
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
249
|
+
| `AGENTS.md` | Bản đồ vào repo: đọc gì trước, lệnh nào chuẩn, điều gì bị cấm | Manual dài hoặc lịch sử dự án | [S1] |
|
|
250
|
+
| `README.md` | Mục tiêu dự án, cấu trúc chính, cách chạy cơ bản | Task state ngắn hạn | [S1] |
|
|
251
|
+
| `feature_list.json` | Scope công việc, acceptance, verify command, status, evidence | Rule kiến trúc chung | [S2] |
|
|
252
|
+
| `progress.md` | Verify đã chạy, lỗi đang mở, bước kế tiếp | Policy bền vững lặp lại cho mọi task | [S2] |
|
|
253
|
+
| `lessons.md` | Mistake, root cause, rule, status promote | Rule đã promote | [S1], [S2] |
|
|
254
|
+
| Test/lint/check | Invariant cần cưỡng chế bằng máy | Giải thích dài thay cho check chạy được | [S1] |
|
|
255
|
+
|
|
256
|
+
## State Update Contract
|
|
257
|
+
|
|
258
|
+
Khi task chạm behavior artifact như source code, `scripts/`, `tests/`,
|
|
259
|
+
`skills/`, manifest package, workflow verify, hoặc `AGENTS.md`, agent nên:
|
|
260
|
+
|
|
261
|
+
1. Chạy baseline trước sửa nếu task có rủi ro hồi quy.
|
|
262
|
+
2. Nêu acceptance criteria và verify command trước khi đổi trạng thái.
|
|
263
|
+
3. Sau khi verify pass, cập nhật feature state với evidence cụ thể.
|
|
264
|
+
4. Thêm entry progress mới nhất, liệt kê behavior artifact đã đổi, command
|
|
265
|
+
đã chạy, kết quả, và bước tiếp theo.
|
|
266
|
+
5. Chỉ tuyên bố hoàn tất hoặc commit checkpoint sau khi gate state và lệnh
|
|
267
|
+
verify đều pass [S2].
|
|
268
|
+
|
|
269
|
+
## Session Loop
|
|
270
|
+
|
|
271
|
+
Mỗi session dài hạn nên làm:
|
|
272
|
+
|
|
273
|
+
1. Đọc `AGENTS.md`.
|
|
274
|
+
2. Đọc `progress.md`.
|
|
275
|
+
3. Đọc `feature_list.json` hoặc artifact trạng thái tương đương.
|
|
276
|
+
4. Xem git history gần nhất.
|
|
277
|
+
5. Chạy `init.sh` hoặc setup command.
|
|
278
|
+
6. Chạy smoke test rẻ nhất.
|
|
279
|
+
7. Chọn một feature/fix chưa verify.
|
|
280
|
+
8. Viết acceptance criteria ngắn.
|
|
281
|
+
9. Thực hiện thay đổi nhỏ nhất.
|
|
282
|
+
10. Verify bằng lệnh hoặc quan sát đã nêu.
|
|
283
|
+
11. Chỉ đổi trạng thái feature sau khi verify pass.
|
|
284
|
+
12. Nếu lỗi do agent gây ra, ghi lesson trước khi sửa tiếp.
|
|
285
|
+
13. Ghi progress và commit nếu workflow yêu cầu [S1], [S2].
|
|
286
|
+
|
|
287
|
+
## Failure Modes and Responses
|
|
288
|
+
|
|
289
|
+
| Failure mode | Response tối thiểu |
|
|
290
|
+
| --- | --- |
|
|
291
|
+
| Mất context giữa session | Externalize state vào feature list, progress, commit, setup script [S2] |
|
|
292
|
+
| Done sớm | Gate trạng thái bằng verify command và evidence [S2] |
|
|
293
|
+
| Không thấy runtime | Thêm browser/API/log/metric/trace [S1], [S2], [S4] |
|
|
294
|
+
| Self-review quá lạc quan | Tách generator khỏi evaluator [S4] |
|
|
295
|
+
| Drift kiến trúc | Mã hóa rule thành lint/structural test/CI [S1] |
|
|
296
|
+
| Throughput làm nợ kỹ thuật tích lũy | Cleanup định kỳ và doc-gardening [S1] |
|
|
297
|
+
| Rule quá phức tạp để viết tay | AutoHarness hoặc wrapper code sinh tự động [S5] |
|
|
298
|
+
|
|
299
|
+
## Tradeoffs
|
|
300
|
+
|
|
301
|
+
Harness mạnh hơn không có nghĩa là harness càng phức tạp càng tốt.
|
|
302
|
+
|
|
303
|
+
- Harness nhiều lớp có thể tốn giờ và token; đây là tradeoff có chủ đích, không
|
|
304
|
+
phải mặc định [S4].
|
|
305
|
+
- Một số lớp orchestration hữu ích ở model hiện tại có thể không còn load-
|
|
306
|
+
bearing khi model mới tốt hơn [S4].
|
|
307
|
+
- Evaluator vẫn là mô hình nên vẫn có giới hạn, đặc biệt nếu domain cần giác
|
|
308
|
+
quan trực tiếp mà evaluator không có [S4].
|
|
309
|
+
- Không phải task nào cũng cần agent hoặc harness nặng. Nếu task nhỏ và đường
|
|
310
|
+
đi rõ, workflow đơn giản vẫn là lựa chọn đúng [S3].
|
|
311
|
+
|
|
312
|
+
## Implementation Checklist
|
|
313
|
+
|
|
314
|
+
Khi đưa harness vào repository thật:
|
|
315
|
+
|
|
316
|
+
- kiểm kê setup, test, CI, docs, và failure mode đang xảy ra;
|
|
317
|
+
- tạo artifact tối thiểu trong contract;
|
|
318
|
+
- viết feature đầu tiên mô tả chính harness và verify command của nó;
|
|
319
|
+
- tạo smoke test rẻ nhất cho setup;
|
|
320
|
+
- tạo ít nhất một negative test cho trạng thái sai;
|
|
321
|
+
- chạy verify, ghi evidence, rồi mới dùng harness cho task sản phẩm [S1], [S2].
|
|
322
|
+
|
|
323
|
+
## Conclusion
|
|
324
|
+
|
|
325
|
+
Kết luận thực dụng từ năm nguồn là:
|
|
326
|
+
|
|
327
|
+
1. Đừng bắt đầu bằng harness phức tạp.
|
|
328
|
+
2. Bắt đầu bằng task rõ, state bền vững, setup lặp lại, và verify thật [S2],
|
|
329
|
+
[S3].
|
|
330
|
+
3. Thêm tool quan sát khi agent không thấy runtime [S1], [S2], [S4].
|
|
331
|
+
4. Tách generator khỏi evaluator khi self-review yếu [S4].
|
|
332
|
+
5. Mã hóa invariant lặp lại thành rule chạy được [S1].
|
|
333
|
+
6. Khi rule quá phức tạp để giữ tay, xem xét wrapper code sinh tự động như
|
|
334
|
+
AutoHarness [S5].
|
|
335
|
+
|
|
336
|
+
Đây là định nghĩa thực dụng của harness engineering trong phạm vi [S1]–[S5]:
|
|
337
|
+
không phải thêm nhiều agent, mà là xây môi trường để agent tạo tiến triển phần
|
|
338
|
+
mềm có thể tiếp tục, kiểm chứng, và duy trì qua nhiều session.
|