🥗 OmiScan v0.2 · CMS
← Demo map 📱 Mobile 🖥️ Dashboard ▶ Flows

⚙️ Web CMS 9 màn hình

P3 cán bộ rule pack soạn rule qua form-based editor (không cần code), 4-eyes approval với P3.5 trước publish.

C01 Login C02 Home C03 List rule C04 Editor C05 Preview C06 Submit approval C07 Approval queue C08 Publish history C09 Audit log
S-C01

🔐 Đăng nhập CMS

Chung Cognito user pool. RBAC chỉ user role cán_bộ_rule hoặc approver mới truy cập.

🔒 cms.omiscan.vn/login
⚙️
OmiScan CMS
Rule pack admin panel
🔒Chỉ dành cho cán bộ pháp chế Viện Dinh dưỡng
CMS yêu cầu MFA TOTP cho mọi tài khoản
S-C02

🏠 Home CMS

Rule pack hiện hành + tile metric + activity feed. Click "Tạo rule" → C04 editor.

🔒 cms.omiscan.vn

🏠 Trang chủ CMS

+ Tạo rule mới
RULE PACK HIỆN HÀNH
v2026.05.10
Published 10/05/2026 14:30 · 23 rules · Author: Lê Anh, Approver: Hùng Phan
Đã publish
7 versions
ℹ️ Mobile app sẽ pull rule pack mới mỗi 6h. Pack có chữ ký ECDSA P-256 verified.
📋 Tổng rule
23
12 NĐ 37 · 5 TT 29 · 6 advisory
✏️ Đang draft
3
Bạn đang chỉnh sửa
⏳ Chờ approve
1
P3.5 cần review

🕐 Hoạt động gần đây

Xem tất cả →
Hùng Phan publish rule pack 2026.05.10
10/05 14:30
📤
Lê Anh submit for approval rule VDD-WHO-SODIUM
10/05 14:25
✏️
Lê Anh chỉnh sửa rule TT29-E5-1-NUTRITION
10/05 09:15
Lê Anh tạo rule mới VDD-FAT-RATIO
09/05 16:42
🔄
Hệ thống rollback từ 2026.05.08 → 2026.05.07 (rule sai)
07/05 11:20

📊 Phân loại rule v1

📜 NĐ 37/2026 (compliance)12
📜 TT 29/2023 (compliance)5
💚 Advisory dinh dưỡng5
⚙️ OmiScan validation1
Section 06.4 mục tiêu: ≥ 15 rule. Đạt 23 rule
S-C03

📋 List rule

Filter + search 23 rule. Click row → C04 editor.

🔒 cms.omiscan.vn/rules

📋 Tất cả rule 23 rule

+ Tạo rule mới
ID Title Severity Source Văn bản Status Cập nhật
TT29-E5-1-NUTRITION-5-CORE Bảng dinh dưỡng phải có 5 chỉ tiêu cơ bản 🔴 Violation Compliance TT 29/2023 Đ.5.1 ✅ Published 10/05 14:30
ND37-E42-1-A-NAME Tên hàng hóa phải có trên nhãn 🔴 Violation Compliance NĐ 37/2026 Đ.42.1.a ✅ Published 10/05 14:30
ND37-E42-1-B-MANUFACTURER Tên + địa chỉ tổ chức chịu trách nhiệm 🔴 Violation Compliance NĐ 37/2026 Đ.42.1.b ✅ Published 10/05 14:30
ND37-E42-1-C-ORIGIN Xuất xứ hàng hóa phải có 🔴 Violation Compliance NĐ 37/2026 Đ.42.1.c ✅ Published 10/05 14:30
VDD-WHO-SODIUM-HIGH Cảnh báo natri cao theo WHO 🔵 Advisory Advisory WHO 2025 + Viện DD ⏳ Pending approval 10/05 14:25
TT29-E5-2-SUGAR-FOR-SWEETENED Sản phẩm thêm đường phải ghi đường tổng 🔴 Violation Compliance TT 29/2023 Đ.5.2 ✅ Published 10/05 14:30
VDD-FAT-RATIO-HIGH Tỷ lệ năng lượng từ chất béo cao 🔵 Advisory Advisory Codex CAC/GL 2-1985 📝 Draft 09/05 16:42
ND37-E40-VI-SUB-LABEL Nhãn phụ tiếng Việt cho hàng nhập khẩu 🔴 Violation Compliance NĐ 37/2026 Đ.40 ✅ Published 10/05 14:30
ND37-PL1-3-TPBVSK-DISCLAIMER TPBVSK phải có cụm "không phải thuốc" 🔴 Violation Compliance NĐ 37 Phụ lục I.3.h ✅ Published 10/05 14:30
Hiển thị 9 / 23 rule
S-C04

✏️ Rule Editor — Form-based predicate builder

P3 không cần code. Click "Preview" → C05, "Submit approval" → C06.

🔒 cms.omiscan.vn/rules/TT29-E5-1-NUTRITION-5-CORE/edit

Edit Rule · TT29-E5-1-NUTRITION-5-CORE

📝 Draft 🧪 Preview 📤 Submit approval

📋 Thông tin cơ bản

nutrition ✕ TT29 ✕ core ✕

⚖️ Tham chiếu pháp lý

🎯 Scope

thực_phẩm ✕ đồ_uống_không_cồn ✕ lương_thực ✕

🧮 Predicate (điều kiện rule)

Rule pass nếu tất cả các điều dưới đều đúng
AND — TẤT CẢ
FIELDtồn tại🗑️
FIELDtồn tại🗑️
FIELDtồn tại🗑️
FIELDtồn tại🗑️
FIELDtồn tại🗑️

💬 Message hiển thị

📜 JSON tự generate

Backend ký ECDSA P-256 + push CDN khi publish
{   "id": "TT29-E5-1-...",   "severity": "violation",   "source": "compliance",   "scope": {     "product_categories": [       "thực_phẩm",       "đồ_uống_không_cồn"     ]   },   "legal_ref": {     "document": "TT 29/2023/TT-BYT",     "article": "Điều 5",     "clause": "khoản 1"   },   "predicate": {     "and": [       {"exists":        [{"var":        "...kcal"}]},       ...     ]   } }
S-C05

🧪 Preview rule trên test set

Áp rule lên 50 submission gần nhất. Click "Submit approval" → C06.

🔒 cms.omiscan.vn/rules/TT29-.../preview

🧪 Preview rule · TT29-E5-1-NUTRITION-5-CORE

✅ PASS
47
94% / 50 submission
❌ FAIL
3
6% / 50
⏭️ SKIP (out of scope)
0
Tất cả thuộc scope
Rule sẽ flag 6% submission. Tỷ lệ bình thường (< 50%) — KHÔNG có cảnh báo "rule quá rộng".

⚙️ Auto test gauntlet

✅ Schema validation
Pass
✅ JsonLogic syntax
Pass
✅ Performance
42ms / submission
✅ Cross-platform parity
200/200 fixture

❌ Submission FAIL (3 cái)

OMI-...000123🍪 Bánh quy XYZ PremiumThiếu: kcal
OMI-...000145🥛 Sữa ABC Lactose-freeThiếu: sodium_mg
OMI-...000162🍜 Mì DEF Sốt thịt bòThiếu: protein_g

✅ Submission PASS (5 đầu, 47 tổng)

OMI-...001234🍞 Bánh mì sandwich Staff5/5 chỉ tiêu đầy đủ
OMI-...001233🥛 Sữa TH true MILK5/5 chỉ tiêu đầy đủ
OMI-...001232🍪 Bánh quy AFC 200g5/5 chỉ tiêu đầy đủ
OMI-...001231🥤 Pepsi Max 330ml5/5 chỉ tiêu đầy đủ
OMI-...001230🍜 Mì Hảo Hảo5/5 chỉ tiêu đầy đủ
+ 42 submission khác đều PASS
S-C06

📤 Submit for approval

Modal chọn approver + changelog. Click "Gửi yêu cầu" → toast + về C03.

🔒 cms.omiscan.vn/rules/.../submit-approval

📤 Gửi yêu cầu phê duyệt

Rule đã pass auto test gauntlet. Sẵn sàng submit cho P3.5 review.
Sau khi submit:
  • 📧 P3.5 nhận notification + email
  • ⏰ Mặc định 24h SLA cho review
  • 🔒 Bạn không thể edit rule cho đến khi P3.5 reject (nếu có)
Hủy
S-C07

✅ Approval queue (P3.5 — 4-eyes)

P3.5 review diff + auto test result, accept/reject. Click "Approve" → C08 (publish).

🔒 cms.omiscan.vn/approval/req-2026-05-10-001

📩 Approval Request · req-2026-05-10-001

⏳ Đang chờ review

ℹ️ Thông tin yêu cầu

👤 Người soạn
LA
Lê Anh (P3)
📅 Submit lúc10/05/2026 14:25
🏷️ Pack version2026.05.11 (từ 2026.05.10)
📝 Số rule thay đổi1 thêm · 0 sửa · 0 xóa
💬 ChangelogThêm rule advisory cảnh báo natri cao theo WHO (>600mg/100g)

🔀 Diff: 2026.05.10 → 2026.05.11

+18 line−0 line
...
"rules": [
{ "id": "ND37-E42-1-A-NAME", ... },
...
+ {
+ "id": "VDD-WHO-SODIUM-HIGH",
+ "severity": "advisory",
+ "source": "advisory",
+ "scope": {
+ "product_categories": ["thực_phẩm", "đồ_uống_không_cồn"]
+ },
+ "legal_ref": {
+ "document": "Khuyến nghị WHO về giảm muối"
+ },
+ "title": "Cảnh báo natri cao",
+ "predicate": {
+ ">": [{"var": "fields.nutrition_per_100g.sodium_mg"}, 600]
+ },
+ "message_template": "Hàm lượng natri {value}mg..."
+ }
]

⚙️ Auto test gauntlet

✅ Schema validation
Pass
✅ JsonLogic syntax
Pass
✅ Test set
8% flag (4/50)
✅ Performance
42ms / sub
ℹ️ Không có cảnh báo "no-op" hoặc "catastrophic flag". Rule này có thể được approve.

⚖️ Quyết định

Sau khi approve:
  • 🚀 Bump version 2026.05.11
  • 🔐 Sign ECDSA P-256 với KMS
  • 🌐 Push S3 + invalidate CloudFront
  • 📲 Mobile pull trong 6h
  • 📝 Audit log entry
S-C08

📜 Publish history + rollback

Versions với 1-click rollback. Click "Promote lại" → confirm → toast.

🔒 cms.omiscan.vn/history

📜 Publish history

7 versions
PHIÊN BẢN HIỆN HÀNH
v2026.05.10
✅ Active
🟢
v2026.05.10 Active
10/05 14:30 · Lê Anh → Hùng Phan · 23 rules
📝 Initial release: 12 NĐ 37 + 5 TT 29 + 5 advisory + 1 OmiScan
v2026.05.08 Superseded
08/05 10:15 · Lê Anh → Hùng Phan · 22 rules
🔧 Sửa rule TT29-E5-1 — fix scope bug
🔄
v2026.05.07 (rollback) Rolled back
07/05 11:20 · Hệ thống auto-rollback từ 2026.05.06
⚠️ Rule sai trong v2026.05.06 gây cảnh báo nhầm hàng loạt
v2026.05.06 06/05 14:00 · Hủy do bug
v2026.05.01 01/05 09:00 · First publish · 18 rules
S-C09

🔍 Audit log viewer

Filter ai/khi/action. Dùng cho ISO 27001 + BVDLCN. Vĩnh viễn.

🔒 cms.omiscan.vn/audit

🔍 Audit log

Thời gian User Action Entity Detail IP
10/05 14:30:12
PH
Hùng P.
🚀 Publish rule_pack/2026.05.10 Approved + signed ECDSA P-256 + pushed CDN 14.241.x.x
10/05 14:25:08
LA
Lê A.
📤 Submit rule/VDD-WHO-SODIUM Submit for approval to Hùng P. 14.241.x.x
10/05 09:15:42
LA
Lê A.
📝 Edit rule/TT29-E5-1 Sửa scope: thêm "lương_thực" 14.241.x.x
09/05 16:42:15
LA
Lê A.
➕ Create rule/VDD-FAT-RATIO Tạo rule mới với severity advisory 14.241.x.x
07/05 11:20:00
SY
System
🔄 Rollback rule_pack/2026.05.07 Auto-rollback từ 2026.05.06 do mismatch>50% internal
07/05 11:18:33
PH
Hùng P.
❌ Reject rule_pack/2026.05.06 Reject — rule predicate sai logic 14.241.x.x
Hiển thị 6 / 247 entries · Audit log lưu vĩnh viễn theo ISO 27001
← Dashboard Demo map Xem User Flows →