7 task của AI agent bị gãy (và tôi đã fix thế nào) trong 90 ngày

Thứ 2 tôi post 90-day numbers từ rebuild agency này thành AI-first operation. Phần wins.
Đây là nửa còn lại. Bảy task cụ thể của agent bị gãy trong cùng 90 ngày đó, root cause từng cái, fix gắn được. Publish dạng build-in-public log, không phải case study clean.
Nếu bạn đang cân nhắc một AI-first stack — đây là hình dạng của thất bại tôi muốn bạn kỳ vọng.
1. Standup digest agent lặng lẽ skip ticket khi JQL vượt response window
Cái gì gãy: Một agent scheduled chạy morning Jira standup digest paginate qua tickets, hit soft response-window limit, và lặng lẽ truncate output. Digest trông như hoàn chỉnh. Ba tickets mỗi cron run bị thiếu.
Tôi catch ra sao: Một thành viên team hỏi vì sao ticket họ vừa move sang "In Review" không có trong digest. Digest không có row nào cho project đó cả.
Root cause: Prompt của agent nói "summarize all in-progress tickets" — không nói "nếu paginated response trả về continuation token, follow nó trước khi summarize." Agent lấy page đầu và xem như universe.
Fix: Hai thay đổi. Một — instruction explicit trong prompt rằng mọi paginated response phải exhaust trước bước summarize. Hai — một check cuối agent run so sánh count tickets được summarize với count trả về bởi fresh count-only query. Mismatch flag warning trong handoff log.
Principle: Agent không tự exhaust pagination. Chúng lấy page đầu là complete. Nếu agent đọc từ source pagineable, viết pagination loop vào prompt và verify count.
2. Blog post agent ship draft với statistic bịa ở paragraph đầu
Cái gì gãy: Một scheduled cron agent ship weekly content draft Cluster A piece mở đầu bằng statistic tự tin về AI citation rate — một con số không xuất hiện ở bất kỳ nguồn nào được cite. Con số nghe plausible. Sai.
Tôi catch ra sao: Manual review trước publish. Con số anchor toàn bộ piece, nên tôi truy ngược về source — và source không chứa nó. Hình dạng gần, value khác.
Root cause: Agent đã được dặn "cite source URL cho mọi claim." Nó tuân thủ — paragraph nào cũng có citation. Nhưng citation chỉ cần tồn tại gần claim, không phải thực sự chứa claim. Agent học rằng proximity bằng citation.
Fix: Ba layer. Một — explicit prompt rule rằng cited source phải chứa claim, không phải adjacent claim. Hai — regex sweep trước publish flag bất kỳ numerical claim có % hoặc $ hoặc số cụ thể đối chiếu check "needs-source-verify." Ba — pre-publish gate yêu cầu founder confirm mọi number-with-citation thật sự được support.
Principle: Citation discipline không enforce bằng việc bảo agent cite. Nó enforce bằng việc check rằng citation thực sự chứa claim. Agent sẽ satisfy chữ và miss tinh thần nếu bạn không check.
3. Cold outreach drafting agent generate DM "cite data" prospect không tìm được
Cái gì gãy: Một DM draft cho prospect reference "ChatGPT citation gap store bạn có với hai competitor gần nhất" — framing tự tin, specific. Agent đã không thực sự chạy query. Con số là suy luận.
Tôi catch ra sao: Tôi đọc draft, yêu cầu agent show log query produce ra so sánh, và không có. "Data" là suy luận plausible, không phải đo lường.
Root cause: Agent được dặn dùng DM data-led. Nó hiểu "data-led" là "include số" thay vì "quote đo lường bạn thực sự chạy." Rẻ hơn để suy luận hơn là đo.
Fix: Rule mới trong prompt outreach drafting — mọi data claim trong DM phải include prompt cụ thể đã chạy và answer cụ thể nhận được, quote nguyên, trong working notes của agent. Body DM có thể paraphrase. Working notes phải chứa đo lường. Founder review working notes trước send. Không working notes bằng không send.
Principle: Suy luận plausible framed như data là fabrication risk trong cold outreach. Fix là require evidence của đo lường, không chỉ claim. Đây là fix leverage cao nhất trong list — các fix khác tốn time, fix này tốn trust.
4. Connect-acceptance agent accept agency owner đối thủ làm 1st-degree
Cái gì gãy: Một agent scheduled process LinkedIn connection invitation accept profile trông như 1st-degree founder match theo title. Profile thực ra là agency owner ở vertical gần — đúng loại contact criteria của chúng tôi explicitly exclude.
Tôi catch ra sao: Manual spot check accept queue tuần sau.
Root cause: Criteria là "1st degree, English profile, ecommerce founder match." Agent match keyword title "Founder" mà không parse company description, nơi list rõ agency services. Criteria quá mỏng.
Fix: Hai thay đổi. Một — thêm exclusion list explicit vào accept criteria: agency, consultancy, freelance, SaaS, marketing services. Bất kỳ profile nào tagline hoặc current role description chứa exclusion keyword route sang "review queue" thay vì auto-accept. Hai — agent phải record one-line justification cho mỗi accept reference brand cụ thể hoặc store URL nó identify. Không brand reference bằng không accept.
Principle: Accept criteria cần cả inclusion list và exclusion list. Agent sẽ satisfy inclusion criteria với false positive nếu exclusion implicit. Làm cho "no" list explicit và machine-checkable.
5. Weekly review agent paraphrase scheduled task là completed khi mới chỉ drafted
Cái gì gãy: Saturday weekly review agent generate status update nói "Lead Magnet #1 outline shipped tuần này." Outline tồn tại như draft file. Chưa review, chưa approve, chưa build thành PDF lead magnet thật.
Tôi catch ra sao: Status update sounded too clean so với những gì tôi thực sự nhớ đã ship. Tôi check artifact. Outline là markdown draft, không phải PDF finished.
Root cause: Agent đọc weekly progress file để xác định status. Progress file dùng "ship" như verb generic — đôi khi nghĩa "draft created," đôi khi nghĩa "deployed to production." Agent không phân biệt được.
Fix: Siết vocabulary trong mọi status entry. Ba state thôi: draft (file tồn tại, chưa review), approved (founder review, ready publish), live (deployed, URL verify). Weekly review agent paraphrase mỗi item với literal state word. Không còn "shipped" như status — chữ này chỉ xuất hiện trong câu mô tả action produce state transition.
Principle: Vocabulary drift giữa các agents là một trong các cách rẻ nhất corrupt downstream output. Lock vocabulary explicit và require các agent dùng chỉ locked word cho state.
6. MDX shipping agent quên thêm post vừa generate vào sitemap
Cái gì gãy: Một blog post được publish, MDX file landed đúng directory, build deploy, URL trả 200. Sitemap không include URL. Search engine không được ping cho nó suốt hai ngày.
Tôi catch ra sao: D+1 follow-up check của agent chạy sitemap grep cho slug mới và report "URL not present in sitemap."
Root cause: Build script regenerate sitemap từ glob MDX file. Glob exclude subdirectory mới thêm. Agent ship vào subdirectory mới vì topic warrant, nhưng build infrastructure chưa update để include location mới.
Fix: Hai thay đổi. Một — thêm subdirectory mới vào build glob. Hai — extend D+1 check cũng confirm IndexNow ping sent thành công, không chỉ URL live. Ba — MDX placement rule của agent siết: bất kỳ file path mới nào không match existing glob pattern trigger flag trong handoff log, trước deploy.
Principle: Infrastructure và content move tốc độ khác nhau. Agent không biết build glob tồn tại. Hoặc dạy nó về glob hoặc fail loudly khi glob không cover file mới.
7. Morning briefing agent tạo "Active" sales lead ma từ thread cũ
Cái gì gãy: Morning briefing surface một lead như "Active follow-up window — Day 5 of 7." Lead có thật. Follow-up window đã đóng ba tuần trước khi prospect explicitly decline.
Tôi catch ra sao: Tôi cố draft follow-up và thấy message "thanks but no thanks" của prospect ở đầu thread.
Root cause: Agent đọc từ CRM memory file chưa update khi prospect decline. Message decline log trong email connector. CRM memory file vẫn show "Active." Briefing agent trust CRM file như canonical state.
Fix: Ba thay đổi. Một — briefing agent giờ đọc cả CRM file và email connector cho bất kỳ lead nào nó surface, và flag divergence nào. Hai — khi một lead được mention trong inbox connector với từ như "not a fit," "decline," "pass," "later," briefing agent flag lead để state review trước surface. Ba — mọi CRM memory file có explicit last_verified_against_inbox date agent phải check; stale state trên 7 ngày flag re-verify task.
Principle: Canonical state file trở thành stale lặng lẽ. Agent phải verify với source-of-truth connector ở checkpoint có nghĩa, không trust canonical file forever. Memory là cache. Cache đi stale.
Cái gì generalize được
Bảy failures trông khác nhau ở bề mặt. Chúng share structure phía dưới.
Năm trong bảy là agent satisfy chữ của prompt mà miss tinh thần. Citation discipline như proximity thay vì containment. Accept criteria như inclusion mà không exclusion. State như verb generic thay vì vocabulary locked.
Hai trong bảy là infrastructure mismatch — agent operate trên assumption underlying system đã thay đổi (build glob, CRM staleness). Đây là failures hurt ít nhất khi discover nhưng cost nhiều nhất để retro-fix vì chúng thường ẩn nhiều tuần trước khi surface.
Không cái nào trong bảy là model "hiểu sai." Mọi fix là prompt change, workflow change, vocabulary lockdown, hoặc verification gate. Model không phải bug. Prompt và workflow là bug.
Đó là closing principle. Model không phải bug.
Nếu bạn treat mọi agent failure như prompt problem trước — tôi đã không nói gì, tôi để agent fill in gì, tôi đã không check gì — bạn sẽ fix được hầu hết failure với prompt và workflow change. Nếu bạn treat như model problem, bạn sẽ dùng cả năm switch provider và end up với cùng hình dạng failure trên stack mới.
Việc là workflow. Agent là phần rẻ.
Muốn phần wins của 90-day log? Xem Tôi thay 12-người agency bằng AI-First Stack: 90-Day Numbers đã ship đầu tuần này.