> Đây là kết quả lịch sử của bản ngày 05/09. Xem VALIDATION_20260906.md cho bản bàn giao hiện tại.

# Kiểm tra ngày 05/09/2026

Bộ chạy mới được tạo tại `rcms_preserve/` trong workspace.
Không chỉnh script/cấu hình/dữ liệu sản xuất, không gửi job dự báo.

## Đã qua

- Phân tích cú pháp toàn bộ file Python; `bash -n` cho launcher và batch script mẫu.
- 14 kiểm tra logic, lỗi và giữ dữ liệu (`test_workflow.py`):
  file đã tồn tại không bị ghi đè; copy vào đích cũ bị từ chối;
  bắt GRIB tải dở/sai đuôi; bắt thiếu mốc 6 giờ và thiếu cuối dự báo;
  bắt input thay đổi sau lập kế hoạch; giữ log khi lệnh lỗi;
  giữ nguyên phần vật lý khi thay đường dẫn namelist;
  chặn post khi chưa có marker tích phân;
  giữ output tích phân lỗi và các lần hậu xử lý lỗi;
  không tái sử dụng stage cũ; dependency `afterok`/job ID/log Slurm riêng;
  giữ bằng chứng khi gửi job lỗi;
  **thử syscall unlink và rmdir thật trong tiến trình con: cả file và thư mục vẫn còn**.
- Kế hoạch chu kỳ `2026082100` tới `2027030100`: 769 cặp GRIB2, liên tục;
  kiểm tra cấu trúc message tất cả file đã qua. Không gửi job ở bước này.
- Môi trường `.env` của hai mô hình nạp được ở chế độ shell dừng khi lỗi.
  Xác định binary CDO/NCO/NetCDF cụ thể để tránh dùng nhầm từ PATH Conda/HDF.
- Tiền xử lý WRF **chạy executable thật** trên CFSv2 21/08/2026 00–06 UTC:
  ungrib FLXF/PGBF, metgrid, kiểm tra cả hai file NetCDF và lấy số mức metgrid;
  dừng trước `mpirun real.exe`.
- Tiền xử lý RegCM **chạy executable thật** trên cùng hai mốc:
  6 file SST/PLEV được chuyển bằng wgrib2 và kiểm tra trục thời gian;
  sstCLM45, icbcCLM45 thành công; kiểm tra SST và ICBC;
  dừng trước `srun regcmMPICLM45`.
- Hậu xử lý WRF **ARWpost/CDO/NCO thật**, trên hai `wrfout` có sẵn của chu kỳ
  16/08/2026 00–06 UTC: tạo 18 biến + xtrm.nc, đọc được NetCDF và kiểm tra thời gian.
- Hậu xử lý RegCM: dữ liệu NetCDF tổng hợp nhỏ, **CDO/NCO thật**, tạo đủ
  28 file (5 daily, 12 3hourly, 11 6hourly), kiểm tra NetCDF và thời gian.
  Riêng sigma2p được thay bằng fixture đã ở mức áp suất; executable sigma2p
  chưa chạy trong bài thử này. Quy ước đặt tên output đã đối chiếu source tại HPC.
- Hai file tham chiếu tọa độ `hgt_domain_20km.nc` (CFS và NCCB_562) có cùng SHA256.

## Những phát hiện đã xử lý khi thử

- ARWpost dùng tên file dài tối đa 132 ký tự. Bản đầu dùng đường dẫn tuyệt đối
  dài bị lỗi; bản cuối dùng `input/wrfout_d01_*` tương đối và đã thử thành công.
- Ở lần thử ARWpost đầu tiên, executable tự gọi `/bin/rm` để xóa `.foo` và `.foo1`
  trong thư mục thử mới. Phát hiện này đã được báo trong hội thoại. Từ đó bổ sung
  bộ lọc syscall bắt buộc cho executable, kể cả từng rank MPI. Lần thử thành công
  sau sửa vẫn giữ được `.foo` và `.foo1`. Không có dữ liệu sản xuất bị xóa.
- WPS ungrib cũng có bước xóa PFILE trong executable; tiền xử lý mẫu thành công
  khi bật cùng bộ lọc và giữ các file này.

## Giới hạn còn lại

Chưa gửi/chạy tích phân WRF hay RegCM đầy đủ trên compute node, chưa kiểm tra
end-to-end MPI/Slurm hoặc chất lượng vật lý dự báo. Bộ lọc seccomp phải được
kernel và libseccomp trên compute node hỗ trợ; nếu không, stage dừng có lỗi,
không tự bỏ bảo vệ. Tài nguyên Slurm và walltime cần phù hợp với hàng đợi thực tế.

Cơ chế bảo vệ chặn unlink/unlinkat/rmdir; không tuyên bố chặn mọi hình thức
truncation/rename bên trong executable. Các lần chạy mới được tách thư mục
để không ghi đè dữ liệu đã có của lần cũ.

Mọi bài thử lưu trong `test-results/`, kể cả lần thử ban đầu lỗi.
`validation-results.json` liệt kê các bản ghi kiểm tra mẫu đã thành công.
Không có bước xóa fixture sau kiểm tra.
