Claude Code cho thông điệp commit: biến diff thành commit rõ ràng và ghi chú phát hành giải thích tác động với người dùng, rủi ro và mọi bước di chuyển cần thiết.

text\nYou are writing release notes for [product/app]. Audience: [end users/admins/developers].\nInput: the following diffs/commit summaries.\n\nWrite release notes with these sections:\n1) User-visible changes (what’s new or different)\n2) Fixes (symptoms users had, now resolved)\n3) Breaking changes (if none, say “None”)\n4) Migration steps (numbered, short, actionable)\n5) Deprecations (what, when it will be removed, replacement)\n6) Risk and rollout notes (what could go wrong, how to verify)\n\nRules: do not list internal refactors unless they affect behavior. Use plain language.\n\n\nCách này tạo một tách sạch giữa tác động người dùng và dọn dẹp nội bộ, vậy một đổi tên sẽ không lấn át thay đổi hành vi thực sự.\n\n### Mẫu: “Gọi rõ migration và breaking changes”\n\nNgay cả các model cẩn thận cũng bỏ sót migration nếu bạn không hỏi. Thêm các câu hỏi rõ ràng:\n\n- Có thay đổi API responses, key config, env var, hoặc schema không?\n- Người dùng hiện tại sẽ bị hỏng như thế nào sau khi nâng cấp, và họ sẽ nhận ra bằng cách nào?\n- Những bước chính xác để sửa, theo thứ tự?\n- QA nên xác minh gì để đảm bảo release an toàn?\n\nThói quen giống nhau: luôn yêu cầu “tại sao quan trọng” và “phải làm gì tiếp theo”, không chỉ “cái gì thay đổi”.\n\n## Bước-by-step: biến diff thành thông điệp cuối cùng\n\nĐọc diff như reviewer, không phải người viết thay đổi. Công việc của bạn là biến thay đổi mã thành thứ ai đó có thể tin tưởng sau này: cái gì thay đổi, tại sao, và ý nghĩa.\n\n1. Viết tóm tắt một dòng trước. Dùng động từ rõ ràng và nêu bề mặt ảnh hưởng. “Fix crash when saving draft on iOS” tốt hơn “Update save logic.”\n2. Sắp xếp thay đổi theo cấu trúc ổn định. Thứ tự đơn giản hiệu quả cho hầu hết commit: What, Why, Impact, Risk, Migration. Nếu một phần không có, ghi “None” để người đọc khỏi nghĩ bạn quên.\n3. Thêm bước xác minh. Bao gồm một “How to verify” ngắn để người khác có thể theo dõi. Nối nó với hành vi quan sát được, không phải plumbing nội bộ.\n4. Viết ghi chú rollout khi rủi ro. Ghi rõ feature flags, phased rollout, monitoring, và trigger rollback. Nếu có edge case đã biết, nêu ra.\n5. Tinh chỉnh theo đối tượng. Commit messages có thể có một chút ngữ cảnh nội bộ. Release notes nên dùng ngôn ngữ đơn giản.\n\nNếu bạn dùng Claude Code, dán diff cộng 2–3 câu ngữ cảnh (ai bị ảnh hưởng, gì bị hỏng, bạn đã kiểm tra gì) và yêu cầu đầu ra theo cấu trúc đó. Rồi chỉnh sửa giống như bạn chỉnh văn bản do người viết viết.\n\nMột lần chỉnh ngôn từ nhanh giúp dễ đọc:\n\n- Dùng “Người dùng có thể…” hoặc “Admin phải…” thay vì “Chúng tôi refactored…”\n- Thay từ mơ hồ như “improve” bằng kết quả cụ thể\n- Nếu có migration, nói chính xác phải làm gì và khi nào (trước hay sau deploy)\n\nMột thông điệp chắc chắn trả lời: Cái gì thay đổi? Tại sao bây giờ? Có thể hỏng gì? Làm sao biết nó hoạt động? Ai phải làm gì để áp dụng an toàn?\n\n## Ví dụ thực tế: từ diff đến commit và release note\n\nGiả sử một diff nhỏ có vẻ vô hại nhưng có thể phá vỡ client.\n\ndiff\n- type UserResponse struct {\n- FullName string `json:\"fullName\"`\n- }\n+ type UserResponse struct {\n+ Name string `json:\"name\"`\n+ }\n\n+ if req.Name == \"\" {\n+ return errors.New(\"name is required\")\n+ }\n\n\nHai việc đã xảy ra: một field response đổi tên (fullName thành name), và validation được thêm (name bắt buộc). Tốt nhất là bạn yêu cầu tác động, rủi ro, và bước tiếp theo.\n\nĐây là một bản nháp commit message với ngữ cảnh chính mà diff không cho biết:\n\ntext\nRename user response field to `name` and require `name` on create\n\nWhy:\n- Align API with updated domain naming\n\nImpact:\n- Breaking change: clients reading `fullName` must switch to `name`\n- Requests without `name` now fail validation\n\nTests:\n- Updated API tests for response payload\n- Added validation test for missing name\n\n\nVà một mục release note viết cho người dùng, không phải cho code:\n\ntext\nBreaking: User API field rename and stricter validation\n\n- Response field `fullName` is now `name`\n- Create/update requests now require `name`\n\nMigration:\n- Update JSON parsing to read `name`\n- If you send `fullName`, map it to `name` before calling the API\n\n\nTinh gọn câu chữ bằng cách bỏ dự đoán. “Align API with updated domain naming” mơ hồ. Nếu bạn không biết lý do, nói những gì bạn biết: “Chuẩn hoá tên trên các endpoint.” Cũng tránh khẳng định test bạn chưa chạy. Thay “Updated API tests” bằng tên suite, hoặc bằng một ghi chú trung thực như “Manual check: created user via API and verified response payload.”\n\n## Sai lầm phổ biến và bẫy\n\nCách nhanh nhất để mất niềm tin vào commit do AI viết là để thông điệp hứa nhiều hơn diff thể hiện. Claude Code có thể biến thay đổi nội bộ thành văn bản rõ ràng, nhưng nó cũng có thể suy luận “cải thiện trải nghiệm người dùng” từ một refactor nếu bạn không giữ nó sát thực tế.\n\nMột sai lầm thường gặp là thổi phồng tác động. Đổi tên, helper mới, hoặc di chuyển logic giữa file có thể đọc như một tính năng khi thực ra là plumbing. Nếu release notes tuyên bố “cải thiện hiệu năng” mà không có đo lường, người dùng sẽ nhận ra.\n\nSai lầm khác là bỏ sót breaking changes và migration. Diff giấu chúng ở chỗ nhỏ: mặc định config đổi, env var đổi tên, cột DB thành NOT NULL, hoặc field response bị xoá. Nếu commit và changelog không nói rõ ai phải làm gì sau khi cập nhật, bản “sạch” của bạn biến thành ticket hỗ trợ.\n\nNgôn từ mơ hồ cũng rủi ro. “Cải tiến nhỏ” và “nhiều sửa lỗi” che giấu rủi ro thay vì truyền đạt nó.\n\nBẫy khi dán diff vào prompt:\n\n- Biến refactor nội bộ thành tuyên bố về người dùng\n- Bỏ qua ghi chú breaking-change và migration\n- Che giấu rủi ro bằng ngôn ngữ chung chung\n- Bịa lý do không có trong diff hoặc ngữ cảnh\n- Phớt lờ định dạng commit và changelog của dự án bạn\n\nMột sửa tốt là ép chế độ “bằng chứng”. Nếu diff đổi tên field API, release note phải nói client nào cần đổi tên và liệu client cũ có bị lỗi hay không.\n\nTrước khi chấp nhận đầu ra, yêu cầu một lần chạy lại để:\n\n- Tách tác động người dùng khỏi thay đổi nội bộ\n- Liệt kê breaking changes với hành động di chuyển cụ thể\n- Ghi rõ rủi ro (và mức không chắc chắn) bằng ngôn ngữ đơn giản\n- Khớp với quy tắc phong cách commit của bạn\n\n## Checklist nhanh trước khi merge hoặc ship\n\nTrước khi merge, đọc thông điệp commit như bạn không viết mã. Nếu nó không giải thích thay đổi bằng ngôn ngữ đơn giản, nó sẽ không giúp bạn khi cần hotfix. Nếu bạn dùng Claude Code, rà soát nhanh để xác nhận nó khớp với thay đổi thực tế.\n\n### Kiểm tra nhanh thông điệp commit\n\n- Cái gì thay đổi và ở đâu: nêu tính năng/khu vực, không chỉ “refactor”.\n- Tại sao thay đổi: lý do nên gói gọn trong một câu.\n- Tác động: ai hoặc cái gì bị ảnh hưởng.\n- Bằng chứng: đề cập test bạn đã chạy (hoặc ghi “not tested” và lý do).\n- Phạm vi: thông điệp có khớp với kích thước diff và thay đổi hành vi không?\n\nNếu thông điệp có chi tiết không nằm trong diff hoặc ticket, loại bỏ chúng. Một “tại sao” rõ ràng tốt hơn một câu chuyện dài.\n\n### Kiểm tra nhanh release notes\n\nRelease notes dành cho người chưa thấy PR.\n\n- Hướng tới người dùng: mô tả kết quả, không phải triển khai.\n- Rủi ro rõ ràng: có thể hỏng gì và cách nhận biết.\n- Có migration: thay đổi config, env var, backfill dữ liệu, hoặc bước một lần.\n- Ghi chú rollback: nếu revert, cần cleanup gì không.\n\n### Danh sách cấm\n\nTrước khi phát hành, xoá hoặc viết lại:\n\n- Bí mật hoặc dữ liệu riêng tư (token, key, thông tin khách hàng).\n- Dự đoán (“sẽ cải thiện hiệu năng”) không có đo lường.\n- Ngôn ngữ đổ lỗi (“ops broke”, “frontend messed up”).\n\nNếu bạn không thể giải thích thay đổi mà không đoán, dừng lại và bổ sung ngữ cảnh thiếu.\n\n## Bước tiếp theo: biến nó thành thói quen trong workflow\n\nTính nhất quán hơn hoàn hảo. Chọn một định dạng ngắn cả đội có thể dùng cho mỗi thay đổi, ngay cả khi bận. Khi mọi người viết cùng một cấu trúc, review nhanh hơn và release notes ngừng giống như công việc thám tử.\n\nMột định dạng nhẹ nhưng hiệu quả:\n\n- What changed (user impact): một câu bằng ngôn ngữ đơn giản\n- Why: lý do hoặc bug được sửa\n- Risk: có thể hỏng gì, và bạn giảm rủi ro như thế nào\n- Migration: các bước cần (nếu có)\n\nDùng Claude Code để soạn thảo, rồi làm một lượt kiểm tra con người để xác thực và thêm ngữ cảnh. Nó mạnh nhất khi bạn cho diff cộng 2–3 câu ý định: ai thay đổi này dành cho, bạn muốn cải thiện gì, và bạn cố tình không thay đổi điều gì.\n\nĐể mở rộng mà không cần thêm họp, nhúng nó vào nơi bạn đã dùng: một template commit hoặc PR ngắn với các trường đó, một checkbox cho migration và rủi ro, và comment review tập trung vào tác động còn thiếu thay vì phong cách viết.\n\nNếu bạn build trong Koder.ai (koder.ai), cùng cấu trúc đó phù hợp tự nhiên trong planning mode. Viết ý định trước (tác động, rủi ro, migration), rồi triển khai theo kế hoạch để “tại sao” không bị mất khi mã bắt đầu thay đổi.Viết một thông điệp bao gồm ba điều:\n\n- Cái gì thay đổi (một câu)\n- Tại sao (vấn đề hoặc mục tiêu)\n- Tác động (ai nhận ra và hành vi thay đổi ra sao)\n\nThêm Rủi ro, Di chuyển, và Tests chỉ khi chúng quan trọng hoặc khi bạn không chắc chắn.
Bởi vì diff cho thấy các sửa đổi, không phải mục đích. Thông thường nó không cho bạn biết:\n\n- triệu chứng của lỗi mà bạn đang sửa\n- ai bị ảnh hưởng (người dùng, admin, client API)\n- có thể backport an toàn không\n- điều gì có thể hỏng và cách quay lui\n- các bước di chuyển cần thiết\n\nMột thông điệp tốt biến diff thành quyết định mà người khác có thể tin tưởng sau này.
Cho nó diff và một khối ngữ cảnh nhỏ mà diff không thể hiện:\n\n- intent (bug/mục tiêu)\n- hành vi mong đợi trước và sau\n- ai bị ảnh hưởng\n- kế hoạch rollout (feature flags, phát hành theo giai đoạn)\n- di chuyển/cấu hình thay đổi\n- bạn đã kiểm thử những gì\n\nNếu bạn chỉ dán diff, thường sẽ nhận được một tóm tắt trau chuốt nhưng thiếu rủi ro thật sự hoặc thổi phồng tác động.
Yêu cầu một đầu ra có cấu trúc để bạn kiểm tra nhanh:\n\n- Summary\n- Motivation\n- Impact\n- Risk\n- Migration\n- Tests\n\nCũng cho phép các phần trung thực như "Tests: not shown" để tránh việc bản nháp tự tạo niềm tin giả.
Yêu cầu 2–3 biến thể, ví dụ:\n\n- Conservative (tối thiểu, chỉ dựa trên diff)\n- User-facing (nêu thay đổi người dùng thấy)\n- Engineering-focused (ghi refactor/perf/follow-ups)\n\nSau đó chọn biến thể phù hợp với phong cách repo của bạn và không khẳng định những điều bạn không thể chứng minh.
Chúng dành cho những người đọc khác nhau:\n\n- Commit messages giúp reviewer, người duy trì tương lai và kỹ sư on-call. Có thể chứa một chút chi tiết kỹ thuật, test đã chạy và ghi chú rủi ro.\n- Release notes giúp người dùng/admin quyết định có nâng cấp hay không và cần làm gì tiếp theo. Tập trung vào kết quả, thay đổi phá vỡ và các bước di chuyển.\n\nNếu một dòng không quan trọng với người dùng, có lẽ nó không thuộc release notes.
Ghi rõ và làm cho nó có thể hành động:\n\n- Cái gì hỏng (field API bị xoá/đổi tên, key config đổi, ràng buộc schema chặt hơn)\n- Ai bị ảnh hưởng (khách hàng/clients nào)\n- Phải thay đổi gì (đổi tên chính xác/bước thực hiện)\n- Khi nào có hiệu lực\n- Ghi chú rollback nếu việc revert có hậu quả\n\nTránh các diễn đạt mơ hồ như “thay đổi nhỏ” khi một bản nâng cấp có thể gây lỗi.
Chỉ bao gồm các bước mà ai đó thực sự phải làm, theo thứ tự:\n\n1. thay đổi gì (config, env vars, client API)\n2. khi nào làm (trước/sau deploy)\n3. cách xác minh đã thành công\n4. làm gì nếu sai (rollback/recover)\n\nNếu không cần di chuyển, ghi "Migration: None" để người đọc khỏi thắc mắc.
Đối xử với đầu ra như một kiểm tra tuyên bố:\n\n- Bỏ các lý do không có trong diff hoặc ticket.\n- Đừng hứa cải thiện perf/security nếu không có bằng chứng.\n- Đừng liệt kê test bạn chưa chạy — nói bạn đã chạy gì, hoặc ghi not tested.\n- Tách rõ tác động người dùng và việc dọn dẹp nội bộ.\n\nNếu điều gì đó nghe như phỏng đoán, viết lại thành sự không chắc chắn hoặc xoá nó.
Không dán bất cứ thứ gì bạn không muốn bị sao chép ra nơi khác. Xoá hoặc tóm tắt:\n\n- API keys, tokens, credentials\n- tên khách hàng và dữ liệu cá nhân\n- host nội bộ, chi tiết sự cố, log riêng tư\n\nNếu ngữ cảnh đầy đủ nhạy cảm, cung cấp một tóm tắt an toàn như “validation tightened; old clients may get 400 until updated.”