Soát lại plan.md thì thấy CASAN là NĂM tiêu chí C-A-S-A-N, không phải ba. Tiêu
chí A có hai vế, tôi mới đạt vế đầu:
vế 1 0 API key plaintext trong JSON -> đã đạt từ 25/08
vế 2 MỌI thao tác ghi tệp đi qua AtomicJsonFile -> CHƯA
Toàn repo còn 15 chỗ ghi JSON thẳng. Bốn trong đó là của Gamma (vùng Co4E):
core/co4e.py:236 lưu workflow ghi thẳng, không nguyên tử gì cả
core/co4e.py:310 lưu agent ghi thẳng
core/co4e_run_manager.py:156 tmp + replace tự viết
application/workflows/co4e_workflow_service.py:178 tmp + replace tự viết
Hai chỗ đầu nguy hơn: tắt máy giữa lúc lưu là mất luôn workflow hoặc agent.
Hai chỗ sau nhìn thì có vẻ ổn vì đã tmp + replace, nhưng thiếu hai thứ:
* không fsync — dữ liệu có thể còn nằm trong bộ đệm ổ đĩa khi mất điện, nên
"nguyên tử" chỉ đúng với crash tiến trình, không đúng với mất điện;
* dùng thẳng Path.replace, đúng chỗ dính PermissionError [WinError 5] mà tôi
vá hôm 25/08 — Defender giữ handle file vừa tạo. Tần suất đo được khoảng
1/140 lần lưu, nhân với số lần lưu lịch sử chạy flow.
11 chỗ còn lại thuộc team khác (accounts, admin_agents, custom_agents, flows,
groups, history, projects, skills, tasks). Không đụng vào; cần báo lên vì
tiêu chí A là tiêu chí TOÀN DỰ ÁN, Gamma sạch không cứu được cổng.
Đã kiểm application/ vẫn không kéo PySide6 vào sau khi thêm import mới
(tiêu chí C). 714 test xanh, 24/24 checker qua.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>