Yêu cầu phi chức năng (NFR)
Hai repo (16.10.2026)
Từ 16.10.2026 NFR-I18N và NFR-SEO được gác ở repo conan-web (www sang đó); xem Hai repo.
Yêu cầu dùng chung cho mọi domain. Một domain không chép lại NFR; nó trỏ tới đây, và chỉ ghi ở tests.md của mình phần NFR có cách kiểm riêng.
| Mã | NFR | Trang | Hiện trạng |
|---|---|---|---|
| NFR-ERR | Học từ lỗi: thu mọi lỗi GitHub + Cloudflare, dấu vân tay, chặn lặp | error-learning | Hai sổ rà tay có; tầng tự động chạy từ PR #423; lỗi kèm stack qua Sentry (đã nối, chờ DSN) |
| NFR-TEXT | Không ký tự gạch dài U+2014 trong mọi nội dung | CLAUDE.md, LUẬT CHỮ | Có gác npm run check:emdash |
| NFR-COLOR | Chỉ dùng token màu từ packages/design-system/theme.css | design-system | Có gác npm run check:colors, mốc chặn ở 0 |
| NFR-I18N | Trang công khai của www có hai URL (/ và /en) | i18n-www | Gác trong check:seo |
| NFR-SEO | Trang công khai qua đủ bốn cửa | seo | Có gác node scripts/check-seo.mjs |
| NFR-PRIV | dataLayer không mang PII; một container GTM | analytics | Có gác npm run check:analytics |
| NFR-ONCE | Vòng chạy tự động có tác dụng phụ giành quyền chạy bằng ràng buộc CSDL | CLAUDE.md, LUẬT VÒNG CHẠY TỰ ĐỘNG | Theo mã (claimScheduledRun); bất biến đêm email-* đếm thư gửi đôi (d1-invariants) |
| NFR-OBS | Mọi Worker bật Workers Logs | cf-error-ledger (C12) | Có gác scripts/check-worker-observability.mjs |
| NFR-PRIV-ERR | Báo cáo lỗi (Sentry) không mang dữ liệu cá nhân, chỉ bắt lỗi | sentry | Có gác npm run check:sentry |
| NFR-DEPLOY | Deploy xanh phải chứng minh đúng bản đang chạy và có ruột | smoke-production | Bước cuối _deploy-cloudflare.yml; tự kiểm npm run check:smoke |
| NFR-DATA | Bất biến dữ liệu D1 kiểm mỗi đêm, mốc chỉ được hạ | d1-invariants | d1-invariants.yml; tự kiểm npm run check:d1-invariants |
| NFR-CONTRACT | Phản hồi công khai đúng hợp đồng; lỗi là 5xx, không là danh sách rỗng | api-contract | npm run test:contract; kiểm sống sau deploy api |
| NFR-A11Y | WCAG 2.2 AA | design-system | Chưa có gác tự động |
Chưa viết trang riêng cho các NFR ngoài NFR-ERR; trang mẫu là error-learning.