AI-CLO PTITHCM — THỐNG NHẤT KỸ THUẬT CHUNG

Tài liệu này ghi các quy tắc bắt buộc khi tiếp tục phát triển AI-CLO PTITHCM. Bản đồ kiến trúc xem tại ARCHITECTURE-AI-CLO.md; các quyết định UI/nghiệp vụ ưu tiên xem tại PROJECT-NOTES-AI-CLO.md.

Cập nhật: 08/09/2026 — checkpoint V12.6.43

1. Nguồn mã và môi trường chạy

Frontend

Supabase

Supabase là backend đang chạy thực tế:

GitHub lưu source backend để đọc/chỉnh; Supabase là nơi backend chạy thực tế.

2. Edge Function — quy tắc bắt buộc

3. Database / SQL / migration

Các migration Live hiện hành:

supabase/migrations/assessment-v12.6.34-live-monitoring.sql
supabase/migrations/assessment-v12.6.35-ios-live-sync.sql

Hai migration này không đổi assessment_schema_version.

4. RLS và bảo mật

5. Kiến trúc frontend chung — single owner

Ví dụ đã chốt ở Question Bank:

Bản đồ thư mục và owner xem ARCHITECTURE-AI-CLO.md.

6. Assessment — single-owner runtime

Cấu trúc chuẩn:

js/
├─ assessment.js
└─ assessment/
   ├─ common.js
   ├─ online-lifecycle.js
   ├─ online-builder.js
   ├─ final-exam.js
   ├─ student-attempt.js
   ├─ live-monitor.js
   └─ results.js

Module hỗ trợ:

js/assessment/attempt-monitor.js
js/assessment/export-dropdown.js
js/exams/online-export.js

Quy tắc:

7. Persistence / giữ màn hình

Hai lớp dùng chung:

js/ui/subpage-state.js
js/ui/form-persistence.js

subpage-state.js

Phụ trách:

form-persistence.js

Phụ trách:

Contract browser-tab bắt buộc

Đổi sang browser tab khác rồi quay lại không phải navigation. Nếu DOM hiện tại còn sống thì phải giữ nguyên, không render lại.

Do đó:

Contract sidebar bắt buộc

Click sidebar là navigation chủ động.

Quy tắc chung

8. Student Attempt

Hết giờ / stale open attempt

Local attempt recovery không được biến thành navigation persistence thứ ba.

9. AI-CLO | LIVE / monitoring

UI contract

Data contract

Teacher được xem:

Teacher không được xem A/B/C/D đang chọn.

Backend contract

assessment-v12.6.34-live-monitoring.sql tạo:

Runtime access cho telemetry phải qua RPC có permission guard; không mở table rộng cho authenticated.

attempt_live_state.attempt_id và attempt_monitor_events.attempt_id dùng ON DELETE CASCADE tới exam_attempts. Vì vậy contract hiện tại là:

Xóa một lượt làm = xóa cả Live state và monitor history của lượt đó.

iOS/mobile sync

Safari/iOS có thể freeze JS/network rất nhanh khi app đi nền. Do đó:

Fullscreen limitation

10. CSS ownership

Core/UI

Domain

Quy tắc CSS

11. UI interaction contract

12. Question Bank

Tách rõ:

Quy tắc:

Provenance label

Hover preview

Bulk import / Excel mẫu

Hai mode tạo câu:

Tạo một câu | Tải hàng loạt

Workbook mẫu hiện dùng:

Cau_hoi
Vi_du
Chuong_Chu_de
CLO
Danh_muc
Huong_dan

Importer phải ưu tiên sheet Cau_hoi. Dòng ví dụ phải nằm riêng ở Vi_du để tránh import nhầm.

Cột canonical:

Chương | Chủ đề | CLO | Nội dung | A | B | C | D | Đáp án | Lời giải | Ngân hàng | Trạng thái

Không thêm cột Mã câu nếu hệ thống vẫn tự sinh mã.

13. Assessment product rules

Framework chung:

  1. Mục 1 — Thông tin.
  2. Mục 2 — Cấu trúc/Ma trận.
  3. Mục 3 — Danh sách câu đã rút.
  4. Mục 4 — Xuất với loại bài phù hợp.

Quy tắc quan trọng:

14. CLO / kết quả

15. AI / Gemini

16. Excel / Office export

17. Math / LaTeX

18. Hiệu năng

19. Git / quy trình thay đổi

Trước thay đổi có ý nghĩa:

  1. Đọc PROJECT-NOTES-AI-CLO.md.
  2. Đọc ARCHITECTURE-AI-CLO.md và file owner liên quan.
  3. Đọc code mới nhất trên main.
  4. Tạo backup branch.
  5. Làm trên work branch khi thay đổi có rủi ro/ý nghĩa lớn.
  6. So diff.
  7. Smoke/static-check phù hợp.
  8. Fast-forward main khi sạch.
  9. Kiểm GitHub Pages.
  10. Ghi rõ tác động Supabase.

Không force push trừ trường hợp thật sự cần và đã hiểu hậu quả.

Các file probe/noop/sentinel tạo nhầm phải được xóa ngay; không để file rác tồn tại trong tree.

20. Tài liệu — nguồn ưu tiên

Thứ tự đọc:

  1. PROJECT-NOTES-AI-CLO.md — quyết định kỹ thuật/UI/nghiệp vụ ưu tiên.
  2. ARCHITECTURE-AI-CLO.md — bản đồ kiến trúc hiện hành.
  3. TECHNICAL-AGREEMENTS.md — quy tắc bắt buộc.
  4. PROJECT-STATUS-2026-09-08.md — trạng thái hiện tại.
  5. PROJECT-PROGRESS-2026-09-08.md — tiến trình chi tiết.
  6. Code main.

Nếu code và tài liệu xung đột, xác minh code main, xác định tài liệu lỗi thời rồi cập nhật lại tài liệu.


Checkpoint quy tắc này tương ứng V12.6.43. Các điểm bắt buộc mới của 08/09/2026 là: browser tab switch phải đóng băng DOM đang sống; sidebar click về trang mẹ; LIVE không lộ A/B/C/D và không được coi là secure browser; iOS monitor phải sync/de-duplicate incident; Question Bank hover chỉ có một owner; provenance gemini ở backend hiển thị AI hỗ trợ ở UI.