Bỏ qua

Thẩm định Gate 1 — tila-site

2026-11-13 · Người thẩm định: ai-plan-reviewer · Vòng 1/2 · Hồ sơ: prd.md v0.1, content.md v0.1, design_specs.md v0.1, ui-test-harness.html, brand/README.md, ceo-inputs.md. Bối cảnh không tính là lỗi (theo brief): logo A (QĐ-020), email example.com trong harness, phương án giao diện A, hai điểm chờ CEO trong ceo-inputs.md, không sàng lọc thị trường/tài chính.

Kết luận: CHƯA ĐẠT — 78/100 (ngưỡng 85)

Hồ sơ tốt hơn mức trung bình: số liệu trong ba tài liệu khớp nhau, câu chữ không bịa, harness chạy được. Chưa đạt vì có 1 lỗi Chặn (một tiêu chí nghiệm thu P0 không bao giờ đạt được theo cách đã viết) và 7 lỗi phải sửa trước khi code, trong đó có một ràng buộc hạ tầng đã kiểm chứng mà PRD chưa biết tới (Cloudflare). Sửa hết thì vòng 2 có thể đạt mà không cần làm lại. Không phản đối chọn phương án A.

Bảng điểm

# Tiêu chí Điểm Lý do chính
1 Đầy đủ của PRD (PR-FAQ, MoSCoW, OKR, BDD) 13/15 Đủ 4 phần, OKR có ngưỡng thất bại. Thiếu tầng Cloudflare trong ràng buộc (P-02), chưa theo dõi việc gắn nhãn nội dung do AI tạo (P-12)
2 Tiêu chí nghiệm thu kiểm chứng được 14/20 Đa số AC đo bằng công cụ và có ngưỡng số. Có 1 AC tự mâu thuẫn (C-01), AC-02 hiểu được hai cách (P-04), KR1 có chỉ số không có AC (P-10)
3 Nhất quán PRD · nội dung · thiết kế · nhận diện 15/20 Số ký tự, tương phản, dung lượng SVG, cây tiêu đề đều khớp khi đo lại. Logo nhỏ hơn cỡ tối thiểu (P-05), huy hiệu đầu dùng sai chỗ (P-06), content.md thiếu chuỗi (P-07)
4 Khả thi trên máy 1 CPU ARM, ngân sách hiệu năng 11/15 Trang tĩnh, SVG 26,9 KB, JS rất nhỏ nên tải nhẹ. Rocket Loader của Cloudflare đang chèn script (P-02), hero ẩn chờ JS có thể làm chậm LCP (P-08), AC về RAM chưa rõ đo ở đâu (L-03)
5 Khả năng tiếp cận và SEO 12/15 Tương phản, vùng chạm, liên kết bỏ qua, lang, hreflang đều tốt. Hiệu ứng lặp vô hạn vi phạm WCAG 2.2.2 (P-03); WCAG 1.4.12 chưa kiểm
6 Tuân thủ nội quy (không bịa, không placeholder, không nhắc công ty khác) 13/15 Không bịa, có ghi CHƯA KIỂM CHỨNG đúng chỗ. Còn ảnh 404 dùng tạm, token mở rộng chưa chốt, câu chữ của PRD 5.2 mâu thuẫn với 6.3 (P-11)
Tổng 78/100

Đã tự kiểm chứng bằng

  • Đối chiếu mục trang: 6 mục của PRD §6.1–6.6 cùng thanh đầu và chân trang (6.7–6.8) đều có chuỗi Việt/Anh trong content.md §1–8 và có đặc tả bố cục trong design_specs.md §5. Cấu hình dữ kiện (6.9) có trong content.md (các trường {…}) và §7.2. Không thiếu mục nào.
  • Chạy harness bằng Chromium headless (Playwright), dựng trang qua window.__tila.buildDoc: phương án A × vi/en × có/không email × sáng/tối × 320/360/390/768/1440 px, tổng 40 cấu hình. Kết quả: scrollWidth = innerWidth ở mọi cấu hình (kể cả sau khi cuộn hết trang); đúng 1 h1 và 5 h2; thứ tự home → about → what-we-do → pigxel → how-we-work → contact; 0 điều khiển nhỏ hơn 44×44; 0 chữ nhỏ hơn 16 px; màn 360×640 thấy logo, Liên hệ, EN, h1, nút chính. Giới hạn: đo bằng phông dự phòng vì đã chặn mạng (không tải được Be Vietnam Pro); chưa đo B, C, D.
  • Tính lại bằng Python: 16 cặp tương phản trong design_specs.md §8 khớp từng số. Số ký tự của title, description, og và 404 trong content.md §10 khớp từng số. Năm SVG mà phương án A dùng nặng 26.874 byte (wc -c), khớp con số 26,9 KB.
  • curl https://docs.rittruyen.com/ lúc 2026-11-13: HTML trả về có /cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js và 4 thẻ script bị đổi type thành …-text/javascript. https://tila.rittruyen.com/ trả 525 (chưa triển khai). ops/infrastructure.md:71 ghi *.rittruyen.com đang bật proxy Cloudflare.

Phát hiện

Chặn

C-01 · AC SEO không bao giờ đạt trên stg. Vị trí: prd.md:125 (AC-04 đo trên URL stg), :135 (stg phải có noindex), :136 (Lighthouse SEO ≥ 95, cấu hình AC-04), :165 (KR1: điểm < 80 thì không được phát hành). Bài is-crawlable của Lighthouse trượt khi trang có noindex, và bài này có trọng số lớn nhất trong nhóm SEO; điểm SEO trên stg sẽ dưới 95 và nhiều khả năng dưới 80 (con số chính xác CHƯA KIỂM CHỨNG, chưa chạy Lighthouse). Hậu quả: KR2 không bao giờ đạt 100%, và người làm sẽ bị đẩy tới chỗ gỡ noindex khỏi stg. Sửa: đo SEO trên bản dựng giống pro (cờ tắt noindex, phục vụ qua cùng proxy, không công khai), hoặc ghi rõ is-crawlable là bài duy nhất được phép trượt trên stg và đặt ngưỡng cho các bài còn lại. Vai sửa: ai-po; ai-ba khóa lại trong test_cases.md.

Nên sửa trước khi code

P-02 · PRD không biết trang đi qua Cloudflare. Vị trí: prd.md:104 ("qua đúng reverse proxy"), FR-P0-09 :59, AC-07 :149; ops/infrastructure.md:71. Bằng chứng: Rocket Loader đang chạy trên zone (xem mục kiểm chứng). Nếu giữ nguyên, Cloudflare sẽ chèn script của họ vào trang (trái FR-P0-09 "không script bên thứ ba"), đổi thứ tự chạy JS (lớp html.js, hiện dần, TBT), và có thể làm sai AC-04, AC-07. Email Obfuscation (viết lại mailto:, làm hỏng AC-05 khi không JS và AC-08) CHƯA KIỂM CHỨNG. Zone rittruyen.com dùng chung với trang chủ không thuộc TiLA Studio, nên tắt tính năng (kể cả bằng Configuration Rule chỉ cho tila./stg) là việc thuộc cổng CEO (§4.5, §4.6). Sửa: PRD thêm Cloudflare vào đường phân phối và môi trường đo của AC; ghi vào §9 một quyết định xin CEO; AC-07 thêm "không có /cdn-cgi/scripts/ trong HTML". Vai sửa: ai-po; ai-devops kiểm cấu hình zone (chỉ đọc).

P-03 · Hiệu ứng lặp vô hạn trái WCAG 2.2.2 (mức A, thuộc FR-P0-07). Vị trí: design_specs.md:131 (Pigxel trôi 6 s, lặp), :121 (404 nghiêng đầu); ui-test-harness.html:487, :489 (infinite). Chuyển động tự chạy quá 5 giây, đứng cạnh nội dung khác và không có nút dừng. AC-06 (prd.md:143) chỉ kiểm trường hợp bật "giảm chuyển động" nên không bắt được lỗi này. Sửa: cho hiệu ứng tự dừng trong ≤ 5 s (ví dụ chạy tối đa 2 nhịp 2,4 s) hoặc bỏ hẳn; thêm một ca vào AC-06. Vai sửa: ai-designer, ai-po.

P-04 · Nút EN/VI không giữ được mục đang xem theo cách đặc tả. Vị trí: design_specs.md:184 (nối thêm location.hash) mâu thuẫn với :133 cùng mã ở ui-test-harness.html:846 (preventDefault rồi cuộn bằng scrollIntoView, nên URL không đổi hash). Đo được: sau khi bấm "Liên hệ" ở 360 px, location.hash vẫn là chuỗi rỗng. Người xem cuộn tay hoặc bấm neo rồi đổi ngôn ngữ sẽ về đầu trang (hoặc về mục cũ), nên trượt AC-02 (prd.md:112). Bản thân harness giữ được mục là nhờ dùng curSection(), khác với đặc tả. Sửa: quy định nguồn đúng duy nhất là mục đang có aria-current (hoặc cập nhật hash bằng history.replaceState); AC-02 thêm ca "cuộn tay tới #pigxel rồi bấm EN" và ca "đã bấm #about rồi cuộn tới #contact". Vai sửa: ai-designer, ai-ba.

P-05 · Logo nhỏ hơn cỡ tối thiểu của chính bộ nhận diện. Vị trí: brand/README.md:18 (logo A rộng ≥ 160 px) so với design_specs.md:102 (cao 36, dưới 360 px cao 28) và ui-test-harness.html:438–439. Đo được: logo rộng 117 px (từ 360 px trở lên) và 91 px (320 px). Không thể vừa giữ 160 px vừa đặt đủ logo, Liên hệ, EN và menu trong 296 px ở khung 320. Sửa: ai-artist vẽ bản logo cho thanh đầu cỡ nhỏ (huy hiệu cộng chữ gọn) hoặc chốt lại cỡ tối thiểu dựa trên lần xem thử ở 91 px; ai-designer cập nhật đặc tả. Vai sửa: ai-artist, ai-designer.

P-06 · Mục "Gặp Pigxel" dùng huy hiệu chỉ có đầu. Vị trí: design_specs.md:106; company/04-thuong-hieu-linh-vat.md:28 ("không nhốt riêng cái đầu"), :91 (pigxel-mark dành cho avatar và tài liệu nội bộ); pigxel-mark.svg là đầu heo trong ô vuông bo navy, không có đuôi (đặc điểm bất biến số 4). Mục giới thiệu linh vật lại không cho thấy đủ 5 đặc điểm, trái PRD 6.4 (prd.md:90). Sửa: dùng hình toàn thân đang chạm đồng xu (bản riêng, tránh trùng hero), giữ pigxel-mark cho favicon và avatar. Vai sửa: ai-designer, ai-artist.

P-07 · content.md chưa phải nguồn đầy đủ cho chuỗi i18n. Vị trí: design_specs.md:173–174 (hai chuỗi trạng thái và alt altMark do thiết kế tự viết); content.md:132 (alt mục Pigxel vẫn tả "đuôi xoắn", không khớp hình đang dùng); content.md:11 (alt còn ghi "bản tạm"). AC-02 cho build thất bại khi thiếu khóa, nên kỹ sư sẽ phải tự chọn chép từ file nào. Sửa: đưa toàn bộ chuỗi vào content.md, chốt alt theo hình cuối cùng (sau P-06), bỏ chữ "tạm". Vai sửa: ai-copywriter.

P-08 · Hero bị ẩn chờ JS. Vị trí: design_specs.md:98 (mọi mục đều hiện dần), ui-test-harness.html:271 (hero-copy rv, hero-art rv). Phần tử LCP (h1 hoặc hình Pigxel) bắt đầu ở opacity:0 và chỉ hiện sau khi JS chạy, IntersectionObserver gọi lại và qua 480 ms chuyển tiếp. Khi cộng thêm Rocket Loader (P-02), LCP ≤ 2,5 s có rủi ro (CHƯA ĐO). Sửa: không áp .rv cho nội dung trong màn hình đầu. Vai sửa: ai-designer.

Có thể sửa trong lúc code

  • P-09 ui-test-harness.html:71–73 chỉ có khung 360/768/1440, trong khi AC-03 cần 320/360/390/768. design_specs.md:165 chỉ đo ở 360 và 1440. Người thẩm định đã đo 320 và 390 cho phương án A (đạt); B, C, D chưa đo. Vai: ai-designer.
  • P-10 prd.md:147: AC-07 dẫn FR-P0-13, mã này không tồn tại (phải là FR-P0-09). prd.md:165: KR1 có Best Practices ≥ 95 nhưng không AC nào định nghĩa chỉ số này. Vai: ai-po.
  • P-11 prd.md:77 cấm nhắc mọi thương hiệu khác, trong khi :89 bắt buộc ghi App Store và Google Play. Nên ghi ngoại lệ cho tên kênh phân phối. Vai: ai-po.
  • P-12 brand/README.md:3 yêu cầu ai-legal soát nghĩa vụ gắn nhãn nội dung do AI tạo, nhưng PRD §9 và §11 chưa có mục này. Giấy phép phông Be Vietnam Pro trước khi tự lưu trữ vẫn CHƯA KIỂM CHỨNG (design_specs.md:182). Phải đóng cả hai trước Giai đoạn 5. Vai: ai-po, ai-legal.
  • P-13 Hình 404 "đang lục túi" chưa có (design_specs.md:121, :175); alt 404 trong content.md:202 tả một hình chưa tồn tại. Đây là mục P1. Vai: ai-artist.
  • P-14 Token mở rộng chưa có ai xác nhận (design_specs.md:25). Vai: ai-artist.
  • P-15 AC-02 (prd.md:112) chỉ miễn tên Trí, Loan, Ân, trong khi trang Anh có "Trí H. Nguyễn". Cần thêm cả họ tên vào danh sách miễn. Vai: ai-ba.
  • P-16 Harness gọi 5 trạng thái theo tên riêng (Bình thường, Đang tải, Không JS, 404, Ngoại tuyến). Nên ghi bảng đối chiếu sang chuẩn Empty/Loading/Success/Error/Offline, trong đó Empty là "chế độ thông tin" và Error là 404. Vai: ai-designer.

Lưu ý cho giai đoạn 2–3 (ai-architect, ai-web, ai-devops, ai-qc)

  • L-01 · Whitelist và ngân sách JS. design_specs.md:185 ghi "JS tối đa ~2 KB, không thư viện", còn ops/roadmap-2026-q4.md:13 và CLAUDE.md §6 chọn Next.js. Bản xuất tĩnh của Next.js vẫn kèm runtime React (dung lượng CHƯA ĐO, phải đo so với trần 120 KB gzip và TBT ≤ 200 ms trên CPU giả lập chậm). Cách làm không dùng runtime nằm ngoài whitelist, nên phải qua cổng CEO. Tech spec phải ghi số đo của cả hai cách.
  • L-02 · Cloudflare (nối tiếp P-02). Access log của Caddy sẽ thấy IP của Cloudflare: cần trusted_proxies và CF-Connecting-IP (AC-09). Cache của Cloudflare có thể làm KR5 đếm thiếu lượt xem và đổi Cache-Control (AC-04). Chạy thử 20 yêu cầu/giây qua Cloudflare có thể bị chặn vì giống bot, nên ghi rõ đo ở edge hay ở origin.
  • L-03 · AC về RAM (prd.md:128). Trang Docs hiện được Caddy dùng chung phục vụ thẳng (ops/infrastructure.md:45). Nếu tila-site làm giống vậy thì không có "container trang" để đo ≤ 256 MB. Kiến trúc sư phải chọn cách chạy rồi viết lại AC cho khớp.
  • L-04 logo-a.svg dùng <text> kèm textLength. Phải đổi chữ sang đường nét trước khi phát hành (design_specs.md:183). Gradient trong các SVG nội tuyến phải có id duy nhất.
  • L-05 Có hai trang 404 theo tiền tố đường dẫn (content.md:204), nên Caddy cần định tuyến lỗi theo /en/*. x-default trỏ về /.
  • L-06 RTM phải có ca thuận và ca nghịch cho 6.9: thiếu từng trường cấu hình, và build cảnh báo khi không có email. Trang không có luồng ghi, nên không cần ca đồng thời hay idempotency.

Ghi chú cho Trợ lý CEO (không trừ điểm)

  • Email ceo-inputs.md:5 là hộp Gmail cá nhân. Hiện công khai sẽ bị thu thập để gửi spam, và persona P-B có thể kém tin hơn so với email theo tên miền. CEO đã chốt, nên chỉ nêu để CEO biết.
  • Vòng 2 chỉ cần kiểm lại C-01 và P-02 đến P-08. Nếu hồ sơ không đạt ở vòng 2 thì theo quy tắc phải trình CEO.

Vòng 2 — 2026-11-13

Hồ sơ chấm lại: prd.md v0.2, content.md v0.2, design_specs.md v0.2, ui-test-harness.html (bản sửa), brand/ (README mới, 5 bản logo A, pigxel-meet, pigxel-404, gen.py), ceo-inputs.md. Không tính là lỗi hồ sơ (theo brief): quyết định Cloudflare đang chờ CEO; RTM của ai-ba để sang giai đoạn 3; hai việc của ai-legal sẽ đóng trước giai đoạn 5.

Kết luận: ĐẠT — 91/100

Cả 16 phát hiện của vòng 1 đều đã đóng. Những điểm đo được, người thẩm định đã tự đo lại, không dựa vào báo cáo của các vai. Lần sửa không gây lỗi Chặn hay lỗi phải sửa trước khi code. Chỉ còn vài chỗ tài liệu chưa đồng bộ, sửa được trong lúc code. Trợ lý CEO có thể duyệt Gate 1 theo QĐ-015 và giao giai đoạn 2.

Bảng điểm vòng 2

# Tiêu chí V1 V2 Lý do
1 Đầy đủ của PRD 13 14/15 Đã thêm ràng buộc Cloudflare (prd.md:106–110) và FR-P1-07. Trừ 1 điểm vì §9 chưa đồng bộ (N-01)
2 Tiêu chí nghiệm thu kiểm chứng được 14 18/20 Đã sửa C-01 (:146–147, KR1 :179), AC-02 có ca cuộn tay (:121–122), AC-06 có ca 30 giây (:155), AC-07 có ca Cloudflare và Best Practices (:162–163). Trừ điểm: AC RAM còn chờ kiến trúc sư chốt (:138); ca "thấy TiLA Studio" mới đo bằng phông dự phòng (N-04)
3 Nhất quán 15 18/20 Logo, hình Pigxel, chuỗi và số liệu đã khớp. Còn 3 chỗ chưa cập nhật theo lần sửa (N-01, N-02, N-03)
4 Khả thi trên 1 CPU ARM, ngân sách hiệu năng 11 13/15 Hero không còn chờ JS, SVG 44.920 B. Còn mở: quyết định Cloudflare; runtime Next.js so với "JS ~2 KB" (L-01)
5 Khả năng tiếp cận và SEO 12 14/15 Không còn hiệu ứng lặp vô hạn (đã đo), tương phản giao diện sáng đạt. WCAG 1.4.12 vẫn chưa kiểm (design_specs.md:174)
6 Tuân thủ nội quy 13 14/15 Đã bỏ email example.com và ảnh dùng tạm, phông đã có giấy phép. Còn một dòng alt dự phòng của bản cũ (N-02)
Tổng 78 91/100

Đối chiếu phát hiện vòng 1

Mã Trạng thái Bằng chứng
C-01 Đóng AC-05 chỉ cho phép đúng bài is-crawlable trượt trên stg; SEO ≥ 95 đo lại trên pro (prd.md:146–147); KR1 sửa theo (:179)
P-02 Đóng (về hồ sơ) §7 nêu Cloudflare, bằng chứng, nơi đo, cổng CEO; AC-07 tìm /cdn-cgi/scripts/ (:162); §9 việc 5 có A/B/C. Quyết định vẫn chờ CEO
P-03 Đóng, đã đo document.getAnimations() trên 4 phương án × {trang, 404, khung xương}: 0 hiệu ứng vô hạn; dài nhất 4.800 ms (hero, 404), khung xương 4.200 ms
P-04 Đóng, đã đo href nút ngôn ngữ ở vi/en × 320/360/1440: cuộn tay tới từng mục cho ra …#<mục đó>; tới đáy trang cho ra #contact; bấm #about rồi cuộn tới #contact cho ra #contact; ở đầu trang cho ra /en/ hoặc /
P-05 Đóng, đã đo Logo rút gọn 74×32 (320 px) và 83×36 (360–390 px), logo đầy đủ 160×45 (từ 768 px), đúng quy tắc cỡ ở brand/README.md:34; chữ đã chuyển thành đường nét
P-06 Đóng, đã xem ảnh chụp #pigxel dùng #s-meet ở mọi cấu hình; #s-mark không còn xuất hiện; hình toàn thân, có đuôi, ôm đồng xu
P-07 Đóng content.md §12 là nguồn duy nhất; alt pigxel-meet ở :133 khớp hình; không còn chuỗi thiết kế tự viết
P-08 Đóng, đã đo #home không có .rv; h1 có opacity 1 ngay khi dựng trang
P-09 · P-16 Đóng Harness có khung 320 và 390 (ui-test-harness.html:73–77); bảng 5 trạng thái ở design_specs.md:126–133
P-10 · P-11 · P-12 · P-15 Đóng AC-07 dẫn đúng FR (prd.md:159); ngoại lệ App Store/Google Play (:79); FR-P1-07 và việc đóng trước GĐ 5 (:69, :200); có miễn "Trí H. Nguyễn" (:120)
P-13 · P-14 Đóng Trang 404 dùng pigxel-404 (đã xem ảnh chụp); token mở rộng được xác nhận kèm giới hạn dùng (brand/README.md:40)

Đo lại phương án A: Playwright Chromium, 48 cấu hình (vi/en × có/không email × sáng/tối × 320/360/390/768/1024/1440 px). Kết quả: 0 cuộn ngang (kể cả sau khi cuộn hết trang); đúng 1 h1 và 5 h2, đúng thứ tự 6 mục; 0 điều khiển nhỏ hơn 44 px; 0 chữ nhỏ hơn 16 px; 0 chữ có tương phản dưới ngưỡng so với nền đặc gần nhất; màn đầu thấy Liên hệ, EN/VI, h1, nút chính và chữ "TiLA Studio"; mailto:[email protected] đúng ở cả hai ngôn ngữ. Dung lượng SVG trang A tính lại bằng wc -c đúng 44.920 B. Giới hạn: phông dự phòng (đã chặn mạng); B, C, D chỉ đo phần hiệu ứng.

Phát hiện mới (chỉ có mức "Có thể sửa trong lúc code")

  • N-01 prd.md:191, 197 vẫn ghi liên kết Docs (việc 6) là "chờ CEO", trong khi ceo-inputs.md:18 và content.md:238 đã chốt là có. prd.md:200 và FR-P1-07 vẫn ghi giấy phép phông CHƯA KIỂM CHỨNG, trong khi brand/README.md:29 đã đọc OFL.txt. Nên đổi thành "đã có bằng chứng, chờ ai-legal ký". Vai: ai-po.
  • N-02 content.md:203–204 còn dòng "Alt khi tạm dùng hình hero" và ghi chú "chỉ dùng khi hình này đã có", dù pigxel-404.svg đã có. Xóa để kỹ sư khỏi chọn nhầm. Vai: ai-copywriter.
  • N-03 design_specs.md:178 vẫn ghi "content.md mục 5 cần đồng bộ", trong khi việc này đã xong ở v0.2. Vai: ai-designer.
  • N-04 Ở dưới 768 px, logo chỉ có chữ "TiLA". AC-03 (prd.md:130) đạt được là nhờ câu dẫn hero có chữ "TiLA Studio" nằm trong màn đầu; việc này mới đo bằng phông dự phòng. ai-qc phải đo lại với Be Vietnam Pro tự lưu trữ; nếu câu dẫn rơi khỏi màn đầu thì AC-03 trượt. Vai: ai-qc, ai-designer.

Lưu ý cho giai đoạn 2–3 (cập nhật)

  • L-01 (còn nguyên): design_specs.md:190 vẫn ghi "JS ~2 KB", trong khi whitelist dùng Next.js. Tech spec phải đo runtime của bản xuất tĩnh so với trần 120 KB gzip và TBT ≤ 200 ms; nếu chọn cách không có runtime thì phải qua cổng CEO.
  • L-02: AC-07 về Cloudflare sẽ trượt cho tới khi CEO chọn ở prd.md §9 việc 5. Không để chuyện này chặn code ở giai đoạn 3, nhưng nó chặn kết thúc giai đoạn 4. Access log cần trusted_proxies và CF-Connecting-IP (AC-09). Phép thử tải đo thẳng vào origin bằng curl --resolve, vì chứng chỉ Caddy hợp lệ cho đúng tên miền.
  • L-03: Kiến trúc sư chốt cách chạy (container riêng hay Caddy phục vụ tĩnh) rồi viết lại câu RAM của AC-04 (prd.md:138).
  • L-04: Mỗi trang nhúng 4 logo (rút gọn/đầy đủ × sáng/tối, khoảng 20 KB SVG thô) và đổi bằng media query. Dùng <symbol> một lần để khỏi lặp gradient id. Nếu muốn giảm HTML thì cân nhắc file SVG ngoài có hash trong tên.
  • L-05: Hai trang 404 theo tiền tố /en/* (Caddy handle_errors); 404 có noindex. x-default trỏ về /.
  • L-06: RTM: mỗi AC P0 có ca thuận và ít nhất 2 ca nghịch. Riêng 6.9: thiếu từng trường cấu hình, và build cảnh báo khi không có email. Trang không có luồng ghi nên không cần ca đồng thời.
  • L-07: WCAG 1.4.12 (giãn chữ) và VoiceOver chưa ai chạy; đưa vào kế hoạch của ai-qa ở giai đoạn 4.