Một tác vụ trong hệ thống của mình chạy sạch nhiều tuần liền và không làm được việc của nó. Nó có chạy, có in ra dòng thành công, và nó từ chối làm phần chính, rồi ghi lời từ chối đó vào một file không ai mở. AI làm sai mà không ai biết luôn có hình dạng này: mọi thứ trông bình thường, kể cả với người đang ngồi ngay đó.
Vì sao AI làm sai mà không ai biết
Việc làm tay mà không chạy thì bạn biết ngay hôm đó, vì bạn là người phải ngồi làm nó. Việc tự động không chạy thì không ai vắng mặt.
Không có màu đỏ, và không có ai phàn nàn. Thứ hỏng nằm ở niềm tin của bạn rằng nó đang chạy.
Nên mình xếp mọi việc theo một câu duy nhất trước khi bật nó lên: sai thì ai phát hiện, và sau bao lâu. Thứ tự giao việc dựa trên câu đó nằm ở bài nên tự động hoá việc gì trước.
Kiểu một: chưa chạy lần nào
Một tác vụ đáng lẽ chạy hằng ngày mà chưa bao giờ được đặt lịch. Nó chỉ chạy đúng những lần mình gõ tay, và lần nào cũng in ra dòng thành công.
Giữa các lần đó nó nằm im. Không ai phát hiện suốt nhiều tuần, vì mỗi lần mình gõ tay lại thêm một dòng trông bình thường vào file log. Mình kể chi tiết lần đó ở bài tự động hoá sai chỗ.
Dấu vết bắt được kiểu này là một cái mốc thời gian mà mình soi mỗi tuần. Không phải file log của chính nó, mà là câu hỏi lần cuối nó chạy là khi nào.
Kiểu hai: chạy nhưng từ chối làm
Đây là kiểu mở đầu bài này, và là kiểu mình mất lâu nhất mới thấy.
Đây không phải cái tác vụ ở kiểu một. Đó là hai việc riêng, do hai đoạn máy riêng chạy. Cái ở kiểu một không bao giờ được gọi. Cái ở đây được gọi đều đặn và tự nó không chịu làm.
Tác vụ này có việc đem bộ luật làm việc của mình sang một công cụ khác. Nó được thiết kế để từ chối ghi vào một file chưa được chuẩn bị trước, và đó là một quyết định đúng. File đích chưa được chuẩn bị. Nên mỗi lần chạy, nó từ chối, ghi lại lý do, và thoát ra bình thường.
Nó không báo lỗi. Cả chuỗi việc chạy qua nó vẫn xanh, vì đứng ở góc của nó thì nó vừa làm đúng. Lời từ chối nằm trong một dòng ghi chú giữa đống chữ khác.
Mình chỉ thấy nó khi dọn sạch mấy lỗi ồn ào khác rồi chạy lại cả chuỗi. Lần đó bản ghi không còn rác, và dòng từ chối kia hiện ra một mình.
Cách chặn cuối cùng lại rất thô: đi soi FILE ĐÍCH xem chữ mình cần có nằm trong đó chưa. Không đọc báo cáo của cái máy làm việc đó. Một thứ chạy đúng luật mà rỗng kết quả thì chỉ có bên nhận mới biết.
Kiểu ba: chạy đúng trên dữ liệu sai
Kiểu này mình gặp ở một thư viện phụ cài hỏng. Nó có mặt, nên hệ thống không kêu thiếu. Nó hỏng, nên bước dựng ô tìm kiếm chết ngay dòng đầu.
Lỗi có hiện ra, lẫn trong một dòng giữa đống chữ, và nó không làm cả bản build dừng lại. Nếu thư viện đó thiếu hẳn thì mọi thứ đã đứng lại trong một phút.
Từ đó mình xếp "cài hỏng" nguy hiểm hơn "cài thiếu". Cái thiếu thì báo, cái hỏng thì chạy tiếp và rỗng một phần bên trong.
Kiểu bốn: tự khai đã xong
Agent viết ra dòng "đã chạy test, tất cả xanh" trong khi test mới chạy dở. Vì sao nó khai như vậy thì mình bàn ở bài giao việc cho AI agent. Ở đây chỉ có phần vì sao lời khai đó nghe lọt tai.
Repo của blog này có bốn file test đỏ sẵn từ trước. Ba file cần một database thử mà máy làm việc không dựng sẵn. File thứ tư đi gọi bản thật, nên nó cần một khoá mà chỉ máy chủ có. Đỏ ở cả bốn chỗ đó là bình thường.
Cách chặn là viết danh sách bốn file đó ra và giữ lại. Chỉ cái đỏ MỚI mới chặn được việc đăng bản mới. Thiếu danh sách đó thì bốn cái đỏ thành tiếng ồn nền, và cái đỏ thứ năm nấp sau chúng mà không ai đếm.
Bằng chứng phải mất đi khi việc không chạy
Luật mình rút ra sau bốn kiểu trên chỉ có một dòng. Mỗi việc giao cho máy phải kèm một dấu vết mà nếu việc không chạy thì dấu vết đó không tồn tại.
File log không đạt. Kiểu một và kiểu hai để lại log trông hoàn toàn bình thường. Kiểu ba có in ra lỗi, nhưng in vào giữa đống chữ mà không làm gì dừng lại, nên đọc lướt là trôi qua. Kiểu bốn thì log chính là lời khai.
Đạt thì là mấy thứ này:
- Một tấm ảnh màn hình mới, chụp đúng trang cần xem.
- Một dòng kết quả kèm exit code thật mà mình đọc bằng mắt.
- Một mốc thời gian ở phía NHẬN, không phải phía làm.
- Con số đo được của lần này, đặt cạnh con số của lần trước.
Cách viết yêu cầu bằng chứng vào chính câu lệnh thì mình để ở bài giao việc cho AI agent.
Bằng chứng phải lấy đúng bản đang xét
Đây là chỗ mình tự lừa mình một lần, và nó tinh vi hơn cả bốn kiểu trên.
Mình chạy test cho một bản, lấy kết quả, rồi commit kết quả đó vào git. Động tác commit tạo ra một bản mới. Thế là bằng chứng vừa lấy không còn nói về bản đang chuẩn bị đưa lên, nó nói về bản trước đó.
Bây giờ thứ tự đảo lại: lấy bằng chứng, dùng nó ngay, commit sau. Cái bẫy này không sai về nội dung, chỉ sai về thời điểm, nên đọc lại nhiều lần vẫn thấy hợp lý.
Đo cái đang tụt, không chỉ cái đang đỏ
Còn một kiểu hỏng không thuộc bốn kiểu trên: cái tụt dần.
Một con số tụt nửa điểm phần trăm thì không có gì đỏ. Tụt nửa điểm nhiều lần liền là đủ để nó rơi hẳn. Nên mốc so sánh phải là con số ĐO ĐƯỢC của lần trước, không phải cái ngưỡng ghi trong cấu hình. Ngưỡng cấu hình đặt thấp cho dễ sống, còn con số đo được thì nói thật.
Ở chính site này mình chưa làm xong phần đó. Cấu hình có khai chỗ đo test coverage, nhưng công cụ đo chưa được cài và cũng chưa đặt ngưỡng nào. Vậy nên không có con số để đặt cạnh lần trước. Một con số mà máy không dựng lại được thì tệ hơn là không có số. Nên chỗ đó đang để trống, và mình ghi nó ra đây thay vì ghi vào một file không ai mở.
Cùng loại với nó là quyền hạn nở ra âm thầm. Bật tính năng bản nháp lên là sinh thêm một quyền đọc mà mình không để ý. Chỗ đó mình kể ở bài Payload CMS, còn thứ tự chạy thì nằm trong tài liệu chính thức của Payload. Không ai bị chặn nên không ai báo, và đó đúng là hình dạng của cái sai lặng lẽ.
Chỗ cách này không cứu được
Mấy dấu vết trên chỉ bắt được cái sai có hình. Bài viết nhạt vẫn qua hết mọi bộ đếm, vì nhạt không phải một con số.
Nó cũng không bắt được thứ mình chưa từng nghĩ tới việc đo. Một cái mốc thời gian chỉ trả lời câu bạn đã hỏi, và câu bạn chưa hỏi thì vẫn im lặng.
Mình cũng chưa chắc bốn kiểu này là hết. Đây là bốn kiểu đã bắt được, và mỗi lần bắt thêm một kiểu thì mình lại thấy nó vốn nằm ngay đó khá lâu.
Việc nên làm chiều nay
Mở danh sách việc tự động của bạn ra rồi chọn một dòng. Trả lời đúng một câu: việc này im lặng ngừng chạy từ tuần trước, hôm nay bạn nhìn vào đâu để biết.
Nhìn không ra thì việc đó đang ở kiểu một hoặc kiểu hai, và bạn chỉ chưa gặp hoá đơn của nó. Tiền thuê máy và công cụ mỗi tháng mình để ở bài chi phí chạy website một tháng. Quy trình chống mất việc thì ở bài mất code khi deploy. Các ghi chép cùng loại nằm ở chủ đề Vận hành.
Mình đo chất lượng tự động hoá bằng số việc chứng minh được là vừa chạy thật. Số việc đã giao cho máy không nói lên gì.



