codex-harness-engineering 0.1.4 → 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.
Files changed (34) hide show
  1. package/AGENTS.md +18 -6
  2. package/LICENSE +21 -0
  3. package/README.md +69 -6
  4. package/docs/harness-engineering/implementation-playbook.md +232 -286
  5. package/docs/harness-engineering/index.md +7 -4
  6. package/docs/harness-engineering/research-note.md +294 -274
  7. package/docs/harness-engineering/sources.md +166 -72
  8. package/package.json +9 -4
  9. package/scripts/install-skills.mjs +73 -15
  10. package/scripts/publish.sh +2 -2
  11. package/scripts/verify-harness.mjs +61 -4
  12. package/skills/acceptance-contract/SKILL.md +39 -49
  13. package/skills/acceptance-contract/agents/openai.yaml +2 -2
  14. package/skills/cleanup-harness/SKILL.md +48 -59
  15. package/skills/cleanup-harness/agents/openai.yaml +2 -2
  16. package/skills/creator-harness/SKILL.md +79 -95
  17. package/skills/creator-harness/agents/openai.yaml +2 -2
  18. package/skills/creator-harness/references/harness-artifacts.md +63 -62
  19. package/skills/lessons-harness/SKILL.md +68 -0
  20. package/skills/lessons-harness/agents/openai.yaml +4 -0
  21. package/templates/harness/AGENTS.md +77 -0
  22. package/templates/harness/feature_list.json +16 -0
  23. package/templates/harness/init.sh +15 -0
  24. package/templates/harness/lessons.md +18 -0
  25. package/templates/harness/memory/README.md +22 -0
  26. package/templates/harness/progress.md +33 -0
  27. package/templates/harness/rotate-state.mjs +131 -0
  28. package/templates/harness/verify-state.mjs +117 -0
  29. package/templates/team/roles/evaluator.md +43 -0
  30. package/templates/team/roles/implementer.md +29 -0
  31. package/templates/team/roles/planner.md +28 -0
  32. package/templates/team/sprint-template.md +36 -0
  33. package/templates/team/verify-team.mjs +71 -0
  34. package/templates/team/workflow.md +62 -0
@@ -1,318 +1,338 @@
1
- # Harness Engineering cho AI Agent làm việc dài hạn
1
+ # Harness Engineering White Paper
2
2
 
3
- ## Tóm tắt
3
+ ## Abstract
4
4
 
5
- Harness engineering là kỷ luật thiết kế môi trường quanh AI agent để agent
6
- thể tạo tiến triển dài hạn, kiểm chứng được, và duy trì được. Các nghiên cứu của
7
- OpenAI, Anthropic Google cho thấy cùng một luận điểm: năng lực hình chỉ trở
8
- thành năng lực sản xuất khi môi trường cung cấp state bền vững, tool dễ dùng,
9
- quan sát runtime, tiêu chí nghiệm thu, feedback loop, guardrail học, dọn dẹp
10
- hệ thống, các chế tự động hóa hay đánh giá vết chạy [S1], [S2], [S3], [S4], [S5].
5
+ Harness engineering là thiết kế lớp môi trường quanh AI agent để biến năng
6
+ lực 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; cần repository-local state, tool dễ đọc, quan sát
10
+ runtime, tiêu chí done, guardrail học, cleanup định kỳ, khi cần thì lớp
11
+ bọc thực thi sinh tự động [S1], [S2], [S4], [S5].
11
12
 
12
- Tài liệu này tổng hợp năm nguồn đó. Mọi nguồn mở rộng khác ngoài phạm vi đã bị
13
- loại bỏ để giữ trọng tâm.
13
+ ## Executive Summary
14
14
 
15
- ## 1. Vấn đề
15
+ Để triển khai thực tế, harness nên được xây theo thứ tự sau:
16
16
 
17
- Một agent thể viết code tốt trong một lượt nhưng vẫn thất bại ở công việc dài
18
- hạn. Các failure mode lặp lại là:
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, 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
- - session mới không biết session trước đã làm gì;
21
- - agent cố hoàn thành toàn bộ app trong một lần để lại trạng thái khó tiếp
22
- tục;
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ổ 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
- Một diễn giải thực dụng từ [S1] và [S2] là nên tách hai loại trạng thái. Loại
115
- ổn định của repository gồm rule, architecture, setup, và lệnh chuẩn; loại biến
116
- động của công việc gồm feature đang làm, kết quả verify gần nhất, bước kế
117
- tiếp. Trộn cả hai vào một file dài làm session mới khó phục hồi nhanh và làm
118
- instruction dễ drift theo tiến độ ngắn hạn [S1], [S2].
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
36
+ diễn giải triển khai.
155
37
 
156
- ### 4.4 Tách sinh kết quả khỏi đánh giá
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
- Một agent tự đánh giá output của chính nó thường quá tích cực, đặc biệt ở task
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
- Điểm cốt lõi evaluator không cần hoàn hảo. cần đủ hoài nghi và đủ cụ thể:
165
- tiêu chí nào fail, bằng chứng quan sát gì, user path nào lỗi, API hoặc state
166
- nào chưa đúng, sửa tiếp nên nhắm vào đâu [S4].
142
+ AutoHarness cho thấy lớp bọc thực thi 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 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
- Google Cloud bổ sung khía cạnh **đánh giá vết thực thi (Trajectory Evaluation)**
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
- ### 4.5 Dùng sprint contract cho task dài
152
+ Một harness trưởng thành thể đọc như hệ điều khiển bốn lớp:
176
153
 
177
- Với phát triển ứng dụng dài hạn, Anthropic dùng planner để mở rộng prompt ngắn
178
- thành spec, generator để build, evaluator để QA, và sprint contract để hai bên
179
- đồng thuận trước về scope "done" [S4].
154
+ | Lớp | Câu hỏi | Artifact điển hình | Nguồn |
155
+ | --- | --- | --- | --- |
156
+ | State | Agent 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
- Sprint contract không phải thủ tục quản dự án. artifact điều khiển:
182
- giới hạn phạm vi generator, làm acceptance criteria, cho evaluator tiêu
183
- chuẩn chấm độc lập. Nếu task nhỏ, một acceptance contract hoặc test case là đủ.
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 đã [S2], [S3], [S4], [S5].
186
164
 
187
- ### 4.6 Cưỡng chế invariant bằng cơ chế kỹ thuật
165
+ ## Practical Rollout Plan
188
166
 
189
- OpenAI nhấn mạnh rằng documentation đơn thuần không giữ được coherence khi code
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
- Nguyên tắc là: prompt nói điều nên làm; guardrail học chặn điều không được
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 biết phải làm gì.
197
170
 
198
- Google DeepMind đóng góp giải pháp **AutoHarness** (tự động tổng hợp lớp bọc thực thi
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
- ### 4.7 Cleanup là một phần của harness
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
- Throughput cao đổi failure mode từ "agent không viết được" sang "agent viết
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
- Cleanup không phải refactor tùy hứng. nên là task có trigger, phạm vi, tiêu
214
- chí nghiệm thu, và verification giống mọi thay đổi khác.
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
- ## 5. Lợi ích
189
+ ### Phase 2: Verification harness
217
190
 
218
- ### 5.1 Tiến triển dài hạn tốt hơn
191
+ Mục tiêu: chặn done sớm thiếu handoff.
219
192
 
220
- Externalized state giúp session mới không phải đoán dự án đang ở đâu. Feature
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
- ### 5.2 QA tốt hơn
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
- Browser automation, test runtime, API check, log, metric, và trace giúp agent
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
- Đánh giá vết thực thi (trajectory evaluation) LLM-as-a-judge tự động giúp giám
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 chỉ thấy code.
234
203
 
235
- ### 5.3 Judgment của con người tích lũy
204
+ Thêm khi cần:
236
205
 
237
- Khi preference, review comment, architecture rule, và bug pattern được mã hóa
238
- vào docs, lint, test, hoặc cleanup, chúng ảnh hưởng tới nhiều lần chạy agent sau
239
- đó. Harness biến một lần can thiệp của con người thành ràng buộc lặp lại [S1].
206
+ - browser automation;
207
+ - API checks;
208
+ - log, metric, trace;
209
+ - database state checks [S1], [S2], [S4].
240
210
 
241
- ### 5.4 Tốc độ cao hơn nếu môi trường đủ chín
211
+ ### Phase 4: Evaluation separation
242
212
 
243
- OpenAI báo cáo case study nội bộ với throughput PR cao và codebase lớn do Codex
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
- ## 6. Chi phí giới hạn
215
+ Thêm khi task UI, design, hoặc chất lượng chủ quan:
249
216
 
250
- ### 6.1 Complexity có giá
217
+ - evaluator riêng;
218
+ - rubric rõ;
219
+ - sprint contract;
220
+ - handoff artifact giữa generator và evaluator [S4].
251
221
 
252
- Harness nhiều agent, nhiều vòng evaluator, và nhiều QA runtime có thể tốn nhiều
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
- ### 6.2 Model capability thay đổi thiết kế harness
224
+ Mục tiêu: giữ kiến trúc ổn định qua throughput cao.
258
225
 
259
- Một lớp orchestration hữu ích với model hiện tại có thể không còn cần thiết khi
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
- ### 6.3 Evaluator vẫn có giới hạn
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
- Evaluator LLM nên vẫn có thể bỏ sót bug hoặc đánh giá sai, nhất là ở domain
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
- ### 6.4 Kết quả không tự động tổng quát hóa
236
+ Mục tiêu: xử rule quá phức tạp cho việc viết tay.
271
237
 
272
- OpenAI nói rõ khả năng Codex drive feature end-to-end phụ thuộc mạnh vào cấu
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
- ## 7. hình tổng hợp
240
+ - rule dày đặc 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
- Một harness trưởng thành có thể được đọc như hệ điều khiển gồm bốn lớp:
245
+ ## Artifact Contract
280
246
 
281
- | Lớp | Câu hỏi | Artifact điển hình | Nguồn |
247
+ | Artifact | Nên chứa | Không nên chứa | Nguồn |
282
248
  | --- | --- | --- | --- |
283
- | State | Agent biết việc đã xảy ra chưa? | feature list, progress log, git history | [S2] |
284
- | Senses | Agent thấy hành vi thật chưa? | browser, API check, log, metric, trace, trajectory evaluator | [S1], [S2], [S4], [S5] |
285
- | Standards | Done nghĩa gì? | acceptance criteria, sprint contract, evaluator rubric, LLM-as-a-judge | [S3], [S4], [S5] |
286
- | Constraints | Điều không được drift? | lint, structural test, CI, cleanup, synthesized code harness | [S1], [S5] |
287
-
288
- Thứ tự triển khai nên đi từ rẻ đến đắt: state trước, verification trước, tool
289
- quan sát khi cần, evaluator khi self-review yếu, planner khi scope mơ hồ, và
290
- guardrail khi invariant đã rõ.
291
-
292
- ## 8. Câu hỏi mở
293
-
294
- Năm nguồn để lại một số câu hỏi nghiên cứu:
295
-
296
- - Khi nào một agent tổng quát tốt hơn nhiều agent chuyên biệt? [S2], [S4]
297
- - Khi nào evaluator đáng chi phí so với self-review hoặc test deterministic?
298
- [S3], [S4]
299
- - Làm sao đo được phần cải thiện đến từ model, prompt, tool, state, evaluator,
300
- hay guardrail? [S3], [S4]
301
- - Architecture coherence của codebase agent-generated sẽ tiến hóa thế nào qua
302
- nhiều năm? [S1]
303
- - Những phần harness nào nên bị loại bỏ khi model mới mạnh hơn? [S4]
304
- - Khi nào nên dùng AutoHarness tự động sinh thay vì viết linter/guardrail thủ công? [S5]
305
- - Làm thế nào để giảm thiểu sai số của LLM-as-a-judge trong trajectory evaluation? [S5]
306
-
307
- ## 9. Kết luận
308
-
309
- Harness engineering làm autonomy trở thành thuộc tính của hệ thống, không chỉ
310
- là thuộc tính của model. Một model mạnh trong môi trường thiếu state, thiếu
311
- tool, thiếu tiêu chí done, và thiếu guardrail sẽ tạo tiến triển giòn. Cùng model
312
- đó trong harness tốt thể tiếp tục công việc, quan sát lỗi, nhận feedback,
313
- sửa bằng chứng, giữ kiến trúc ổn định hơn.
314
-
315
- Kết luận thực dụng từ các nghiên cứu là: đừng bắt đầu bằng harness phức tạp. Bắt
316
- đầu bằng task rõ, state bền vững, setup lặp lại, và verify thật. Chỉ thêm evaluator,
317
- planner, observability, hoặc cleanup automation khi failure mode cụ thể cho
318
- thấy chúng đang mua thêm chất lượng đáng giá.
249
+ | `AGENTS.md` | Bản đồ vào repo: đọc trước, lệnh nào chuẩn, điều 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 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 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ả, 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.