Tầng rủi ro: A (ghi đơn giá/tiền phiếu xuất, hoá đơn, lệnh huỷ hàng) → người cần đọc: spec + báo cáo + toàn bộ diff
Số quy tắc: 5 · PASS 4 (R-02…R-05) · DEVIATION có chủ đích 1 (R-01 — D-01 dùng lại D-04/D-08/D-09 của listener-cogs-completion) · DEVIATION KHÔNG chủ đích 0 · UNVERIFIED: TC-14 (đồng bộ lệnh huỷ — cú pháp SQL Server)
Coverage thấp nhất: F-01 100% dòng / 90% nhánh
Finding logic: CRITICAL 0 · MAJOR 0 · MINOR 1 · UNSURE 0
Nghi vấn bug code cũ (mục 3c): 3 (CAO 1) · Quyết định tự chốt cần xác nhận (mục 3d): 4
Chạy bằng: /mig-auto lượt 20261105-2144 (spec qua 1 lần spec-reviewer, chưa có người duyệt) · Số vòng: 1 verify / lần sửa 0/3
Phạm vi còn nghi vấn (❓) — như listener-cogs-completion.
text lỗi tầng transaction (F-logic-1); ghi status 1 sau commit → giao lại cộng delta lần nữa
F-02
Áp cập nhật vào phiếu, hoá đơn, lệnh huỷ
8 / 1 (bỏ đếm dòng — chỉ log) / 0 / 0
không
SQL Server-only UPDATE…FROM; cộng dồn tiền phiếu không chống lặp
3c. Nghi vấn bug / sai ở code cũ (đã GIỮ nguyên khi chuyển)
B-01 Đơn giá dòng phiếu và chênh lệch tiền phiếu đi hai message riêng: lỗi một bên là tiền phiếu lệch vĩnh viễn
Mức nghi ngờ: CAO — lỗi DB tạm thời (deadlock, mất kết nối) ở một trong hai message là đủ; không retry, tính lại còn làm lệch thêm.
Ở đâu: code cũ base:services/impl/BaseCogsHistoryServiceImpl.java:157-180 (bên gửi tách hai task log), async:…/CogsUpdateAsyncListener.java:94-97,111-112 → code mới (giữ nguyên) …/application/cogs/CogsUpdateTaskService.java, …/CogsBatchUpdateService.java
Code cũ đang làm gì: đơn giá từng dòng phiếu xuất và phần chênh lệch tổng tiền phiếu được gửi thành hai việc riêng, mỗi việc ghi DB riêng; việc nào lỗi thì bị bỏ, không chạy lại.
Ví dụ cụ thể: phiếu 900 tổng 1.000, dòng 904 thành tiền 100 → giá vốn mới cho 150. Việc "dòng" lỗi, việc "phiếu" thành công → phiếu 1.050, dòng vẫn 100. Người bấm tính lại → lại +50 → phiếu 1.100, dòng 150 (đúng phải là 1.050).
Vì sao nghi là sai: tổng tiền phiếu phải bằng tổng các dòng; ở đây lệch và không tự sửa được.
Ảnh hưởng nếu đúng là bug: báo cáo giá trị xuất kho, công nợ theo tổng phiếu sai.
Đã xử lý khi chuyển: GIỮ. Test khoá: TC-17 (CogsUpdateRelationalRepositoryTest#deltaAppliedTwice), TC-10.
Nếu muốn sửa: gộp cập nhật dòng và phiếu vào một task log/transaction ở bên gửi (cogs-calculate) và ở đây; đổi định dạng message.
Liên quan: D-07, D-04, R-03, R-04
B-02 Message giao lại sau khi đã ghi DB thì tiền phiếu bị cộng hai lần
Mức nghi ngờ: TRUNG BÌNH — cần crash/lỗi Mongo đúng giữa lúc commit DB và lúc ghi status 1.
Ở đâu: code cũ base:repositories/impl/BaseCogsHistoryRepositoryCustomImpl.java:155-158, async:…/CogsUpdateAsyncListener.java:63 → mới …/CogsUpdateRelationalRepository.javaADD_WARD_DELTA_SQL
Code cũ đang làm gì: cộng chênh lệch vào tiền phiếu; chống làm lại chỉ bằng trạng thái task log ghi sau khi DB đã commit. deltaAmount null → tiền phiếu thành NULL.
Ví dụ cụ thể: phiếu 900 tiền 1.000, chênh +50; DB commit xong thì service tắt → message giao lại → 1.100.
Vì sao nghi là sai: thao tác cộng dồn cần chống lặp trong cùng transaction.
Ảnh hưởng nếu đúng là bug: tiền phiếu sai khi có sự cố triển khai/khởi động lại.
Đã xử lý khi chuyển: GIỮ. Test khoá: TC-16, TC-17.
Nếu muốn sửa: ghi khoá idempotency (id task log) vào DB trong cùng transaction với UPDATE.
Liên quan: D-04, R-04
B-03 Cập nhật theo id, không kiểm công ty
Mức nghi ngờ: THẤP — id luôn do bước tính (đã lọc công ty) sinh ra.
Ở đâu:CR:79,118,155-158,189-197 → CogsUpdateRelationalRepository
Code cũ đang làm gì: UPDATE chỉ WHERE id = ?, message không mang comId.
Ví dụ cụ thể: task log công ty 10 chứa dòng 904 thuộc công ty 11 → dòng của công ty 11 vẫn bị đổi.
Vì sao nghi là sai: trái tiêu chí C-01 (mọi truy vấn kho lọc comId).
Ảnh hưởng nếu đúng là bug: chỉ khi dữ liệu task log bị sai/ghi tay.
Đã xử lý khi chuyển: GIỮ. Test khoá: TC-13..16 (không có com_id trong điều kiện).
Nếu muốn sửa: thêm com_id của document vào điều kiện.
Liên quan: D-03, R-03
3d. Quyết định AI tự chốt và thay đổi tự động (cần người xác nhận)
#
Nguồn
AI đã làm gì
Khác code cũ ở điểm nào (input → cũ / mới)
Người cần xác nhận gì
1
D-01
Dùng lại mọi quyết định nhận message của listener-cogs-completion (trừ D-06)
error_message: lỗi đọc → message Jackson; NPE → "java.lang.NullPointerException"; lỗi DB → toString() của nguyên nhân
lỗi commit transaction → cũ getMessage() / mới toString() của nguyên nhân (F-logic-1)
Chấp nhận khác text lỗi
Spec qua 1 lần review; các R-xx đã sửa theo MAJOR: R-03, R-04, R-05 — người đọc kỹ đúng các quy tắc này.
4. Finding đã xác nhận
Không có CRITICAL/MAJOR. MINOR: F-logic-1 (verify/round-1/review-logic.md).
5. Finding bị loại
Finding
Lý do loại
—
—
6. Xử lý của người
Vấn đề
Cổng
Chỉ thị
Kiểm Sonar trong IDE (sonar-ide.md)
G4
7. So với vòng trước
Vòng đầu.
8. Thay đổi trong repo đích
12 file (verify/round-1/changed-files.md): 5 main mới (consumer, 2 service, repository port, adapter JDBC), sửa CogsTaskLogStore/CogsTaskLogMongoStore (unit 1 cùng lượt); 4 test mới, sửa CogsTaskLogMongoStoreTest.
9. Đề xuất bổ sung kinh nghiệm (/mig-learn gom vào proposal để người duyệt)
Đề xuất
Đưa vào đâu
H2 MODE=MSSQLServer không chạy UPDATE <alias> … FROM … JOIN — khoá câu SQL bằng DataSource giả + ghi UNVERIFIED, không viết test-plan kiểu "H2" cho câu này
lessons.md (1c)
Chèn mã Java qua node -e: "\\s" thành "\s" (escape hợp lệ trong Java 15+ = dấu cách) → regex sai mà vẫn compile
lessons.md (1c) — trùng ý K-29 đề xuất ở 20261105-1459
Code cũ bọc lỗi new RuntimeException(e) → error_message = e.toString(); NPE trên Java 11 = "java.lang.NullPointerException"
legacy-facts.md
Nguồn của trang này
Báo cáo sai lệchmigrations/inventory/listener-cogs-update-async/report.mdvòng 1 · sha256 a1bfd3190f46
v1 dựng 2026-11-06 00:42 · base commit đích a06ccfa6d4