Kết luận nguyên nhân gốc của AI cần bằng chứng chạy được
Mười bản sửa do AI viết trong bài thử đều sai, và bản nào cũng kèm một test fail trước khi sửa, pass sau khi sửa. Test có chứng minh được một điều, chỉ không phải là bug khách gặp đã được sửa.
Andrew Babo5 phút đọc
Trong bài này

Chỉ tin kết luận nguyên nhân gốc của AI khi có một test dùng đúng input mà production đã gửi, fail trên code cũ vì cùng lý do, pass trên bản sửa và trả về kết quả bạn mong đợi. Thêm một input đang chạy đúng hôm nay. Một test chỉ đơn giản là fail rồi pass thì chưa đủ.
Mình rút ra điều này từ mười bản sửa sai ngày 26/10/2026. Ba model AI viết 72 bản sửa cho hai bug cài sẵn, bản nào cũng có test riêng. Cả mười bản sửa sai đều đi kèm một test fail trước khi sửa và pass sau khi sửa. Test là thật; chỉ là nó kiểm sai thứ.
Một bản sửa sai, với một test pass#
Bug: một giỏ hàng tính bằng đồng Việt Nam làm trang thanh toán crash, vì không có hàm định dạng cho loại tiền VND. Model còn nhận thêm một bản phân tích AI khẳng định client gửi 'vnd' viết thường. Thực tế không phải vậy: breadcrumb trong cùng prompt ghi currency VND.

Bản sửa chuyển mã tiền sang chữ hoa trước khi tra bảng. Test kiểm 'usd' và 'eur': trên code cũ chúng fail với đúng TypeError mà khách gặp, trên bản sửa thì pass. Nhưng 'VND' vốn đã là chữ hoa, nên giỏ hàng của khách vẫn crash. Độ tự tin: 99.
Mười test đó đã kiểm gì#

Cả mười test đều rơi vào một trong hai trường hợp:
- Một input khác. Tám test dựng đúng trường hợp mà model tin là nguyên nhân: một SKU không có trong catalog thay vì món thẻ quà tặng có
dimensionslà null, hoặc'vnd'viết thường. Cùng loại lỗi, khác dữ liệu. - Mong đợi sai kết quả. Hai test dùng
'VND'và kỳ vọng'10.56'với'100000.00': không crash nữa, nhưng giá tiền đồng lại có số lẻ và không có ký hiệu tiền.
Test cũng có thể sai theo chiều ngược lại. 7 trong 72 test do model viết fail ngay trên bản sửa đúng của chính model đó. Một test cũng là một lời khẳng định.
Chuyện này không mới với AI. UTBoost tìm thấy 345 patch trong SWE-bench gốc bị “incorrectly labeled as passed”, vì patch sinh ra có thể “pass the tests without resolving the underlying issue” (UTBoost), tức qua được test mà không giải quyết vấn đề thật. Một nghiên cứu năm 2025 về patch do máy sinh ra nói thẳng: một patch “may pass the tests but nevertheless fail to match the developers' expectations” (arXiv 2503.15223).
Bằng chứng cần đòi#
- Input gây lỗi lấy từ production: giỏ hàng, request hay payload của job trong event, đã lọc dữ liệu cá nhân. Không phải input model tự nghĩ ra.
- Kết quả mong đợi, do một người hiểu sản phẩm viết. Model đã đoán
'10.56'cho một giá tiền đồng. - Cùng một lỗi trên code cũ: cùng loại lỗi và cùng input, không chỉ cùng message.
- Pass trên bản sửa, và một input đang chạy đúng hôm nay phải tiếp tục chạy đúng.
- Sau khi release: lỗi không quay lại. Đây là phép kiểm mà không test nào trong pull request làm được.
Với coding agent, hãy yêu cầu ngay trong task: “Viết test từ input trong event này, và giải thích bằng lời thường test đó kiểm tra điều gì trước khi sửa bất kỳ dòng code nào.”
Belvador nằm ở đâu#
Belvador không kiểm tra bản sửa và không có tính năng AI tìm nguyên nhân gốc. Nó giữ hai thứ mà quy trình này cần. Event trên trang chi tiết issue chứa breadcrumb, tag và ngữ cảnh request, đã được lọc, là điểm khởi đầu cho một lần tái hiện. Còn “Xong ở release tiếp theo” sẽ mở lại issue nếu lỗi quay lại ở một release mới hơn, tức phép kiểm sau pull request. Trang thay thế Sentry nói về phần còn lại.
Để nhìn bức tranh lớn hơn, xem cách đánh giá một công cụ AI debug. Bài Seer hay coding agent cho thấy phân tích sai len vào từ đâu, còn Claude Code và lỗi production chỉ nên đưa gì cho agent để nó bắt đầu từ đúng input.
Thuộc bài hướng dẫn: Đánh giá công cụ AI debug: hãy chạy thử bản sửa của nó
Bài liên quan
Mọi bài viết
Kỹ thuật
Đánh giá công cụ AI debug: hãy chạy thử bản sửa của nó
Trong thí nghiệm của mình, mọi bản sửa sai đều tự nhận đã sửa, kèm test chạy qua và tự chấm 92 đến 100 điểm. Chỉ khi chạy đúng dữ liệu khách gửi mới biết bản nào vẫn crash.
Andrew Babo7 phút đọc

Sản phẩm
Sentry Seer hay coding agent: ai nên đi tìm nguyên nhân gốc?
Seer đọc dữ liệu Sentry và code đã liên kết, ngay trong Sentry. Coding agent đọc những gì bạn đưa, trong repo của bạn. Rủi ro nằm ở bước bàn giao: một phân tích sai mà bước sau tin theo.
Andrew Babo5 phút đọc
Đọc tiếp trong tài liệu
Xem lỗi production của chính bạn như thế này
Belvador chạy trên máy chủ Hetzner của chính bạn: lỗi, cron, uptime và trace — dữ liệu vẫn là của bạn.