·

Tiếng Việt: Risk-based testing with AI

Risk-based testing with AI

Trong một sprint hai tuần, backlog có 40 story, regression suite có 1.200 test case, còn team QA thì chỉ có 2 người. Đây không phải tình huống hiếm — đó là thực tế hàng ngày của gần như mọi QA Engineer làm Agile. Risk-based testing (kiểm thử dựa trên rủi ro) là câu trả lời kinh điển cho bài toán này: thay vì test đều tay mọi thứ, ta tập trung effort vào những chỗ nếu hỏng sẽ gây thiệt hại lớn nhất. Vấn đề là risk-based testing truyền thống tốn rất nhiều thời gian phân tích thủ công — đọc requirement, hỏi dev, nhìn lịch sử bug, rồi mới ước lượng risk. AI không thay con người làm việc đó, nhưng nó có thể rút thời gian phân tích risk từ vài giờ xuống vài phút, nếu bạn biết cách đưa đúng context và đặt đúng câu hỏi. Bài này sẽ đi từ lý thuyết risk-based testing, qua cách dùng AI để xác định risk từ requirement và code diff, đến cách xây risk score matrix và duy trì risk model sống theo từng sprint.

Risk-Based Testing Là Gì Và Vì Sao Quan Trọng Trong Các Sprint Agile?

Risk-based testing là chiến lược phân bổ effort kiểm thử dựa trên mức độ rủi ro của từng phần chức năng, thay vì cố gắng test "đều" mọi tính năng với cùng độ sâu. Nói cách dễ hình dung: nếu bạn chỉ có 20% thời gian cần để test full 100% hệ thống, risk-based testing giúp bạn chọn đúng 20% đó sao cho vẫn bắt được phần lớn bug nghiêm trọng nhất.

Vì Sao Thời Gian QA Luôn Là Nguồn Lực Hữu Hạn

Trong mô hình waterfall cũ, QA có cả một phase riêng để test kỹ mọi thứ trước khi release. Agile không cho bạn luxury đó. Sprint 2 tuần, code freeze trước ngày demo 1-2 ngày, feature mới liên tục đè lên feature cũ chưa kịp regression đầy đủ — đó là áp lực thời gian có thật, không phải lý thuyết suông.

Hệ quả trực tiếp: nếu bạn cố test "công bằng" cho tất cả 40 story trong backlog, bạn sẽ test hời hợt tất cả, và không có gì được test sâu. Đây chính là bẫy phổ biến nhất của QA thiếu kinh nghiệm — cảm giác "đã test qua" đánh lừa cả team rằng chất lượng đã được đảm bảo, trong khi thực chất chỉ có coverage bề mặt.

Risk-based testing giải quyết vấn đề bằng cách chấp nhận một sự thật: không phải bug nào cũng đáng giá như nhau. Một bug ở màn hình "About Us" không giống một bug ở luồng thanh toán. Nếu buộc phải chọn, bạn luôn chọn test kỹ luồng thanh toán trước.

Ví dụ thực tế: một fintech app có tính năng mới là "Xuất báo cáo giao dịch PDF" và một fix nhỏ ở "Cập nhật số dư tài khoản sau giao dịch". Về số lượng test case có thể tương đương, nhưng risk hoàn toàn khác nhau: bug ở xuất PDF làm mất một report, còn bug ở cập nhật số dư có thể khiến khách hàng nhìn thấy sai số tiền — risk tài chính, risk pháp lý, risk uy tín thương hiệu. Risk-based testing buộc bạn nhìn ra sự khác biệt này ngay từ đầu sprint, không phải sau khi đã tiêu hết thời gian.

Hai Trục Của Rủi Ro: Likelihood Và Impact

Risk trong kiểm thử luôn được đo bằng hai trục kinh điển:

  • Likelihood (khả năng xảy ra): tính năng này có dễ bị lỗi không? Nó có logic phức tạp, nhiều điều kiện rẽ nhánh, tích hợp nhiều hệ thống bên thứ ba, hay được sửa đổi bởi một dev mới join team? Code càng phức tạp, càng thay đổi nhiều, càng ít test coverage sẵn có — likelihood lỗi càng cao.
  • Impact (mức độ ảnh hưởng): nếu lỗi xảy ra, thiệt hại là gì? Impact có thể là tài chính (mất tiền, sai số dư), pháp lý/compliance (vi phạm quy định GDPR, PCI-DSS), uy tín (khách hàng mất niềm tin), hoặc vận hành (support team ngập ticket).

Risk = Likelihood × Impact. Một tính năng có likelihood thấp nhưng impact cực cao (ví dụ: xử lý refund tiền cho khách VIP, hiếm khi chạy nhưng nếu sai thì thiệt hại lớn) vẫn phải được xếp risk cao. Ngược lại, một tính năng dễ lỗi nhưng impact thấp (ví dụ: link "Liên hệ chúng tôi" hay bị 404) có thể chấp nhận risk thấp hơn kỳ vọng.

Nhiều QA junior chỉ nhìn một trục — họ nghĩ "feature này phức tạp nên phải test kỹ", mà quên hỏi "nếu nó sai thì ai bị ảnh hưởng, và ảnh hưởng đến đâu". Việc luôn đặt câu hỏi trên cả hai trục là kỹ năng cốt lõi phân biệt QA senior với QA mới vào nghề.

AI Thay Đổi Quy Trình Này Như Thế Nào

Trước đây, việc đánh giá likelihood và impact chủ yếu dựa vào kinh nghiệm cá nhân và trí nhớ — QA senior "cảm" được module nào hay lỗi vì đã từng bị bug ở đó nhiều lần. Vấn đề là kiến thức này nằm trong đầu một vài người, không scale, và không tường minh cho team mới.

AI, đặc biệt là LLM (Large Language Model) có khả năng đọc hiểu ngôn ngữ tự nhiên và code cùng lúc, thay đổi cuộc chơi ở ba điểm:

  1. Tốc độ phân tích: AI đọc một requirement doc 5 trang hoặc một code diff 500 dòng trong vài giây, trích ra được các điểm rủi ro mà con người phải mất 20-30 phút đọc kỹ mới nhận ra.
  2. Tính nhất quán: con người dễ bị thiên vị bởi tâm trạng, độ mệt, hoặc quen thuộc với module — AI áp dụng tiêu chí đánh giá risk một cách nhất quán hơn (nếu bạn cho nó prompt rõ ràng).
  3. Khả năng kết hợp nhiều nguồn context: AI có thể đọc cùng lúc requirement, code diff, lịch sử bug, và đưa ra risk score tổng hợp — việc mà con người thường chỉ làm được một phần vì thiếu thời gian tổng hợp thủ công.

Điều quan trọng cần nhấn mạnh: AI không "biết" risk thực sự của hệ thống bạn — nó chỉ suy luận dựa trên pattern ngôn ngữ và code nó nhìn thấy. Vai trò của QA vẫn là người xác nhận cuối cùng, đưa domain knowledge (kiến thức nghiệp vụ) vào, và chịu trách nhiệm với quyết định ưu tiên test.

Mẹo: Đừng để AI tự quyết risk. Luôn dùng AI để tạo ra "risk assessment nháp" (draft) trong 5 phút đầu buổi grooming, sau đó dành 10-15 phút để team (QA + dev + PO) review và chỉnh lại. AI làm phần tốn thời gian (đọc, trích xuất, liệt kê), con người làm phần cần domain knowledge (xác nhận đúng/sai, bổ sung ngữ cảnh nghiệp vụ mà AI không biết).

Làm Sao Dùng AI Để Xác Định Các Khu Vực Rủi Ro Cao Từ Requirements Và Code Changes?

Có hai nguồn dữ liệu chính bạn nên đưa vào AI để xác định risk: requirement (tài liệu yêu cầu, user story, acceptance criteria) và code diff (thay đổi code thực tế trong PR/merge request). Mỗi nguồn cho AI một góc nhìn khác nhau, và kết hợp cả hai cho ra kết quả chính xác hơn nhiều so với chỉ dùng một nguồn.

Xác Định Rủi Ro Từ Requirements

Requirement — dù là user story trên Jira, PRD (Product Requirement Document), hay đơn giản là mô tả trong ticket — chứa nhiều tín hiệu risk mà AI có thể trích xuất: số lượng actor liên quan, các điều kiện biên (edge case) được nhắc tới, các integration với hệ thống khác, các từ khóa nhạy cảm như "thanh toán", "dữ liệu cá nhân", "số dư", "quyền truy cập".

Khi đưa requirement vào AI, đừng chỉ paste nguyên văn và hỏi "risk là gì" — hãy cấu trúc prompt để AI phải suy luận theo đúng hai trục likelihood/impact đã nói ở trên, và bắt nó liệt kê rõ ràng, có thể trace ngược lại từng dòng requirement.

Ví dụ prompt để đưa vào ChatGPT/Claude/Copilot Chat:

Bạn là một QA Lead có 10 năm kinh nghiệm risk-based testing.
Dưới đây là user story và acceptance criteria cho sprint hiện tại.

[PASTE USER STORY + ACCEPTANCE CRITERIA VÀO ĐÂY]

Hãy phân tích risk theo các bước:
1. Liệt kê tối đa 8 "risk area" cụ thể (không phải chung chung),
   mỗi risk area gắn với 1 dòng cụ thể trong acceptance criteria.
2. Với mỗi risk area, đánh giá:
   - Likelihood (Cao/Trung/Thấp) kèm lý do (độ phức tạp logic,
     số lượng điều kiện rẽ nhánh, có phụ thuộc hệ thống bên thứ ba không).
   - Impact (Cao/Trung/Thấp) kèm lý do (ảnh hưởng tài chính, pháp lý/
     compliance, số lượng user bị ảnh hưởng, khả năng phát hiện bởi
     end-user hay chỉ nội bộ).
3. Chỉ ra những khoảng trống (gap) trong acceptance criteria — những
   trường hợp KHÔNG được đề cập nhưng có khả năng xảy ra trong thực tế
   (ví dụ: race condition, retry, timeout, dữ liệu rỗng/null,
   permission edge case).
4. Xuất kết quả dưới dạng bảng Markdown: Risk Area | Likelihood | Impact
   | Risk Score (1-9) | Lý do | Đề xuất loại test (functional/security/
   performance/edge case).

Trả lời bằng tiếng Việt, giữ nguyên thuật ngữ kỹ thuật tiếng Anh.

Với requirement mơ hồ hoặc thiếu chi tiết — điều rất phổ biến trong Agile khi story được viết vội — AI đặc biệt hữu ích ở bước 3: chỉ ra gap. Đây chính là lúc AI đóng vai trò "critical reviewer" giúp bạn hỏi PO/BA những câu hỏi đúng trước khi bắt tay viết test case, thay vì phát hiện ra thiếu sót giữa lúc test.

Xác Định Rủi Ro Từ Code Diff

Requirement cho bạn biết "nên làm gì", nhưng code diff cho bạn biết "thực tế đã thay đổi gì" — và đây thường là nguồn risk chính xác hơn, vì đôi khi dev thay đổi nhiều hơn (hoặc ít hơn) so với những gì requirement mô tả.

Khi phân tích code diff (lấy từ GitHub/GitLab PR, hoặc export bằng git diff), AI có thể nhận diện các tín hiệu risk kỹ thuật mà requirement không bao giờ nói tới: hàm bị sửa có độ cyclomatic complexity cao, thay đổi động đến shared function được gọi ở nhiều nơi, sửa logic tính toán số học/tiền tệ, thay đổi schema database, hoặc thêm dependency mới.

Ví dụ prompt để phân tích risk từ code diff (dùng với GitHub Copilot Chat, Claude Code, hoặc paste diff vào ChatGPT):

Bạn là Senior QA Engineer chuyên risk-based testing cho hệ thống backend.
Dưới đây là code diff của một Pull Request.

[PASTE GIT DIFF VÀO ĐÂY]

Hãy phân tích theo các tiêu chí:
1. Liệt kê các file/hàm bị thay đổi có khả năng ảnh hưởng rộng
   (được gọi từ nhiều module khác, là shared utility, hoặc là core
   business logic như tính tiền, xác thực, phân quyền).
2. Với mỗi thay đổi, chỉ rõ:
   - Đây là thay đổi mới hoàn toàn, sửa logic hiện có, hay refactor
     (không đổi behavior)?
   - Có test tự động (unit test) đi kèm trong diff không? Nếu không,
     đây là điểm risk cần lưu ý.
   - Có thay đổi nào liên quan đến concurrency, transaction, hoặc
     external API call không (rủi ro race condition, timeout)?
3. Đưa ra risk score 1-9 cho toàn bộ PR, giải thích ngắn gọn.
4. Đề xuất 3-5 test case ưu tiên cao nhất cần chạy trước khi merge,
   sắp xếp theo mức độ ưu tiên giảm dần.

Trả lời bằng tiếng Việt, giữ thuật ngữ kỹ thuật tiếng Anh (diff, PR,
race condition, v.v.).

Một lưu ý quan trọng: nếu PR không có unit test đi kèm cho một thay đổi logic nghiệp vụ, đó tự động là tín hiệu risk cao — dù code "trông có vẻ đơn giản". AI rất tốt trong việc phát hiện pattern này một cách nhất quán, vì con người đôi khi bỏ qua khi đang vội review PR để kịp merge trước end of sprint.

Kết Hợp Cả Hai Nguồn Context

Sức mạnh thực sự nằm ở việc đưa cả requirement và code diff vào cùng một lần phân tích, để AI đối chiếu hai nguồn này với nhau. Có ba loại mismatch (sai khác) quan trọng mà chỉ lộ ra khi so sánh song song:

  1. Code làm nhiều hơn requirement mô tả — dev âm thầm sửa thêm logic không nằm trong scope, thường xảy ra khi refactor "tiện tay". Đây là risk vì không ai review kỹ phần ngoài scope.
  2. Code làm ít hơn requirement mô tả — một acceptance criteria chưa được implement, dễ bị bỏ sót nếu QA chỉ đọc code mà không đối chiếu ngược lại yêu cầu.
  3. Requirement và code đồng nhất, nhưng cả hai đều thiếu một edge case quan trọng — trường hợp nguy hiểm nhất vì không ai, kể cả AI ở lượt phân tích riêng lẻ, phát hiện ra nếu không đặt chúng cạnh nhau.

Prompt kết hợp có thể như sau:

Bạn có 2 input: (1) acceptance criteria của story, (2) code diff
implement story đó. Hãy đối chiếu và trả lời:
1. Những phần code diff làm KHÁC hoặc NHIỀU HƠN so với acceptance
   criteria mô tả (liệt kê cụ thể).
2. Những acceptance criteria chưa thấy được implement trong code diff.
3. Risk area mới xuất hiện chỉ khi nhìn cả hai nguồn cùng lúc (ví dụ:
   requirement nói "phải validate input" nhưng code không có validate
   ở field cụ thể nào).
4. Risk score tổng hợp cuối cùng (1-9) và top 5 test case ưu tiên.

[PASTE ACCEPTANCE CRITERIA]
[PASTE CODE DIFF]

Mẹo: Khi PR quá lớn (code diff vượt context window AI xử lý tốt, ví dụ trên 800-1000 dòng), đừng cố nhồi cả diff vào một lần. Hãy chia theo file hoặc theo module, chạy phân tích risk riêng cho từng phần, rồi tổng hợp lại bằng một prompt "tóm tắt risk toàn PR từ các phân tích con". Nhồi quá nhiều context vào một lần thường khiến AI bỏ sót chi tiết ở giữa hoặc cuối, một hiện tượng thường gặp khi context quá dài.

Làm Sao Ưu Tiên Test Effort Bằng Risk Score Do AI Tạo Ra?

Có risk score chỉ là bước đầu. Bước quan trọng hơn là chuyển risk score thành quyết định thực tế: test gì trước, test sâu tới đâu, và bỏ qua cái gì (một cách có chủ đích, không phải do quên).

Risk Score Matrix

Risk score matrix là bảng 2 chiều Likelihood × Impact, mỗi chiều chia làm 3 mức (Cao/Trung/Thấp), tạo ra 9 ô, mỗi ô ứng với một mức risk tổng hợp và một chiến lược test tương ứng.

Likelihood \ Impact Thấp Trung Cao
Cao Risk Trung (score 3) Risk Cao (score 6) Risk Rất Cao (score 9)
Trung Risk Thấp (score 2) Risk Trung (score 4-5) Risk Cao (score 7-8)
Thấp Risk Rất Thấp (score 1) Risk Thấp (score 2-3) Risk Trung-Cao (score 5-6)

Ứng với từng mức risk, bạn nên có sẵn một chính sách test rõ ràng, thống nhất trong team, ví dụ:

  • Risk 7-9 (Rất Cao/Cao): test đầy đủ functional + edge case + negative case, cần thêm regression test tự động, review bởi 2 người, ưu tiên test manual exploratory trước khi release.
  • Risk 4-6 (Trung): test functional chính + 1-2 edge case quan trọng nhất, tự động hóa nếu có thời gian.
  • Risk 1-3 (Thấp): smoke test nhanh, có thể defer (trì hoãn) automation, chấp nhận rủi ro tồn đọng ở mức thấp.

Khi dùng AI để gán risk score, hãy luôn yêu cầu nó neo (anchor) theo đúng matrix này, không để nó tự bịa thang điểm khác mỗi lần chạy — sự nhất quán giữa các lần phân tích quan trọng hơn độ "chính xác tuyệt đối" của con số.

Dùng Dữ Liệu Defect Lịch Sử Làm Context

Risk score sẽ chính xác hơn rất nhiều nếu AI biết module nào trong hệ thống của bạn từng có lịch sử lỗi cao. Đây là dữ liệu mà chỉ nội bộ team bạn có — AI không tự "biết" module Payment của công ty bạn hay bị bug, bạn phải cung cấp dữ liệu đó làm context.

Cách làm thực tế: export danh sách bug từ Jira/Bugzilla (module, severity, số lần xảy ra trong 3-6 sprint gần nhất), rồi đưa vào cùng prompt phân tích risk.

Dưới đây là dữ liệu lịch sử defect của hệ thống trong 6 sprint gần nhất
(module, số bug, severity trung bình):

[PASTE BẢNG DEFECT HISTORY, ví dụ:
Module Payment: 14 bugs, severity trung bình Cao
Module User Profile: 3 bugs, severity trung bình Thấp
Module Notification: 9 bugs, severity trung bình Trung]

Story hiện tại thuộc module Payment, thay đổi liên quan đến tính phí
giao dịch quốc tế.

Hãy điều chỉnh risk score đã tính ở bước trước, có tính đến lịch sử
defect của module này. Giải thích rõ mức độ điều chỉnh và lý do
(module có lịch sử bug cao nên tăng likelihood, hay module ổn định
nên có thể giữ nguyên/giảm).

Việc này giúp risk score không chỉ dựa trên "trông có vẻ phức tạp" mà còn dựa trên bằng chứng thực tế — module Payment có lịch sử 14 bug trong 6 sprint rõ ràng đáng risk cao hơn một module chỉ có 3 bug, dù độ phức tạp code nhìn tương đương.

Chuyển Risk Score Thành Phân Bổ Thời Gian Test

Risk score chỉ có giá trị khi nó chuyển thành quyết định phân bổ thời gian cụ thể. Một cách làm thực dụng: tính tổng risk score của tất cả story trong sprint, rồi phân bổ % thời gian QA theo tỷ trọng risk score, không phải theo số lượng story bằng nhau.

Ví dụ: sprint có 10 story với tổng risk score 50. Story A có risk score 9 (18% tổng risk) thì nên nhận khoảng 18% thời gian QA của sprint, chứ không phải 1/10 = 10% như cách chia đều theo đầu story.

Bảng minh họa cách phân bổ:

Story Risk Score % Tổng Risk Thời gian QA đề xuất (trên 40h/sprint)
Story A (Payment fee) 9 18% 7.2h
Story B (Export PDF) 3 6% 2.4h
Story C (Update profile) 2 4% 1.6h
... ... ... ...

AI có thể giúp tính toán bảng này tự động nếu bạn cho nó risk score của toàn bộ backlog sprint và tổng giờ QA khả dụng, kèm ràng buộc tối thiểu (ví dụ mỗi story dù risk thấp vẫn cần ít nhất 1h smoke test).

Mẹo: Đừng để risk score = 0 nghĩa là "không test gì cả". Luôn đặt sàn tối thiểu (ví dụ 30-60 phút smoke test) cho mọi story được release, bất kể risk score thấp thế nào — vì risk assessment cũng có thể sai, và một smoke test rẻ vẫn là bảo hiểm tốt hơn không có gì.

Làm Sao Điều Chỉnh Risk Model Khi Scope Của Sprint Thay Đổi?

Risk model không phải văn bản viết một lần đầu sprint rồi để đó. Scope Agile luôn biến động — story bị thêm giữa sprint, requirement bị đổi sau khi đã bắt đầu code, hotfix khẩn cấp chen ngang. Risk model cần sống cùng với những thay đổi đó.

Các Trigger Khiến Risk Model Cần Được Cập Nhật

Một số tín hiệu (trigger) rõ ràng cho thấy bạn cần chạy lại risk assessment, không thể đợi đến sprint retro mới nhìn lại:

  • Scope creep: story mới được thêm vào sprint sau ngày planning, đặc biệt nếu liên quan module đã có risk cao.
  • Requirement thay đổi giữa sprint: acceptance criteria bị sửa sau khi dev đã bắt đầu code — risk phân tích ban đầu có thể không còn đúng.
  • Dependency thay đổi: một API bên thứ ba đổi version, một service khác trong hệ thống bị refactor song song, ảnh hưởng gián tiếp đến story đang test.
  • Kết quả test sớm phát hiện bất ngờ: nếu smoke test đầu sprint phát hiện bug ở khu vực được đánh giá risk thấp, đó là dấu hiệu risk model ban đầu đánh giá sai, cần recalibrate ngay, không chỉ sửa cho story đó mà rà lại các story tương tự.
  • Thay đổi người thực hiện: dev ban đầu dự kiến làm story bị đổi sang dev khác ít kinh nghiệm hơn với module đó — likelihood risk tăng lên do yếu tố con người.

Dùng AI Để Cập Nhật Risk Theo Kiểu Incremental

Thay vì chạy lại toàn bộ risk assessment từ đầu mỗi khi có thay đổi (tốn thời gian và dễ gây "risk fatigue" — mệt mỏi vì phải làm lại liên tục), cách hiệu quả hơn là dùng AI để cập nhật incremental (từng phần, dựa trên delta thay đổi), giữ nguyên phần risk assessment cũ chưa bị ảnh hưởng.

Đây là risk assessment gốc của sprint (đã làm ở đầu sprint):

[PASTE RISK ASSESSMENT GỐC, bảng risk score theo story]

Sprint vừa có thay đổi sau đây:
[MÔ TẢ THAY ĐỔI, ví dụ: "Story X được thêm mới, liên quan đến việc
tích hợp cổng thanh toán mới ZaloPay, chưa từng dùng trong hệ thống
trước đây" HOẶC "Acceptance criteria của Story Y được sửa: thêm yêu
cầu hỗ trợ hoàn tiền tự động"]

Hãy:
1. Xác định risk assessment nào trong bảng gốc bị ảnh hưởng bởi thay
   đổi này (chỉ ra story cụ thể, không cần đánh giá lại toàn bộ bảng).
2. Đề xuất risk score mới cho các story bị ảnh hưởng, kèm lý do thay
   đổi so với đánh giá gốc.
3. Nếu thay đổi tạo ra story/risk area hoàn toàn mới, thêm dòng mới
   vào bảng risk, đánh giá độc lập.
4. Chỉ ra nếu tổng risk của sprint tăng đáng kể, cần cảnh báo về khả
   năng sprint bị overload effort so với capacity QA hiện có.

Cách làm này giữ được "bộ nhớ" risk assessment cũ, tránh việc mỗi lần thay đổi lại phải đọc lại từ đầu toàn bộ backlog — vừa nhanh hơn, vừa tránh việc AI đưa ra risk score không nhất quán giữa các lần chạy độc lập.

Quản Lý Residual Risk Transparently

Residual risk là phần risk còn lại sau khi bạn đã quyết định không test (hoặc test ít hơn mức lý tưởng) do hạn chế thời gian. Đây là khái niệm cực kỳ quan trọng nhưng thường bị QA giấu đi vì sợ bị đánh giá là "chưa test kỹ" — trong khi thực ra, việc communicate residual risk minh bạch chính là dấu hiệu của một QA chuyên nghiệp và có trách nhiệm.

Thay vì chỉ nói "em đã test xong sprint này", một QA senior sẽ nói rõ: "Em đã test đầy đủ risk cao và trung. Còn 3 edge case ở risk thấp của module Notification chưa kịp test do giới hạn thời gian, residual risk chấp nhận được vì impact thấp và tần suất xảy ra hiếm." Câu nói này cho PO/team lead đủ thông tin để ra quyết định release có ý thức, không phải release "mù".

AI có thể giúp bạn soạn báo cáo residual risk cuối sprint một cách nhất quán:

Dưới đây là risk assessment đầu sprint và danh sách test case đã thực
hiện thực tế (đã pass/fail/chưa thực hiện):

[PASTE RISK ASSESSMENT + TEST EXECUTION STATUS]

Hãy tạo báo cáo Residual Risk cuối sprint gồm:
1. Danh sách risk area KHÔNG được test đầy đủ (test case chưa thực
   hiện hoặc bị skip), sắp xếp theo risk score giảm dần.
2. Với mỗi risk area, ước lượng residual risk còn lại (Cao/Trung/Thấp)
   và lý do ngắn gọn tại sao chấp nhận được (hoặc không chấp nhận
   được, cần escalate trước khi release).
3. Một đoạn tóm tắt 3-4 câu dành cho Product Owner, viết bằng ngôn ngữ
   không kỹ thuật, giải thích rõ risk còn tồn đọng và khuyến nghị
   (release như kế hoạch / release có giám sát thêm / trì hoãn release
   phần liên quan).

Xây Dựng Một Living Risk Register

Living risk register (sổ đăng ký rủi ro sống) là tài liệu risk được duy trì liên tục qua nhiều sprint, không phải làm lại từ đầu mỗi lần. Nó nên nằm ở một nơi cả team truy cập được (Confluence, Notion, hoặc một sheet dùng chung), cập nhật theo từng sprint, với cấu trúc tối thiểu gồm:

  • Module/Feature: tên module hoặc tính năng.
  • Risk Score hiện tại: cập nhật mỗi sprint có liên quan.
  • Xu hướng (Trend): risk đang tăng, giảm, hay ổn định qua các sprint gần nhất.
  • Lịch sử defect liên quan: link tới bug đã xảy ra ở module này.
  • Residual risk đang tồn đọng: risk chưa được test đầy đủ, chưa xử lý.
  • Ngày cập nhật gần nhất và người cập nhật.

Giá trị lớn nhất của living risk register không phải ở một sprint riêng lẻ, mà ở việc nhìn xu hướng theo thời gian: nếu module Payment liên tục xuất hiện ở top risk score trong 5 sprint liên tiếp, đó là tín hiệu mạnh cho thấy cần đầu tư refactor hoặc tăng automation coverage cho module đó, thay vì cứ lặp lại chu kỳ "risk cao → test thủ công gấp → release → risk cao lại ở sprint sau".

Bạn có thể dùng AI định kỳ (cuối mỗi sprint hoặc mỗi tháng) để phân tích xu hướng từ living risk register và đề xuất hành động dài hạn:

Dưới đây là lịch sử risk score của các module qua 6 sprint gần nhất:

[PASTE DỮ LIỆU LIVING RISK REGISTER, dạng bảng module x sprint]

Hãy phân tích:
1. Module nào có risk score tăng liên tục hoặc duy trì ở mức cao qua
   nhiều sprint (đây là ứng viên cần đầu tư dài hạn: refactor, tăng
   automation, hoặc review lại thiết kế).
2. Module nào có risk giảm rõ rệt (dấu hiệu các biện pháp đã áp dụng
   đang có hiệu quả, có thể học hỏi để áp dụng cho module khác).
3. Đề xuất 2-3 hành động cụ thể cho quý tới, ưu tiên theo mức độ ảnh
   hưởng đến chất lượng tổng thể của hệ thống.

Mẹo: Đặt lịch review living risk register vào đúng buổi retro cuối sprint, đừng tách riêng ra một buổi khác — risk register chỉ sống được nếu gắn liền với nhịp làm việc thật của team, nếu tách riêng nó sẽ nhanh chóng bị bỏ quên như mọi tài liệu "để sau" khác.