AI-CLO PTITHCM V12.2 — Assessment Stability

V12.2 ổn định lại toàn bộ khu vực Đánh giá theo nguyên tắc một owner frontend duy nhất: js/assessment.js.

Kiến trúc frontend

Trang Đánh giá không còn nạp các lớp vá/adapter cũ như final-workflow.js, unified-builder.js, unified-list-adapter.js, create-wizard.js, assessment-unified-v12.js, assessment-subpages-v12.js, assessment-v12.1*.js, attempt-autosave.js, detail-enhancements.js, assessment-window.js, max-attempts-unlocked.js hay subpage-bootstrap.js.

Các file cũ vẫn được giữ trong repo để đối chiếu lịch sử nhưng không tham gia runtime Đánh giá V12.2.

js/exams/final-export.js chỉ được tải khi giảng viên thực sự xuất hồ sơ đề cuối kỳ; file này chỉ làm nhiệm vụ xuất BM06/BM07/BM08/TeX/Excel/ZIP và không điều khiển giao diện Đánh giá.

Các lỗi P1/P2 đã xử lý

Cập nhật Supabase bắt buộc

Sau khi frontend V12.2 được deploy, chạy trong Supabase SQL Editor:

supabase/migrations/assessment-v12.2-migration.sql

Migration an toàn khi chạy lại và tạo/chuẩn hóa contract V12.2, gồm:

Frontend V12.2 sẽ chủ động báo cần migration nếu backend chưa trả phiên bản 12.2.

Edge Function cần redeploy

Redeploy function:

supabase/functions/analyze-assessment/index.ts

Bản V12.2 Step 9 sửa tổng hợp GPA cho highest / latest / average, giữ đúng phạm vi counts_toward_grade và tránh việc một bài có nhiều lượt làm bị tính trọng số lớn hơn bài khác.

Các Edge Function khác không cần thay đổi riêng cho Step 9 nếu đang dùng đúng bản hiện tại của dự án.

Smoke test sau deploy

  1. Tạo bài kiểm tra → chỉ có một nút tạo → lưu bản nháp.
  2. Phát hành → trở về trang Chi tiết → Tạm dừng → Mở lại.
  3. Khi tạm dừng: SV chưa làm không bắt đầu được; SV đang làm vẫn resume được; SV đã nộp vẫn mở được kết quả cũ.
  4. Chỉnh Thông tin: Tính CLO và AI feedback độc lập.
  5. Chỉnh Cấu trúc trước khi có lượt làm → pool + bộ mẫu đổi cùng lúc.
  6. Đổi một câu / Gemini sinh câu → Làm thử và bài SV dùng đúng snapshot mới.
  7. Tạo ba bài có các chính sách highest, latest, average; với bài average tạo nhiều lượt và xác nhận GPA chỉ tính một trọng số cho mỗi bài.
  8. Kiểm AI lớp và AI sinh viên cho cùng dữ liệu ở bước 7.
  9. Tạm thời thử đưa câu secure_exam vào bài trực tuyến bằng client tùy biến → backend phải từ chối.
  10. Tạo đề cuối kỳ, lưu bản nháp khi chưa rút đủ câu → phải lưu được.
  11. Sinh đề cuối kỳ với 2 và 6 mã đề; kiểm đúng số mã, chỉ lấy ngân hàng bảo mật.
  12. Trang Chi tiết đề cuối kỳ phải hiện tên Mục + mã CLO, không hiện UUID.
  13. Xuất BM06/BM07/BM08/TeX/Excel/ZIP và kiểm mỗi mã đề có đúng số câu, đủ A–D, đáp án/CLO đúng snapshot đã lưu.