Skip to content

hotfix: sửa lỗi trên production ​

/znf:hotfix là workflow sửa lỗi đang ảnh hưởng production. Nó branch từ base hotfix mà repo khai trong worktree.json (ví dụ origin/main), dùng lại bước chẩn đoán của /znf:fix, và tự quyết hoặc hỏi bạn chọn giữa revert, disable hoặc fix forward.

Khi nào dùng ​

Dùng /znf:hotfix khi lỗi đang ảnh hưởng production.

Không dùng /znf:hotfix khi lỗi chỉ xảy ra trên staging hoặc dev. Dùng /znf:fix.

Cách gọi ​

text
/znf:hotfix <mô tả ngắn>

Agent tự gọi /znf:hotfix khi /znf:fix thấy bằng chứng production; bạn cũng gõ trực tiếp được. Merge vẫn là của bạn.

Viết yêu cầu ​

TrườngVí dụ
RepoRepo đang chạy bản lỗi
Base hotfixRef mà production đang chạy, do zenify hotfix baseref in ra
Ảnh hưởngAi hoặc luồng nào đang bị chặn
Bằng chứngLog, trace hoặc metric thật, ticket

Các bước ​

Các bước của một lần chạy hotfix

BướcKit làm gìBạn làm gì
1Chốt repo bị ảnh hưởngXác nhận đúng repo
2fetch --tags rồi resolve base ref hotfix bằng zenify hotfix baseref, và đối chiếu tag release: base chứa tag mới nhất và khác baseRef của repo thì tự xác nhậnChỉ trả lời khi base không chứa tag nào, không chứa tag mới nhất, hoặc trùng baseRef (repo không khai base hotfix riêng, nên tag không phân biệt được nhánh tích hợp với production)
3Nếu được /znf:fix chuyển sang thì dùng luôn bằng chứng và nguyên nhân đã xác nhận, không chẩn đoán lại; dòng **Việc Plane:** trong gói bàn giao được chép nguyên văn làm dòng đầu của ## Intent, nên mọi mã ZEN lên tiêu đề PR. Nếu không, chẩn đoán bằng bước 0-2 của /znf:fix. Ở bước này agent tự chạy các cách tái hiện chỉ đọc trên production và lọc output thành <REDACTED>; cách nào có side effect thì đi qua zenify data run (dry-run trước, chờ "ok" của bạn trước --prd --write); nếu không có thì xác nhận nguyên nhân từ log, không dừng và không thêm log tạm trên production. Nguồn bằng chứng (log, trace, metric, db-read/redis-read, PostHog) và thứ tự tra cứu lấy từ tài liệu tham chiếu chung _shared/evidence-sources, xem Quan sát và an toànĐọc nguyên nhân đã xác nhận
4Dùng git blame trên đúng dòng lỗi (lấy từ bản của base hotfix) để tìm commit cuối cùng chạm vào dòng đó. Commit đó có trước tag release liền trước thì tự fix forward và ghi lý do. Còn lại (không có tag liền trước, không chỉ ra được đúng một dòng lỗi, lỗi có thể do lần deploy gần nhất) thì trình bày ba lựa chọn kèm khuyến nghịChỉ chọn revert, disable hoặc fix forward khi được hỏi. Revert và disable dừng tại đây, không tạo worktree
5Tạo worktree --type hotfix --base <base hotfix> (chỉ khi fix forward)Không cần làm gì
6Chạy /znf:scout trên ref đã resolve, không phải base thường ngàyĐọc báo cáo scout
7Dựng lệnh đỏ và viết regression test trước (theo bước 5 của /znf:fix), xác nhận chúng fail, rồi sửa nhỏ nhấtKhông cần làm gì
8Chạy lại lệnh đỏ, kỳ vọng xanh, xoá log [DEBUG-xxxx] (theo bước 6 của /znf:fix), verify trên code path thậtĐọc kết quả
9Chạy /znf:gate rồi /znf:ship, kể cả khi đang gấp. Trước khi ship, đếm file đã đổi so với base hotfix, tính cả file chưa commit và file mới; quá 3 file hoặc đụng tài nguyên dùng chung thì hỏi bạn, khuyên revert. Đếm lại sau mỗi vòng sửa của /znf:ship, trước khi commit. /znf:ship mở PR vào base hotfix; skill không mergeĐọc board ship, nhận PR URL. Trả lời khi bị hỏi về diff lớn
10Nhắc bước tay còn lạiMerge PR (tức là deploy), rồi đồng bộ base hotfix sang baseRef của repo (với zenify là main → staging; bỏ qua khi hai ref trùng nhau)
Sau deployKhi production đã chạy bản sửa (một tag release chứa commit merge, hoặc kiểm build trong bundle, endpoint phiên bản, deploy log), kiểm tra kết quả trên đúng vùng fix chạm tới: chỉ chạy các kiểm tra hợp với vùng đó (backend: tỉ lệ lỗi, p95 và số dòng lỗi của route; web: exception PostHog của màn hình; queue: backlog hoặc lag), so cửa sổ trước và sau deploy có độ dài bằng nhau, kèm số request để phân biệt "0 lỗi" với "0 request". Số liệu ghi vào báo cáo hotfix; kiểm tra không chạy được thì ghi là chưa chạy, không ghi là sạchĐọc số liệu. Triệu chứng chưa giảm hoặc chỉ số lân cận tăng thì chọn lại cách xử lý như bước 4

Kết quả ​

MụcNội dung
Base ref xác nhậnRef do zenify hotfix baseref in ra từ worktree.json của repo, ví dụ origin/main. Repo chưa khai hotfixBaseRef thì lệnh dùng baseRef và in cảnh báo; config sai (release-latest, custom thiếu ref) thì lệnh báo lỗi. Cả hai trường hợp đều sửa worktree.json, không đoán tên nhánh
Nguyên nhân xác nhậnKèm bằng chứng thật
Cách xử lý đã chọnRevert, disable hoặc fix forward, kèm lý do
Branch (nếu fix forward)<user>/hotfix/<slug>
PRMở vào base ref hotfix, chưa merge

Quyết định thuộc về bạn ​

  • Base ref khi tag release không đủ để kit tự xác nhận.
  • Chọn revert, disable hoặc fix forward khi kit hỏi.
  • Có tiếp tục khi diff quá 3 file hoặc đụng tài nguyên dùng chung không.
  • Merge PR, rồi đồng bộ base hotfix sang baseRef của repo (với zenify là main → staging; bỏ qua khi hai ref trùng nhau).

Ví dụ ​

Ví dụ minh hoạ, repo khai "hotfix": {"baseStrategy": "custom"} và "hotfixBaseRef": "origin/main".

Bản production cắt từ main gặp lỗi, xác nhận qua log thật. zenify hotfix baseref in origin/main, base chứa tag release mới nhất nên kit tự xác nhận, và tự chọn fix forward vì lỗi có trước tag liền trước. Kit tạo worktree --type hotfix --base origin/main, scout đúng ref đó, dựng lệnh đỏ và viết regression test, sửa, chạy lại lệnh đỏ để verify, gate rồi ship. /znf:ship mở PR vào main. Bạn merge rồi đồng bộ main → staging.

Lỗi thường gặp ​

TránhNên làm
Resolve base hotfix rồi mới fetchLuôn fetch trước rồi resolve. Nếu không, ref có thể cũ hơn bản đang chạy
Fix forward dưới áp lực khi còn phân vânChọn revert khi fix forward cần quyết định thiết kế. Lúc gấp không phải lúc thiết kế
Quên đồng bộ base hotfix sang baseRefBước 10 luôn nhắc. Release sau vẫn cần fix này

Xem thêm ​

/reference/skills/hotfix, Base ref, hotfix base, port block, Chọn workflow