GPT Review Round 1 — Điều 24 Luật Nhãn v1.0 (2026-03-15)
GPT Review Round 1 — Điều 24: Luật Nhãn v1.0
Ngày: 2026-03-15 Nguồn: Incomex Hội đồng AI (GPT) Phạm vi: Phản biện kiến trúc, KHÔNG sửa luật gốc
Đã đọc
knowledge/dev/architecture/label-law.mdknowledge/dev/architecture/index.md(Điều 24 tóm tắt qua search)knowledge/dev/architecture/composition-level-law.mdknowledge/dev/architecture/layer3-information-law.mdknowledge/dev/ssot/operating-rules.md
Kết luận tổng quát
🟢 Đồng ý hướng đi tổng thể. Luật Nhãn đi đúng hướng hơn hẳn tình trạng hiện tại vì nó giải quyết đúng gốc: chuẩn hoá vocabulary, đưa nhãn về 1 SSOT, và biến “Cùng nhóm” thành quan hệ tính được từ dữ liệu thay vì text tự do.
Tuy nhiên để triển khai an toàn và đơn giản lâu dài, tôi thấy có 3 điểm cần sửa và 4 điểm nên cân nhắc.
1. Thiết kế 5 chiều có đủ không?
🟢 Đồng ý phần lớn
5 chiều hiện tại là đủ để khởi động:
- Chuyên môn
- Vai trò
- Hành động
- Phạm vi
- Giai đoạn
Bộ này bao phủ được nhu cầu hiện tại của hệ thống kiến trúc + registry + DOT.
🟡 Nên cân nhắc
Thiếu duy nhất một chiều có thể business sẽ sớm cần là “Đối tượng phục vụ / audience” hoặc “đối tượng tác động chính”. Ví dụ:
- công cụ phục vụ AI agent hay admin hay user cuối?
- workflow phục vụ nội bộ hay khách hàng?
Tôi không đề nghị thêm ngay ở v1.0 vì sẽ làm hệ phình ra quá sớm. Nhưng nên ghi rõ trong luật: chiều thứ 6 có thể mở sau, không phá schema.
Kết luận câu 1
- Hiện tại: đủ để bắt đầu
- Dài hạn: có thể cần thêm 1 chiều “audience/target actor”
2. 3 tầng cha-con-cháu cho chiều Chuyên môn có quá phức tạp không?
🟢 Đồng ý
Không quá phức tạp. Với mục tiêu ~1200 nhãn business thì 3 tầng là mức hợp lý nhất.
Lý do
- 1 tầng phẳng: chắc chắn rối.
- 2 tầng: đủ cho kỹ thuật hiện tại, nhưng sẽ sớm vỡ khi business mở rộng.
- 3 tầng: đủ sâu để scale, vẫn còn dễ hiểu với Tree View Directus.
🔴 Cần sửa
Không nên để depth là field người dùng/agent tự điền logic nghiệp vụ. depth nên là derived field hoặc ít nhất bị ràng buộc bằng CHECK/trigger theo parent_id.
Nếu không, rất dễ có dữ liệu:
- parent_id trỏ đúng nhưng depth sai
- hoặc depth=2 gắn thẳng dưới root
Đề xuất
- Giữ self-ref 3 tầng như hiện tại
- Thêm rule cứng:
- root:
parent_id IS NULL, depth=0 - con: parent.depth=0, depth=1
- cháu: parent.depth=1, depth=2
- cấm depth>2 ở v1.0
- root:
3. Schema 5 collections — có thừa/thiếu gì?
taxonomy_facets
🟢 Đồng ý.
taxonomy
🟢 Đồng ý.
entity_labels
🟢 Đồng ý, nhưng nên thêm cột facet_id hoặc enforce gián tiếp để tối ưu conflict check.
Hiện có thể join qua taxonomy, vẫn đúng. Không bắt buộc thêm cột nếu muốn tối giản.
label_rules
🟢 Đồng ý.
taxonomy_matrix
🟡 Nên cân nhắc mạnh
Tôi nghiêng về GIỮ riêng taxonomy_matrix, không merge vào taxonomy_facets.
Lý do
taxonomy_matrix là quan hệ giữa:
- chiều (facet)
- lớp cấu tạo (composition_level)
- requirement
Đây là dữ liệu 2 chiều độc lập, không phải thuộc tính của facet. Merge vào taxonomy_facets sẽ làm facet phình thành JSON hoặc nhiều cột cứng, khó query và khó enforce.
Kết luận câu 3
- Không thừa collection nào rõ ràng
taxonomy_matrixnên giữ riêng- Điểm thiếu duy nhất: ràng buộc mạnh hơn cho cây
taxonomyvà xung đột gán nhãn
4. Quy tắc gán tự động — có lỗ hổng nào?
🟢 Đồng ý hướng 3 tầng
collection → keyword → AI đề xuất là đúng.
🔴 Cần sửa 1: xung đột cùng chiều chưa được chốt luật đủ rõ
Hiện tài liệu nói cardinality theo chiều, nhưng chưa khóa rõ khi rule đụng nhau:
- chiều
single: match 2 rules cùng chiều thì sao? - collection rule + keyword rule cùng chiều thì merge hay override?
Đề xuất luật cứng
- Nếu facet là
single:- lấy rule priority thấp nhất (ưu tiên cao nhất)
- nếu đồng priority mà khác result → ghi
system_issuesđể user duyệt, KHÔNG auto chọn bừa
- Nếu facet là
multiple:- gộp tất cả labels hợp lệ
- nhưng cấm gán label cha + label con cùng một nhánh trong cùng 1 lần auto nếu không có chủ ý
🔴 Cần sửa 2: pattern trên tên + mô tả chưa đủ tin cậy nếu không có boundary
Regex kiểu data, flow, check rất dễ match quá rộng.
Đề xuất
- Ưu tiên rule theo collection trước
- keyword rule phải có review coverage report trước khi bật active
- thêm cột thống kê cho rule:
match_count,last_matched_athoặc ít nhất DOT report phải show rule nào match bao nhiêu entity
🟡 Nên cân nhắc
Nên coi rule theo relation là phase 2. V1 chỉ cần collection + keyword là đủ.
5. Label của Label — quản lý đã đủ chưa?
🟢 Đồng ý phần lớn
Ý tưởng dùng self-ref + recursive CTE là đúng.
🔴 Cần sửa
Hiện còn thiếu 3 ràng buộc chống dữ liệu bẩn:
- Cycle prohibition: label không được làm cha của chính nó qua vòng lặp
- Same-facet rule: parent và child phải cùng
facet_id - Depth boundary: cấm quá 3 tầng ở v1.0
Nếu thiếu 3 cái này, tree sẽ hỏng rất nhanh dù CTE vẫn chạy.
Kết luận câu 5
- Hướng quản lý label của label: đúng
- Ràng buộc dữ liệu cây: chưa đủ chặt
6. Migration từ 7 dropdown hiện có — risk gì?
🟡 Nên cân nhắc
Backward compatibility về tinh thần là ổn, nhưng migration có 3 rủi ro:
-
Alias mapping risk
quản_lý_aivsai_management- nếu không có bảng map cũ→mới, sẽ mất lịch sử nghĩa
-
Dual-write / dual-read risk
- giai đoạn chuyển tiếp nếu vừa dropdown cũ vừa taxonomy mới mà không chốt nguồn sự thật tạm thời, dữ liệu sẽ lệch
-
Over-migration risk
- không phải mọi dropdown cũ đều cần migrate 1:1 thành facet label
- có cái là metadata nội bộ, không nên ép thành taxonomy label
Đề xuất
- migration theo từng nhóm field
- mỗi field cũ phải có quyết định rõ:
- bỏ hẳn
- map sang label nào
- hay giữ làm metadata riêng
7. So với SKOS / Kubernetes labels / Jira — thiếu gì?
🟢 Đồng ý
Giải pháp hiện tại đã học đúng tinh thần ngành:
- SKOS: broader/narrower
- Kubernetes: controlled vocabulary + policy
- Jira: grouping thực dụng
🟡 Thiếu 3 thứ nhỏ nhưng quan trọng
-
Preferred label / alias / deprecated label
- SKOS rất mạnh ở chỗ này
- hiện taxonomy mới có
name,name_en, chưa có alias/deprecated replacement rõ ràng
-
Conflict policy rõ ràng
- K8s mạnh ở enforcement
- luật hiện còn mềm ở chỗ collision giữa rules cùng chiều
-
Canonical replacement path
- khi nhãn bị deprecated, entity đang dùng nhãn đó sẽ chuyển sang nhãn nào?
- nên liên thông với Luật Chống Trùng
Đề xuất tối giản
Không cần framework ngoài. Chỉ cần thêm vào taxonomy:
canonical_label_codenullable hoặcreplaced_by- alias table thì chưa cần ngay; có thể phase 2
Phán quyết theo mức độ
🔴 Cần sửa
- Chốt luật conflict resolution cho facet
singlevsmultiple - Thêm ràng buộc cây taxonomy: same-facet, depth<=2, no-cycle
- Không để
depthlà dữ liệu tự do không kiểm soát
🟡 Nên cân nhắc
- Ghi rõ khả năng mở facet thứ 6 trong tương lai (audience/target actor)
- Rule relation để phase 2
- Có cơ chế alias/deprecate/replaced_by cho label
- Có thống kê hiệu quả rule để tránh regex match quá rộng
🟢 Đồng ý
- 5 chiều hiện tại đủ để khởi động
- 3 tầng chuyên môn là hợp lý
- Giữ
taxonomy_matrixlà collection riêng - 5 collections tổng thể là tối giản hợp lý
- Nhãn là đầu vào, quan hệ là đầu ra — đúng hướng kiến trúc
Kết luận cuối
🟢 Đồng ý kiến trúc tổng thể. 🔴 Chưa nên triển khai ngay nếu chưa khóa chặt 3 điểm: conflict rules, tree constraints, depth governance.
Sau khi chốt 3 điểm này, tôi đánh giá Điều 24 đủ chắc để bước sang round phản biện kỹ thuật PG/Directus.