AI·CLO APMaths — KIẾN TRÚC HỆ THỐNG

Tài liệu mô tả kiến trúc hiện hành sau đợt đổi nhận diện APMaths ngày 16/09/2026. Mục tiêu chính là xác định đúng owner trước khi sửa và tránh tạo thêm lớp render/compatibility trùng nhau.

1. Vị trí trong APMaths

AI·CLO là một module đồng hạng với các khu vực khác của website:

apmaths.github.io/
├─ ai-clo/
├─ tools/
├─ courses/
├─ knowledge/
└─ ...

Các landing/public page PTITHCM cũ đã được loại bỏ. index.html của AI·CLO dùng trực tiếp layout/theme APMaths.

2. Sơ đồ tổng thể

Browser / GitHub Pages
        │
        ├─ APMaths theme + AI·CLO frontend
        │
        ├─ Supabase Auth / PostgreSQL / Storage / RPC
        │
        └─ Supabase Edge Functions
                  │
                  └─ Gemini API khi người dùng chủ động yêu cầu AI

Frontend không chứa secret. Supabase/RLS là lớp kiểm soát dữ liệu chính; không coi việc ẩn nút trên giao diện là cơ chế phân quyền.

3. Cấu trúc frontend

ai-clo/
├─ index.html
├─ app.html
├─ css/
│  ├─ app.css
│  ├─ app-brand.css
│  ├─ apmaths-brand.css
│  ├─ ai-chat.css
│  ├─ courses/
│  ├─ exams/
│  ├─ questions/
│  ├─ results/
│  ├─ students/
│  ├─ system/
│  └─ ui/
├─ js/
│  ├─ app.js
│  ├─ ai-chat.js
│  ├─ core/
│  ├─ courses/
│  ├─ questions/
│  ├─ results/
│  ├─ system/
│  └─ ui/
├─ data/
├─ practice/
└─ supabase/

Branding owner

4. Render và điều hướng

Global render() đã được nhiều module legacy wrap. Vì vậy:

Các lớp hiện hữu cần tôn trọng:

5. Ngân hàng câu hỏi

Trắc nghiệm

Owner chính là chuỗi module js/questions/ hiện hữu, đặc biệt bank.js, state.js, workspace.js, list-performance.js và các adapter UI.

Tự luận

Nguyên tắc: vào lần đầu thì tải, chuyển tab thì dùng dữ liệu/DOM đã có; tạo/sửa/xóa mới invalidate đúng phần.

Mô hình tự luận

Essay question
  └─ Parts (tùy chọn)
       └─ Rubric items
            ├─ criterion
            ├─ points
            └─ một CLO chính

6. Assessment và kết quả

Các module Assessment nằm trong js/assessment*, js/exams/, css/exams/. Kết quả/CLO nằm trong js/results/, css/results/ và các module liên quan.

Khi sửa Assessment:

7. AI

AI chỉ được gọi khi người dùng chủ động yêu cầu, trừ nơi có quyết định riêng rõ ràng.

Knowledge hiện hành của chat: data/ai-clo-knowledge.json.

8. Supabase

supabase/
├─ migrations/
├─ schema/
├─ policies/
├─ functions/
└─ docs/

9. Quy tắc trước khi sửa

  1. Xác định đúng owner của behavior/CSS.
  2. Kiểm tra wrapper/render/observer hiện có trước khi thêm cơ chế mới.
  3. Không tạo cache thứ hai nếu owner đã có cache phù hợp.
  4. Không làm full render khi chỉ cần cập nhật một pane/list.
  5. Giữ đỏ cho destructive/error; branding dùng xanh APMaths.
  6. Trước thay đổi runtime/backend lớn: tạo backup branch.
  7. Sau thay đổi: rà link, cache-busting asset, browser console và Supabase function liên quan.

10. Lịch sử

Các file trong docs/releases/ là lịch sử của giai đoạn AI-CLO PTITHCM trước khi chuyển thành AI·CLO APMaths. Không đổi tên/branding trong release note cũ nếu việc đó làm sai bối cảnh lịch sử.