> Bản phục hồi mới nhất: xem RESTORATION_20260906.md. Các giới hạn chặn mọi chu kỳ cũ bên dưới mô tả bản trước khi thêm recovery.py.

# Kiểm tra bản bàn giao ngày 06/09/2026

## Thay đổi đã hoàn thiện

- Kết nối operations.py với CLI và worker; snapshot gồm cả hai module.
- Bắt buộc tài khoản cấu hình nampq trước submit, retry-post, worker và publish.
- Input/output dùng cây vận hành: wdir/<cycle>/input, output và
  RegCM Dataset/CFS/<cycle>/01. Snapshot/log/hậu xử lý dùng rcms_runs.
- Kết quả cuối dùng đúng data/current/<model>/<cycle> và cấu trúc biến cũ;
  symlink cycle trỏ tới bản copy đủ file đã kiểm tra SHA256.
- Khóa theo chu kỳ, kiểm tra squeue, job name chứa model/cycle/phase;
  từ chối ghi đè trạng thái cũ và không tự coi raw cũ là tích phân thành công.
- Retry hậu xử lý tách lần thử; lưu kho lỗi giữ SUCCESS của hậu xử lý để
  thử publish lại mà không tính lại sản phẩm.

## Bằng chứng của lần kiểm tra này

- 14/14 test_workflow.py và 11/11 test_operations.py thành công.
- Fixture cuối: test-results/20260906T024629Z-53623171 và
  test-results/operations-20260906T024630Z-bb9a2d4b.
- Phân tích cú pháp tất cả file Python; bash -n launcher và batch mẫu: đạt.
- Kiểm tra trực tiếp 769 cặp CFS GRIB2 của chu kỳ 2026082100:
  liên tục 6 giờ đến 2027030100, mọi message có header/độ dài/đuôi hợp lệ.
- wrf.nml, wps.nml, regcm.nml giống từng byte với namelist *_org tại HPC.
- doctor xác nhận hai symlink done khớp data/current của mỗi mô hình.
- Lệnh submit thực tế bằng tanpv bị từ chối trước tạo RUN/gửi job.
- plan 2026082100 xác nhận cả hai mô hình bị BLOCKED do wdir cũ chưa có
  xác nhận hoàn tất; RegCM còn có Dataset/CFS của chu kỳ đó.

## Giới hạn

Không gửi job, chạy tích phân, copy bộ chạy sang nampq, sửa crontab hoặc ghi
vào cây vận hành trong lần này. Kiểm tra MPI/Slurm end-to-end bằng nampq
và kiểm định dự báo vẫn chưa thực hiện. Cấu hình tài nguyên phải phù hợp
compute node và môi trường MPI/libseccomp thực tế.

Các smoke test executable thật ghi trong VALIDATION.md là bằng chứng lịch sử
ngày 05/09, trước khi đổi bố trí đường dẫn vận hành; không phải xác nhận
end-to-end cho bản này. Bộ smoke preprocess đã được buộc giữ output thử
trong workspace, không sử dụng bố trí vận hành khi thử.

Bản này giữ nguyên đường dẫn input/output chính; các bước WPS/REAL và log
có thư mục con riêng. Không di chuyển wdir sang wdir2. Không tự restart hoặc
nhận lại output thô từ chu kỳ cũ thiếu manifest thành công. Các script cũ
phải ngừng xử lý cùng chu kỳ khi chuyển sang bộ điều khiển mới.

## Xác nhận yêu cầu giữ kết quả tích phân

Đã rà soát rcms.py và operations.py: không có bước xóa/di chuyển output giữa
integration/SUCCESS.json và hậu xử lý. Không gọi clean của hệ thống cũ.
Hậu xử lý dùng thư mục riêng và giữ nguyên output thô, kể cả khi chạy lại.
Lần cập nhật này chỉ làm rõ tài liệu; không thay đổi mã thực thi.

## Sửa tương thích Python 3.6

Đã thay add_subparsers(required=True), shlex.join và contextlib.nullcontext
bằng cách tương đương hỗ trợ Python 3.6. Kiểm tra trực tiếp trên Python 3.6.1
ở /opt/stack/bin/python3.6: 25/25 test thành công; plan 2026082100 và launcher
chạy được, báo BLOCKED theo dữ liệu cũ thay vì lỗi API. Không gửi job thật.
