# Review tổng — Core platform OpenGate (controlplane + ws_suns)

> 07/7/2026 · Bản HTML: [core-review.html](core-review.html) · Đọc trực tiếp code 2 repo (provisioner, runtime-core, permissionEngine, ogapp CLI, module-sdk, HUONG_DAN)
> Khung tham chiếu: Odoo (module system, record rules), Keycloak (SSO/claims), npm/Docker registry (chuỗi cung ứng), Flyway/Knex (migrations), Casbin/OPA (policy engine), Atlassian/Shopify (marketplace/licensing).
> **User sẵn sàng sửa hiện trạng** — khuyến nghị dưới đây xếp theo ưu tiên thực dụng cho lộ trình GĐ1 → trường thứ 2.

---

## 1. Bảng tổng hợp 8 core module

| Core | Đánh giá | Điểm mạnh | Điểm phải sửa |
|---|---|---|---|
| [cp-identity](cp-identity-2026-07-07.md) | ✅ nền tốt · ⚠ | SSO authorization-code chuẩn, cô lập session/WS | permissionCache rỗng sau restart → 403; PAT không có quyền |
| [cp-workspace](cp-workspace-2026-07-07.md) | ✅ vững 1 host · ⚠ | Provision DB-per-WS sạch, clean script an toàn | **Chưa có backup/restore per-WS DB**; gắn chặt 1 host |
| [cp-rbac](cp-rbac-2026-07-07.md) | ⚠ | Catalog 4 cấp khớp manifest; sync origin cp/local | **Hai nguồn sự thật** (CP-cache ∪ engine); data scope chưa nối |
| [cp-store](cp-store-2026-07-07.md) | ⚠ | Hook verifyLicense chừa đúng chỗ; tải qua CP có Bearer | CP-03 chưa build — license/entitlement chưa enforce |
| [rt-host](rt-host-2026-07-07.md) | ✅ ledger tốt · ⚠ | Ledger + checksum + enable/disable nóng + fail-fast lệch disk | **Migration không tracking**; khối auto-seed "tạm thời" còn sót |
| [rt-authz](rt-authz-2026-07-07.md) | ✅ thiết kế tốt · ⚠ | Grants deny-wins/inherits/rule-predicate, resolve thuần test được | Guard + row-filter **chưa gắn route nào** (chờ RT-16) |
| [sdk](sdk-2026-07-07.md) | ✅ DX tốt · ⚠ | Vòng dev→build→publish→install trọn; validator manifest có test | `create` hỏng (thiếu template); manifest chưa có fields/scopeVars |
| [registry](registry-2026-07-07.md) | ❌ | Semantics npm tối giản, đủ nội bộ | **Upload/DELETE không xác thực, version không immutable, không chữ ký** |

## 1b. Built-in module của WS (có sẵn lúc boot, không cài qua .ogapp)

7 module built-in: `iam`, `org`, `hrm`, `crm`, `workflow`, `workplace`, `system` — đủ để 1 WS hoạt động độc lập ngay khi provision.

| Built-in | Đánh giá | Ghi chú chính |
|---|---|---|
| [iam](iam-builtin-2026-07-08.md) | ✅ · ⚠ | User cục bộ + PAT + permissionAdmin; roles cũ song song rt_role (chờ RT-16) |
| [org](org-builtin-2026-07-08.md) | ✅ | **Trùng WS0**: phòng ban (cây) + chức danh có sẵn → seed thẳng, không tạo danh mục mới |
| [hrm](hrm-builtin-2026-07-08.md) | ✅ | 18 model (NV, HĐ, chấm công, lương, tuyển dụng, KPI…) — **thay module kế hoạch `hr` + `payroll`** |
| [crm](crm-builtin-2026-07-08.md) | ✅ | Lead/opportunity/customer — **thay module kế hoạch `crm` v1.5**, chỉ thêm convert + commission |
| [workflow](workflow-builtin-2026-07-08.md) | ✅ tiềm năng | Engine quy trình + ticket + connector — MVP chưa dùng; chỗ đặt adapter DAT/HĐĐT sau này |
| [workplace](workplace-builtin-2026-07-08.md) | ◻ | Mạng nội bộ — **disable ở WS Vĩnh An** (giảm bề mặt) |
| [system](system-builtin-2026-07-08.md) | ✅ pattern hay | Manifest-only đưa quyền hạ tầng vào taxonomy — nhân rộng cho audit/backup/notify |

### 🔴 Phát hiện lớn: chồng lấn built-in ↔ sơ đồ module kế hoạch

Sơ đồ tổng thể (v1.5) đề xuất scaffold `hr`, `payroll`, `crm` — **cả 3 đã có sẵn dạng built-in** (hrm phủ rộng hơn spec). Quyết định đề xuất:
- **Bỏ scaffold `hr`/`payroll`/`crm` mới** → dùng built-in, chỉ thêm phần đặc thù mỏng: mapping GV↔Employee, feature timesheet-DAT đổ giờ dạy vào lương, convert lead→hồ sơ, hoa hồng CTV.
- **`org` dùng ngay từ MVP** làm nguồn phòng ban/chức danh (WS0) — nhập danh sách Vĩnh An (việc #3, #4) vào org/hrm khi có.
- v1.5 trong sơ đồ giảm từ 7 module mới → **4 module mới** (lms, finance, fleet, portal) + 3 phần mở rộng built-in. Đã cập nhật đối chiếu ở [sơ đồ tổng thể](../so-do-ws-module-feature-2026-07-06.md) §5.

## 2. Ưu tiên sửa (P1 → P5)

| # | Việc | Vì sao | Cỡ | Tham chiếu |
|---|---|---|---|---|
| **P1** | **Khóa registry**: token cho POST/DELETE + version immutable + host verify checksum trước giải nén | Chuỗi cung ứng của mọi workspace khách; hiện ai biết URL là thay được ruột gói | Nhỏ (2–3 ngày) | npm/Docker registry |
| **P2** | **Migration tracking per module** (`module_migrations`: key, file, checksum, applied_at) | GĐ1 sắp ALTER schema (student 1.2); idempotent-convention không đủ cho upgrade | Nhỏ (2–3 ngày) | Flyway/Knex, Odoo upgrade |
| **P3** | **Backup/restore per-workspace DB** (pg_dump lịch + test restore) | Dữ liệu hồ sơ là căn cứ pháp lý, thanh tra được — bắt buộc trước go-live Vĩnh An | Nhỏ | PostgreSQL chuẩn vận hành |
| **P4** | **Hợp nhất authz về engine** (RT-16) + data scope theo [plan](../giai-doan-1-mvp/plan-data-scope-2026-07-06.md) + fix permissionCache/PAT | Một nguồn sự thật quyền; mở khóa data scope cho màn hình hồ sơ | Vừa (~3 MM, đã có plan) | Casbin/OPA, Keycloak claims |
| **P5** | **Template `opengate-module create`** + lệnh lint convention | GĐ1 scaffold 3 module mới (tuition/report/notify) — mỗi lần scaffold tay là một lần lệch chuẩn | Nhỏ | Shopify CLI / create-vite |

**Sau trường thứ 2 (chưa cần ngay):** CP-03 license enforcement + heartbeat (Atlassian model, thiết kế sẵn usage-based theo đầu học viên) · ký gói sigstore · provisioner dạng reconcile-loop (K8s operator) · single-logout lan truyền.

**Vệ sinh nhanh (nhặt luôn):** gỡ khối auto-run seeds "TẠM THỜI" trong runtimeCore.js (quá hạn ghi chú 03/7) · thêm health-check per-module sau mount.

## 3. Điểm khớp với yêu cầu nghiệp vụ trường lái

- **Audit log chung**: `DEFAULT_CORE_TABLES` đã giữ chỗ `audit_logs` nhưng chưa có implementation — MVP dùng `student_ho_so_lichsu` (đã chốt); audit platform là hạng mục riêng sau MVP.
- **Offline/mạng kém** (nguyên tắc roadmap): chưa có gì ở core — chấp nhận được cho MVP (văn phòng), phải giải khi làm điểm danh sân bãi/app (v1.5).
- **Đa cơ sở (`ma_csdt`)**: đúng thiết kế — thuộc tính trong WS, không phải tenant; core không cần đổi.

## 4. Quan hệ module toàn hệ
Xem [quan-he-module-2026-07-07.md](../quan-he-module-2026-07-07.md) (bản HTML: [quan-he-module.html](../quan-he-module.html)) — bản đồ tham chiếu domain ↔ built-in ↔ core sau khi chốt dùng built-in.
