Kit cho agent: ba lớp, và cây thư mục từ kit tới máy
Kit gồm những gì, cái gì không nên tự viết, và ba cây thư mục dùng chung: repo kit, hub của một sản phẩm, thư mục cha trên một máy.
00Câu hỏi
- Xây kit có thực sự quan trọng không, hay chỉ là chi phí? Với một dự án thì sao, với nhiều đội thì sao?
- Tool là giá trị riêng của dự án, vậy kit thay thế hay bổ sung?
- Cây thư mục của kit, của sản phẩm, của máy trông thế nào?
- Sản phẩm nhiều nền tảng, nhiều phân hệ thì tổ chức ra sao?
Trả lời ngắn: kit quan trọng, nhưng khoảng 80% giá trị là chữ: quy ước, schema, hồ sơ, mẫu. Lớp nghiệp vụ mỏng là phần đáng giữ. Lớp engine tương tác không tự viết. Với một dự án chỉ làm lớp chữ; với nhiều đội, kit là khoản đầu tư có lãi rõ nhất nhưng tháng đầu phải dành cho luật chung, kiểm kê và baseline.
01Ba lớp của kit
| Lớp | Gồm gì | Thư mục kit | Quan trọng | Chi phí | Làm khi nào |
|---|---|---|---|---|---|
| Chữ | luật một trang, vai và cổng, sáu hồ sơ, mẫu request / spec / plan / task / gap, quy ước, schema env / role / flow / step / report / request / gap, hook | doc/ schema/ hook/ | rất cao | thấp, vài ngày | ngay tuần đầu |
| Nghiệp vụ mỏng | testenv theo vai, tài khoản bảo vệ, dọn dữ liệu test, pipeline report, khung lệnh kiểm, điều phối flow con | core/ | cao | vừa, vài tuần | khi gap lặp 2–3 lần |
| Engine tương tác | runner, DSL flow, auto-wait, trace, CDP, adb, eval JS | adapter/ chỉ là vỏ | thấp | cao, nuôi mãi | không tự làm, uỷ cho Playwright, Maestro |
Chỗ nguy hiểm là lớp thứ ba. Engine rất dễ nuốt thời gian mà không tăng giá trị tái dùng. Đây là bẫy “xây nền tảng trước sản phẩm”: người giỏi nhất đi làm kit, dự án thật không ai lái agent, kit làm xong không ai biết thiếu gì.
Một thành phần chỉ được đưa vào kit khi đủ ba điều kiện: gap đó xuất hiện ít nhất hai đến ba lần, không có tool chuẩn nào phủ được, và nó thuộc lớp nghiệp vụ chứ không phải lớp tương tác.
Quy tắc nhanh để xếp bất kỳ lệnh nào: lệnh biết về vai, tài khoản, dữ liệu hay bằng chứng thuộc lớp nghiệp vụ. Lệnh biết về selector, pixel, thời gian chờ thuộc lớp engine. Thứ là schema, help hay tài liệu thuộc lớp chữ. Tái cấu trúc thì tách theo lớp, không tách theo CLI.
02Tool riêng là giá trị của dự án
Agent không biết sản phẩm là gì; thứ duy nhất dạy nó là tool: lệnh đăng nhập như app thật, vai và tài khoản, cách dọn dữ liệu test, lệnh điều khiển thiết bị, testid từng màn hình, flow nghiệm thu. Đó là tri thức sản phẩm đã mã hoá thành lệnh, nằm trong dự án, sống chết cùng dự án.
| Hỏi với từng lệnh | Nếu có |
|---|---|
| Đem sang dự án khác có vô nghĩa không? | giá trị riêng, ở lại dự án |
| Đem sang dự án khác có giống hệt không? | kit |
| Playwright hay Maestro đã có chưa? | engine, uỷ đi |
Vai trò của kit không phải thay tool dự án mà làm cho tool dự án rẻ để xây. Khi kit và engine lo hai nhóm sau, đội dự án dành toàn bộ công cho nhóm một. Thước đo của một đội là số lệnh đặc thù mà agent dùng được, không phải số dòng runner. Tool riêng không chết hẳn cùng dự án: khuôn của nó (cách đặt tên, xuất JSON, gắn vai) thành mẫu trong kit; nội dung ở lại, khuôn mang đi.
03Kit theo quy mô
Một dự án: kit như sản phẩm có repo riêng và người chuyên trách chỉ có nghĩa khi có từ hai dự án dùng chung. Trước đó làm lớp chữ cộng vài lệnh đơn; testenv và report giữ trong dự án đầu tiên nhưng ở repo riêng để sau kéo ra được.
Nhiều đội, nhiều sản phẩm: kit là thứ duy nhất tạo lợi thế theo quy mô. Mỗi đội tự học một bài học thì công ty trả giá bằng số đội. Một cải tiến trong kit nhân lên theo số đội. Lãnh đạo không so sánh được nếu mỗi đội báo cáo bằng một loại bằng chứng: schema report chung là điều kiện để quản lý được. Lớp chữ thành chuẩn bắt buộc với mọi đội; lớp nghiệp vụ dùng chung schema và lệnh đơn, adapter có biến thể theo stack; lớp engine chọn một engine chuẩn cho web, một cho mobile, một runner API.
| Giai đoạn | Việc | Kit ở mức |
|---|---|---|
| Tháng 1 | kiểm kê các đội, ban hành luật một trang, lấy baseline | chưa có |
| Tháng 1–3 | thí điểm 2–3 đội, chọn stack phổ biến nhất | lớp chữ, nằm trong đội thí điểm |
| Tháng 3 | lập đơn vị kit, lấy từ người lái giỏi nhất của đội thí điểm | v1 từ gap thí điểm |
| Tháng 4–6 | đợt hai thêm đội, lập cộng đồng chủ bằng chứng | có version, đội pin |
| Tháng 7–12 | các đội còn lại; sản phẩm sắp hết vòng đời chỉ tuân luật một trang | v2, adapter theo stack |
Ba bẫy. Kit thành dự án có roadmap riêng, ban hành chuẩn bắt buộc trước khi đội nào dùng thật: tuân thủ trên giấy. Người làm kit không lái agent: phải luân phiên ngồi trong đội. Cố chuẩn hoá mọi sản phẩm cùng lúc: sản phẩm sắp hết vòng đời không đáng chuyển. Chỉ bắt buộc lớp chữ và chuẩn bằng chứng; kit đo bằng số đội tự nguyện pin version.
Thứ quan trọng hơn kit trong ba tháng đầu: quản trị dùng tự phát (ai trả tiền tool nào, dữ liệu khách có vào model nào, secret có trong lịch sử chat không), luật một trang, và baseline (thời gian request đến merge, số lần làm lại, lỗi lọt sang khách).
04Cây repo kit
Tên thư mục tiếng Anh, một từ, số ít. Có version, CHANGELOG, dự án pin bằng kit.lock.
agent-kit/ ├── README.md # ba lớp, 7 tầng, cách pin, cách gửi gap ├── VERSION CHANGELOG.md ├── doc/ # LỚP CHỮ, bắt buộc với mọi đội │ ├── policy.md # luật một trang │ ├── role.md # năm vai, bốn cổng │ ├── rule/ # sáu hồ sơ: feature, bugfix, no-behavior-change, visual-tweak, research, ops-rollback │ ├── convention/ # cli-contract, naming, testid, evidence, information-placement │ ├── template/ # request, research, spec, plan, task, gap, decision, gate, baseline, map, │ │ ├── claude/ # CLAUDE.md: user (cấp user), work (thư mục cha), hub, platform, rule-block │ │ ├── hub/ # rule.md, role.json, env.mock.json, smoke.json, bootstrap.md, gitignore │ │ └── tier/ # README platform/, runtime/ │ └── method/ # bộ ghi chú này ├── schema/ # env, role, flow, step, report, request, gap ├── hook/ # request-check, report-gate, secret-scan: thứ bắt buộc, không phải lời dặn ├── core/ # LỚP NGHIỆP VỤ MỎNG: chỉ mọc từ gap ├── adapter/ # LỚP ENGINE: vỏ mỏng gọi Playwright / Maestro / HTTP ├── eval/ # bộ việc mẫu, rubric: đo kit bằng chính agent ├── bin/ # kit-init, kit-doctor └── test/
- Không nằm trong kit: engine, secret, dữ liệu thật, lệnh nghiệp vụ của sản phẩm.
- Bắt buộc chỉ
doc/ schema/ hook/.core/vàadapter/đo bằng số đội tự nguyện dùng. - Dòng chảy: sản phẩm ghi gap, kit gom theo đợt, ra version mới, sản phẩm đổi
kit.lockkhi sẵn sàng.
05Cây hub sản phẩm
Mỗi sản phẩm một hub chứa mọi thứ cắt ngang nền tảng; repo nền tảng chỉ giữ code và đặc thù kỹ thuật. Lệnh init của kit tạo khung này.
product/<sp>-hub/ ├── CLAUDE.md # ngắn: hub chứa gì, luật ở doc/rule.md, kit ở kit.lock ├── kit.lock # agent-kit <version>; dự án cũ khai bảng tên: layout doc=docs flow=flows … ├── cli/ # LỚP TOOL RIÊNG: lệnh có nghĩa với sản phẩm này, theo cli-contract │ ├── command/ # api/ (đăng nhập như app, nghiệp vụ), device/, deploy, status… │ └── lib/ ├── config/ # tham số mỗi lệnh, có _doc; *.local.json ghi đè riêng máy (không git) ├── testenv/ # role.json (vai), env/ (mock, test, thật; secret chỉ là ref) ├── flow/ # acceptance/ smoke/ regression/ ops/ ├── step/<nền-tảng>/ # step tái dùng, biết testid ├── profile/ testid/ fixture/ ├── feature/<tên>/ # research, spec, plan, task của một tính năng ├── gap/ # gap chờ gom về kit theo đợt ├── doc/ │ ├── rule.md # luật sản phẩm một trang: viết tắt, cảnh báo, deploy, rà soát rủi ro │ ├── repos.md gate.md baseline.md │ ├── decision/YYYY-MM-DD-<chủ-đề>.md │ └── server/ release/ … # tài liệu vận hành ├── ops/<máy>/ # hồ sơ máy: bootstrap.md, CLAUDE.md, map.md, manifest tiến trình, route, cron └── secrets/ # chỉ khi dự án quyết giữ secret trong repo private; agent không đọc
- Flow nghiệm thu đi theo phân hệ, step và lệnh thiết bị theo nền tảng, vai và env theo sản phẩm, unit test ở repo nền tảng.
- Phân hệ lớn đến mức có đội riêng vẫn là thư mục, không phải hub riêng. Chỉ tách hub khi phân hệ thành sản phẩm độc lập có vai và env riêng.
- Mono-repo hay multi-repo không đổi cây: gom về một repo thì hub là thư mục gốc, nền tảng ở
apps/<nền-tảng>/.
06Thư mục cha trên một máy: bảy tầng
Mỗi tầng một quy tắc truy cập rõ. Tách checkout sửa code khỏi bản đang chạy; secret cấm agent; bàn làm việc là nơi duy nhất agent ghi tự do. Lệnh init của kit tạo đủ bảy tầng; map.md ở thư mục cha là bản đồ máy, bản có version nằm ở hub ops/<máy>/.
| Tầng | Chứa | Mở phiên? | Quy tắc |
|---|---|---|---|
kit/ | agent-kit và CLI của công ty | không | chỉ đọc; thay đổi qua gap |
product/<sp>-hub/ | hub sản phẩm | có | spec, nghiệm thu, tài liệu, CLI dự án |
platform/<sp>-<nền-tảng>/ | checkout sửa code | có | sửa, commit, push, dừng; deploy khi người confirm |
runtime/ | bản đang chạy, dữ liệu chạy | không | chỉ lệnh deploy của dự án chạm; không sửa, không pull, không restart tay |
vault/ | env có secret, chứng chỉ, khoá, sao lưu, bản phát hành đã ký (quyền 700) | không | cấm agent đọc, in, chép; chặn bằng luật deny |
tools/ | SDK, công cụ cài ngoài repo, log build | không | môi trường máy, không lục |
work/ | request/backlog, run/<ngày>/, review/, note/, draft/ | qua thư mục cha | nơi duy nhất agent ghi tự do; thư mục nào công khai thì không đặt secret, file ẩn, sao lưu |
- Request có id và trạng thái đi qua công cụ request;
work/request/chỉ chứa backlog và nháp. - Bằng chứng mỗi lần chạy ở
work/run/<ngày>/<tác-vụ>/; mỗi phiên ghi tóm tắtwork/run/<ngày>/README.md. Sao lưu của agent cũng ở đó, vì agent không ghi đượcvault/. - Repo khác tìm nhau bằng URL origin, không theo tên hay vị trí thư mục; đường dẫn ở config và env, không ghi cứng trong code. Đổi chỗ thư mục thì sửa
map.mdtrước, rồi grep đường cũ trong config, env, tiến trình, web server, cron.
07Luật nạp vào agent thế nào
Luật có ba nguồn và được nạp qua ba file. Không chép nội dung giữa các file, chỉ import hoặc trỏ.
| Nguồn luật | Nói gì | File nạp |
|---|---|---|
| Kit | luật chung, hợp đồng CLI, quy ước | ~/.claude/CLAUDE.md (cấp user): chỉ dòng import map.md, doc/rule.md của hub, cli-contract.md của kit. Tới mọi phiên, kể cả phiên mở trong platform/<repo>. |
| Hub | luật sản phẩm một trang: viết tắt, cảnh báo, quy tắc deploy, rà soát rủi ro | |
| Máy | mở phiên ở đâu, mỗi phiên bắt đầu, hai luật cứng (runtime chỉ lệnh deploy chạm, vault cấm agent), thư mục công khai | ~/CLAUDE.md ở thư mục cha; mọi phiên bên dưới nạp |
| Repo | đặc thù kỹ thuật + khối rule-block tóm tắt luật sản phẩm cho máy dev không có hai file trên | CLAUDE.md của hub và của từng repo nền tảng; lệnh kiểm cảnh báo khi thiếu khối |
Không đặt import ở ~/CLAUDE.md: phiên mở trong platform/<repo> coi file nằm ngoài thư mục dự án là “external include” và bỏ qua (kiểm thật bằng claude -p). Import phải ở file cấp user, do lệnh setup của dự án sinh theo bố cục từng máy.
08Nhiều nền tảng, nhiều phân hệ
Nghiệm thu là chuyện nghiệp vụ và thường cắt ngang nền tảng (A gửi trên desktop, B nhận trên mobile), còn step mới là thứ biết testid và engine. Vì vậy nền tảng nằm ở khai báo vai, không ở step; kit đọc nền tảng của vai để chọn adapter. Một flow cho ba vai trên ba nền tảng thay cho nhiều file đánh số theo thiết bị:
{
"flow": "works.giao-lam-duyet",
"roles": {
"quan-ly": { "platform": "desktop" },
"nhan-vien":{ "platform": "mobile" },
"duyet": { "platform": "web" }
},
"steps": [
{ "as": "quan-ly", "use": "desktop/works/giao-viec", "params": { "to": "{{nhan-vien.user}}", "title": "[E2E] viec A" }, "save": "viec" },
{ "as": "nhan-vien", "use": "mobile/works/bao-xong", "params": { "id": "{{viec.id}}" } },
{ "as": "duyet", "use": "web/works/duyet", "params": { "id": "{{viec.id}}" }, "expect": { "status": "da-duyet" } }
]
}
Chạy với env “thật” hay “mock” là cùng một flow. Đổi vai sang nền tảng khác thì chỉ đổi đường dẫn use. Bằng chứng xếp theo flow rồi vai và nền tảng.
09Thứ tự làm và thước đo
Bắt đầu từ số không: chữ và schema trước, rồi evidence và testenv trong lớp nghiệp vụ, rồi một adapter, rồi eval. Hook làm ngay khi có schema report. Không hợp nhất runner tự viết; phần engine quyết sau thí điểm, lúc đó danh sách gap cho biết cần uỷ hay cần giữ.
| Thước đo | Ý nghĩa | Dấu hiệu xấu |
|---|---|---|
| Số gap đóng mỗi đợt | kit đang phục vụ dự án thật | kit có tính năng mà không gap nào yêu cầu |
| Số đội tự nguyện pin version mới | kit có giá trị kéo, không phải đẩy | đội pin vì bị bắt, không cập nhật |
| Số lệnh đặc thù agent dùng được mỗi sản phẩm | giá trị riêng của dự án tăng | đội khoe số dòng runner |
| Kết quả eval kit | agent vấp ít hơn sau mỗi version | sửa prompt thay vì sửa tool |
| Thời gian dựng pha nền cho dự án mới | kit làm tool dự án rẻ để xây | vẫn mất hàng tháng cho pha 0 |
10Ví dụ MiniGate
Mỗi CLI gói cả ba lớp trong một binary nên không chuyển được từng lớp. Lớp đáng giá nhất (vai, tài khoản, dữ liệu, bằng chứng, điều phối flow con, điều khiển thiết bị ngoài UI) nằm ở mgctl và một phần CLI mobile. Phần lớn mã lại ở lớp engine: CDP tự viết cho Electron, adb và xcrun tự viết, eval JS và sleep trong runner web. Code chép tay giữa ba repo chính là kit chưa được đặt tên. Hướng xử lý: gom phần nghiệp vụ về hub, uỷ phần engine cho Playwright (web, Electron) và Maestro (mobile), mỗi CLI còn lại là vỏ mỏng.
Repo common có sẵn mgctl, testenv, flow điều phối và test cho tool nên thành hub product/minigate-hub; tên repo trên GitLab giữ nguyên. Hub có trước kit nên giữ tên số nhiều (docs/ flows/ notes/ cli/commands/), khai trong kit.lock; đổi tên sẽ làm chết link ở các repo và đổi id flow. Máy test dùng đúng bảy tầng từ 2026-11-06: năm repo nền tảng ở platform/, ba bản chạy ở runtime/, hồ sơ máy ở hub ops/minigate-test/, luật nạp qua file cấp user do mgctl setup sinh.
Thứ tự chuyển flow về hub: gom step của ba repo về step/<nền-tảng>/; chuyển phân hệ giao việc trước (có ở cả ba nền tảng, ít flow, chuỗi rõ); tách hậu tố “thật / mock” thành env; chat chuyển sau cùng vì nhiều nhất và lệ thuộc engine nặng nhất.
11Việc còn mở
- Engine chuẩn cho công ty: thử Playwright và Maestro trên một sản phẩm mỗi loại trước khi chốt.
- Thứ tự chuyển runner tự viết: cái rò rỉ nặng nhất trước, hay cái gần lớp điều phối nhất trước?
- Mobile chưa có lớp step: viết step trước khi chuyển flow mobile về hub.
- Ai là đơn vị kit đợt đầu; ngân sách token cho eval và loop.
- CLI vận hành của công ty (ssh, request, đồng bộ repo) thuộc kit hay đơn vị vận hành? Đề xuất: vận hành, nhưng tuân hợp đồng CLI của kit.
Kit là chữ cộng một lớp nghiệp vụ mỏng; engine thì mượn; tool riêng của dự án là thứ kit phải làm cho rẻ, không phải thứ kit thay thế.