Working with Claude - ntphiep/zhesen-main GitHub Wiki

Working with Claude Code

Viết cho người giao việc và nghiệm thu, không phải cho người đọc code. Nguồn ở cuối trang.

Năm luật, xếp theo mức đáng đổi

  1. Mỗi việc giao ra phải kèm một phép kiểm tra máy chạy được. Không có nó thì tín hiệu duy nhất để dừng là "trông có vẻ xong", và người kiểm tra trở thành bạn.
  2. Việc gì bắt buộc phải xảy ra thì đặt vào hook, đừng viết thành câu dặn. Câu dặn là gợi ý, hook là bắt buộc.
  3. Một prompt một vấn đề, và chỉ đúng file cần sửa. Một prompt liệt kê năm vấn đề cho kết quả tệ hơn năm prompt liệt kê một vấn đề.
  4. Sửa hai lần không xong thì /clear rồi viết lại prompt. Mức tuân thủ instruction giảm dần theo độ dài session.
  5. Không nhận "đã xong" khi chưa thấy bằng chứng: output lệnh, số đo, hoặc ảnh màn hình.

Khuôn một prompt

Năm phần. Thiếu phần nào thì phần đó do model tự đoán.

[triệu chứng hoặc mục tiêu]
[chỗ cần nhìn: tên file, tên hàm, hoặc đường dẫn]
[file đã làm đúng việc tương tự, bảo bắt chước theo]
["xong" nghĩa là gì, đo bằng cách nào]
[chạy phép kiểm tra đó rồi dán kết quả]
Prompt kém Prompt tốt
"sửa cái wordlist bị lỗi" "Import CSV mất dòng cuối khi file không có newline ở cuối. Xem lib/wordlist/csv.ts. Viết test fail tái hiện lỗi trước, rồi sửa, rồi chạy npx vitest related --run lib/wordlist/csv.ts và dán output."
"làm trang tra cứu nhanh hơn" "/dictionary/en/hello mất 300 ms mỗi lần vào. Xem app/dictionary/[lang]/[id]/page.tsx và cách app/grammar/[lang]/[id]/page.tsx khai generateStaticParams. Sửa theo khuôn đó, build lại, đo 20 lần vào trang và dán bảng số."
"thêm chế độ luyện tập mới" Việc này cần spec, không phải một prompt. Xem mục dưới.

Việc lớn thì viết spec, đừng viết prompt dài

Prompt dài là dấu hiệu việc đó đáng nằm trong một file.

  1. Nói: "phỏng vấn tôi về việc này bằng AskUserQuestion cho tới khi đủ, rồi ghi spec ra scratchpad". Trả lời từng câu hỏi.
  2. Đọc lại spec, sửa chỗ sai.
  3. /clear, mở session mới với đúng một câu: "thực hiện spec ở <đường dẫn>".

Spec tốt tự đứng được: nêu tên file và interface liên quan, nói rõ cái gì nằm ngoài phạm vi, và kết thúc bằng một bước nghiệm thu đầu cuối.

Ba câu nên dùng lại

  • "Dán output lệnh, đừng kể lại."
  • "Không sửa test cho qua. Test fail là phát hiện, báo kèm output."
  • "Build lại rồi mở app bấm thử, gửi ảnh màn hình."

Test xanh không phải bằng chứng đủ mạnh. Model có xu hướng làm cho bộ test nhìn thấy được đi qua, và khoảng cách với bộ test giấu đi nới rộng theo cỡ codebase.

Repo này có sẵn gì

Bốn lớp, xếp theo thứ tự chúng được nạp vào context.

graph TB
  A["AGENTS.md<br/>nạp mọi session"] --> B["rules/tooling.md<br/>nạp mọi session"]
  B --> C["rules/frontend.md · database.md · testing.md<br/>chỉ nạp khi mở file khớp paths:"]
  C --> D["skills<br/>chỉ nạp khi gọi"]
  D --> E["agents<br/>chạy trong session riêng"]
Loading
Thứ Chỗ Nó làm gì
Quy ước code AGENTS.md Dưới 200 dòng, chỉ chứa thứ đọc code không suy ra được
Verify gate .claude/hooks/verify-gate.ps1 Chặn kết thúc lượt nếu lint, type hoặc test liên quan còn hỏng
Rule luôn nạp .claude/rules/tooling.md Khai cái gì đã cài, MCP nào dùng cho việc nào
Rule theo đường dẫn frontend.md, database.md, testing.md Chỉ nạp khi model mở file khớp paths:, nên không tốn context ở việc khác
Tóm tắt đầu session .claude/hooks/session-digest.ps1 Mỗi lần mở, resume hoặc /clear: in việc mở trên board, các worktree đang có người làm, và thay đổi từ session trước
Chặn sửa main checkout .claude/hooks/worktree-guard.ps1 Từ chối sửa file trong main checkout, bảo session vào worktree riêng

Nhiều session cùng lúc

Mỗi session làm trong một worktree riêng. Worktree là một thư mục làm việc riêng của git, dùng chung lịch sử với repo. Main checkout, tức thư mục repo gốc C:\Users\Hiep\Desktop\zhesen\zhesen-main, chỉ để đọc. Khi mọi session sửa chung một thư mục, verify gate của session này chặn vì file dở dang của session khác.

  • Mở session: gõ claude -w <tên-việc>, hoặc mở claude như thường. Claude tự vào worktree trước lần sửa đầu tiên. Worktree mới nhận sẵn .env.local và ghi chú của các subagent (.claude/agent-memory/), nên implementer, reviewer và qa-runtime vẫn nhớ những gì đã học.
  • Đầu session, Claude nhận bản tóm tắt: việc mở trên board theo priority, session nào đang làm ở worktree nào với file nào chưa commit, và commit, issue, trang wiki đã đổi từ lần mở session trước. Main checkout cũng được cập nhật lên master mới nhất lúc đó. Mạng chậm thì bản tóm tắt vẫn ra trong khoảng 20 giây và ghi rõ phần nào chưa lấy được.
  • Xong việc, /ship rebase lên master, chạy verify, push, chép ghi chú mới của subagent về main checkout, rồi xoá worktree.

Ba skill

Gõ trực tiếp, hoặc mô tả việc rồi Claude tự chọn.

Skill Gõ Nó làm gì
Làm một issue /fix-issue 33 Đọc issue, lập kế hoạch nếu cần, sửa, viết test, review, commit
Nghiệm thu UI /verify-ui Build, chạy, bấm thử, đo cả ở kích thước điện thoại, dán bằng chứng
Đưa lên production /ship Kiểm tra sạch, push, theo dõi CI, đọc trạng thái bản deploy

/ship chỉ chạy khi bạn gõ. Claude không tự gọi nó, vì nó đẩy thẳng lên production.

Sáu agent chuyên trách

Nằm ở .claude/agents/. Không cần nhớ tên: nói việc cần làm, Claude tự chọn theo phần mô tả trong từng file.

graph LR
  P["planner<br/>lập kế hoạch"] --> I["implementer<br/>viết code"]
  I --> T["tester<br/>viết và chạy test"]
  T --> R["reviewer<br/>soi diff"]
  R --> Q["qa-runtime<br/>bấm thử trên browser"]
  Q --> B["backlog<br/>giữ issue và wiki"]
Loading

Ba điều đáng biết trước khi bảo chia việc.

Mỗi agent là một session Claude riêng, nên chia việc tốn nhiều hơn làm thẳng. Chỉ đáng chia khi việc tự chứa và kết quả trả về ngắn hơn quá trình làm: đọc log, bấm thử browser, quét cả repo. Sửa vài dòng thì làm thẳng rẻ hơn.

Anthropic khuyên bắt đầu với ba tới năm agent chạy cùng lúc, và nói thẳng rằng ba agent tập trung thường hơn năm agent tản mát.

Agent xong việc phải dừng. Một agent còn chạy vẫn tiêu token.

Muốn ép chia việc thì nói "chia việc cho các agent". Muốn làm thẳng thì nói "làm inline".

implementer, reviewer và qa-runtime giữ một bộ nhớ riêng giữa các session. Chúng ghi lại loại lỗi đã lặp lại và luồng hay hỏng, để lần sau soi chỗ đó trước. Bộ nhớ này nằm ngoài repo và không đi theo máy khác.

Nguồn

⚠️ **GitHub.com Fallback** ⚠️