Trương Tuấn AnhTuna / truongtuananh
Tất cả bài viết
ngày ghi
phút đọc
7
nguồn dẫn
6

Dữ liệu trống mà màn hình vẫn hiện 1.000 dự án

Ngày 17/07/2026, kho dữ liệu trống cả 20 bảng mà màn hình vẫn hiện 1.000 dự án. Cùng 300 khách hàng, tất cả lấy từ bộ số mẫu. Vì sao luật số một của tôi là mọi con số trên màn hình phải truy được về dữ liệu thật.

Chủ đề:
  • erp
  • dữ liệu
  • ai có người duyệt

Ngày 17/07/2026 tôi ngồi đếm lại từng bảng dữ liệu trên hệ thống đang chạy thật của NoLimit ERP. Kết quả: cả 20 bảng đều bằng 0. Bảng trạng thái 0, bảng dự án 0, bảng khách hàng 0, bảng người dùng 0. Số tài khoản bằng 0, nghĩa là chưa ai đăng nhập được. Web và bot thì đã lên từ trước, đang phục vụ thật.

Vấn đề là mở trang dự án, khách hàng, lãi lỗ, doanh thu lên, tôi thấy 1.000 dự án và 300 khách hàng, đầy đủ như thật. Nhãn dữ liệu mẫu thì tắt. Một hệ thống kho trống trơn mà màn hình đầy số.

Sự cố: kho trống, màn hình đầy số

Nguồn gốc nằm ở một dòng trong lớp lấy dữ liệu. Hàm đọc bảng trạng thái từ Supabase, không có gì thì rơi về một file dữ liệu nằm sẵn trong mã nguồn. File đó chính là bộ 1.000 dự án tôi dựng để xem trước giao diện khi máy lập trình chưa cấu hình kết nối.

Cách làm này hợp lý lúc mới viết. Máy lập trình không có Supabase thì đọc file mẫu, ai cũng hiểu số là giả. Nhưng hệ thống thật thì có Supabase, và bảng trạng thái của nó lúc đó rỗng vì chưa nạp dữ liệu. Đúng thực tế hôm đó. Mã gộp "chưa cấu hình kho" và "đã cấu hình nhưng kho chưa có dữ liệu" làm một. Cả hai rơi vào cùng một nhánh dự phòng.

Thêm một yếu tố nữa: biến chọn bộ dữ liệu trên hệ thống thật để trống, nên nó rơi về mặc định là bộ mẫu. Vậy là ứng dụng phục vụ đúng bộ 1.000 dự án và 300 khách hàng bịa như thể số thật.

Về thứ tự lên sóng: mục 2 (tạo 3 tài khoản) và mục 6 (nạp dữ liệu) trong danh mục việc bị bỏ qua, mục 7 (đưa bản mới lên) thì đã làm. Đó là lỗi vận hành của tôi. Lỗi đó lẽ ra dẫn tới màn hình trống, và dừng ở đó.

Vì sao nhãn dữ liệu mẫu nằm im

Ứng dụng có sẵn một dải nhãn để người xem biết số là giả. Cờ bật dải đó chỉ bật khi thiếu địa chỉ kết nối Supabase. Hệ thống thật thì có địa chỉ đó. Vậy nên nhãn tắt.

Hai điều kiện lệch nhau. Nguồn dữ liệu rơi về bộ mẫu theo tiêu chí "bảng trạng thái rỗng". Nhãn bật theo tiêu chí "thiếu địa chỉ kết nối". Khi hai tiêu chí nhìn vào hai sự thật khác nhau, sẽ có lúc số giả chạy mà thiếu nhãn. Tôi gọi đây là sai lặng lẽ: nhật ký sạch, bản dựng xanh, trang hiện ra đẹp. Chỉ có số là bịa.

Tệ hơn, người xem thiếu hẳn cách tự kiểm. Một giám đốc mở bảng điều hành thấy 1.000 dự án sẽ tin đó là số hệ thống. Màn hình trông ổn thì ai cũng bỏ qua việc đếm lại kho.

Cách sửa: đã kết nối kho thì rỗng là rỗng

Bản vá đổi nguyên tắc: đã có địa chỉ kết nối mà bảng trạng thái không có dữ liệu thì trả về cấu trúc rỗng, thay vì file mẫu. Chỉ số bằng 0, danh sách trống, kèm ghi chú rằng bảng trạng thái chưa có dữ liệu. Các trang hiện trạng thái rỗng đúng với thực tế.

Bộ số mẫu chỉ còn được phép dùng trong hai trường hợp đầu của bảng dưới, và cả hai đều có chủ ý. Dòng thứ ba là trạng thái rỗng:

Trường hợpNguồn dữ liệuNhãn dữ liệu mẫu
Máy lập trình, chưa cấu hình kết nốiBộ số mẫuBật
Cố ý bật chế độ trình diễnBộ số mẫuBật
Hệ thống thật đã kết nối, bảng trạng thái rỗngTrạng thái rỗng (chỉ số 0, danh sách rỗng)Tắt, vì số 0 là thật

Điểm mấu chốt: sau khi vá, cờ cho phép rơi về bộ mẫu và cờ bật nhãn được tính từ cùng một cặp điều kiện. Số giả thì luôn đi kèm nhãn giả. Ở đường đọc, mọi số giả đều mang nhãn; đường ghi thì còn dở, như mục dưới kể.

Tôi cũng ghi lý do ngay trên đoạn mã, trỏ về file quy tắc của dự án: số trên màn hình phải đến từ một truy vấn thật. Để phiên Claude Code sau đọc mã hiểu vì sao có đoạn này và giữ nguyên, thay vì "tối ưu" ngược về cách cũ.

Một ngày sau, rà soát còn thấy một đường nữa

Ngày 18/07/2026 tôi cho 14 lượt AI đọc mã song song, mỗi lượt một vùng chức năng, lỗi mức cao thì có một lượt thứ hai thẩm định đối kháng, cố bác bỏ. Kết quả về phần này: bản vá đường đọc đúng, nhưng đường ghi vẫn còn chỗ rơi về bộ số mẫu khi bảng trạng thái chưa có dữ liệu. Một đường vá xong mới là một nửa việc. Cùng một giả định "thiếu dữ liệu thì lấy bộ mẫu" nằm ở nhiều hơn một chỗ.

Khi một nhánh dự phòng đã tồn tại trong mã nguồn, nó sẽ được sao chép. Chặn ở đường đọc thì phải soát hết mọi nơi khác cùng làm thế, rồi kiểm lại bằng một đợt đọc độc lập trước khi tin bản vá đầu tiên.

Vì sao đây phải là luật số 1

File quy tắc của dự án có dòng: số trên màn hình và trong bot phải đến từ một truy vấn thật, mọi đường xu hướng giả và số điền tạm đều phải rời khỏi màn hình. Trước sự cố tôi coi đó là quy tắc về giao diện. Sau sự cố tôi hiểu nó rộng hơn: mọi con số người dùng nhìn thấy phải có đường truy về một truy vấn thật. Thiếu nguồn thì màn hình để rỗng.

Cùng nguyên tắc đó là cách tôi để AI làm việc trong ERP. AI chỉ soạn nháp, nháp mang nhãn chìm "bản nháp AI, cần duyệt", con người duyệt rồi mới thành dữ liệu. Nhãn chìm và nhãn dữ liệu mẫu là một thứ: dấu cho nội dung còn ở dạng nháp. Số bịa thiếu nhãn và nháp AI thiếu dấu nguy hiểm theo cùng một cách: chúng trông giống số đã kiểm, nên ai cũng tin luôn.

Ngay cả file mô tả hệ thống tôi cũng viết theo luật này. Dòng đầu ghi "mọi số liệu trong file này lấy từ mã hiện tại hoặc đếm trực tiếp trên hệ thống thật, mỗi lần viết lại là đếm lại". Dòng cuối ghi "nếu đọc file này về sau, hãy đếm lại trước khi tin". Lý do là bản trước đó của chính file này đã mô tả sai dự án.

Điều tôi rút ra

  • Rơi về dữ liệu mẫu chỉ an toàn khi nó luôn đi kèm nhãn. Cờ chọn nguồn và cờ hiện nhãn phải tính từ cùng một điều kiện.
  • "Đã kết nối kho nhưng kho rỗng" là một trạng thái riêng, đứng tách khỏi "chưa kết nối" và cần một màn hình rỗng riêng.
  • Một đường vá xong mới là một nửa việc. Cùng một giả định thường nằm ở nhiều hàm, phải soát hết và cho người khác đọc lại.
  • Luật "mỗi con số truy về một truy vấn thật" áp cho cả số trên màn hình, nháp AI và tài liệu mô tả hệ thống. Thiếu nguồn thì để rỗng.

Nếu công ty bạn đang quản lý bằng Zalo và Excel và muốn một ERP mà số trên màn hình luôn truy được về nguồn, kể tôi nghe bối cảnh.