Dự thảo sửa luật Track A REV 3 FINAL — Đ3 + Đ35 + Đ4 + Đ24
DỰ THẢO SỬA LUẬT — TRACK A Đ43 PHASE C (REV 3 FINAL)
Sửa Đ3 + Đ35 + Đ4 + Đ24 (lát cắt provenance)
Ngày: 2026-04-20 | S178 Fix 23 Trạng thái: FINAL — Hội đồng 2 vòng APPROVE FINAL (Gemini 10 + GPT 9.4). Desktop rà soát cuối. HP: v4.6.3 (13 NT — PASS 13/13) Changelog: REV 1 (draft) → REV 2 (7 patch Hội đồng vòng 1) → REV 3 (2 minor fix Desktop rà soát cuối)
CHANGELOG
| Rev | Nội dung |
|---|---|
| REV 1 | Draft ban đầu |
| REV 2 | 7 patch Hội đồng vòng 1: P1 NULL gov_role, P2 bỏ INSERT system_issues, P3 anti-gaming, P4 btrim, P5 threshold override, P6 FAC-PROV scope, P7 write path audit |
| REV 3 | 2 minor fix Desktop rà soát: M1 config key dot_tools_description_min_length (thống nhất với function pattern), M2 PROV-HUMAN mô tả rõ "review output AI" |
I. SỬA ĐIỀU 3 — LUẬT METADATA
Bổ sung §2.1 + §2.2 + §2.3 + §2.4 + sửa §3
§2.1 — Quy cách chung (mọi entity governed)
Description phải đạt 4 tiêu chí machine-checkable:
| Tiêu chí | Kiểm tra | PG enforcement |
|---|---|---|
| C1: Không rỗng | btrim(description) != '' |
Trigger |
| C2: Đủ dài | length(btrim(description)) >= min_length (config-driven, baseline 30) |
Trigger |
| C3: Không gaming | description !~ '^(.)\1{9,}' AND description !~ '^[.\-_\s]{10,}' |
Trigger |
| C4: Tiếng Việt có dấu | Viết TV có dấu, cho xen thuật ngữ kỹ thuật EN | Spot-check |
Config:
INSERT INTO dot_config(key, value, description) VALUES
('description_min_length', '30', 'Đ3 §2.1: Độ dài tối thiểu description cho entity governed. UPDATE để điều chỉnh.');
§2.2 — Quy cách riêng per entity type
| Loại entity | Nội dung bắt buộc | Độ dài khuyến nghị |
|---|---|---|
| DOT (dot_tools) | Mục đích + Trigger + Paired DOT → Đ35 §4.1.1 | 50-200 ký tự |
| Collection / Table | Chứa gì + vai trò + lớp (Não/Kho/Cổng) | 30-150 ký tự |
| Domain | Phạm vi quản lý + thành phần chính | 30-100 ký tự |
| Config / Seed | Tham số điều khiển hành vi nào | 20-100 ký tự |
| Species / Taxonomy | Đại diện nhóm nào + quan hệ parent | 30-100 ký tự |
| Governance | Quy tắc/ràng buộc gì + áp dụng đối tượng nào | 30-150 ký tự |
Bảng trên = hướng dẫn nội dung. PG chỉ enforce C1-C3. Nội dung đúng = trách nhiệm agent + spot-check.
§2.3 — classification = legacy
Field classification (core/module/data/governance/operational) là thiết kế ban đầu trước Đ24/Đ29. Giữ tương thích ngược. Track B sẽ deprecated chính thức.
§2.4 — Ngoại lệ backfill description
Backfill description là công việc trí tuệ: đọc code, hiểu ngữ cảnh, viết mô tả. DOT bash không có khả năng suy luận ngữ nghĩa.
- Pha suy luận/sinh: AI agent (Gemini CLI, Codex, Claude Code) đọc source code + metadata → sinh description. Đây là ngoại lệ trí tuệ — DOT bash không thể thay thế.
- Pha ghi dữ liệu: PHẢI đi qua write path hợp pháp có audit: Directus REST API (gateway chính thức DB directus — Đ33 §0.1) hoặc DOT có log. KHÔNG ghi raw SQL.
- Truy vết: Ghi
admin_fallback_logcho toàn chiến dịch backfill. Retroactive APR sau 48h. - Tương lai: Khi Langroid agent hoặc Đ37/Đ38 hoàn thiện → chuyển sang DOT tự động.
Tech debt TD-D33-NT3: Ngoại lệ "công việc trí tuệ 1 lần" chưa có trong Đ33 §13 — bổ sung khi amend Đ33 lần sau.
§3 — Bổ sung notes
Thêm notes (TEXT, optional) vào metadata mở rộng. Lưu extra_metadata JSONB nơi có, cuối description nơi chưa có JSONB.
II. SỬA ĐIỀU 35 — LUẬT QUẢN TRỊ DOT
Bổ sung §4.1.1 — DOT Description Contract
DOT description PHẢI tuân Đ3 §2.1 + ghi 3 phần DOT-specific:
[MỤC ĐÍCH]: 1 câu — DOT làm gì.
[TRIGGER → OUTPUT]: Kích hoạt bởi gì → tạo ra kết quả gì.
[PAIRED]: Cặp với DOT nào — vai trò chính hay phụ (NT12).
Machine-checkable DOT: length(btrim(description)) >= 50 (cao hơn baseline 30)
★ M1 REV 3: Config key thống nhất với function pattern:
INSERT INTO dot_config(key, value, description) VALUES
('dot_tools_description_min_length', '50',
'Đ35 §4.1.1: DOT min length riêng. Function đọc key = TG_TABLE_NAME || _description_min_length.');
Ví dụ tốt:
Quét health check H11 — đếm row thiếu description trên tất cả bảng governed. Trigger: cron 30 */3. Output: ghi system_issues nếu missing_count > 0. Paired: DOT-CONTEXT-PACK-BUILD (phụ kiểm).
Ví dụ xấu:
"Script chạy APR" — vi phạm D1 (quá ngắn), thiếu trigger, thiếu paired.
III. SỬA ĐIỀU 4 — LUẬT SINH SẢN
Sửa §2 bước 4 + thêm §2.1
§2 bước 4
Sửa: "Gán metadata tối thiểu theo quy cách Đ3 §2. Kiểm tra description theo §2.1."
§2.1 — Birth Description Guard
PG function — REV 3 FINAL:
CREATE OR REPLACE FUNCTION fn_description_birth_guard()
RETURNS TRIGGER AS $$
DECLARE
_mode TEXT;
_gov_role TEXT;
_min_len INT;
_table_min INT;
_desc TEXT;
BEGIN
-- Đọc mode (NT4 config-driven)
SELECT value INTO _mode FROM dot_config
WHERE key = 'description_enforcement_mode';
IF _mode IS NULL THEN _mode := 'warn'; END IF;
-- Đọc baseline min length
SELECT value::int INTO _min_len FROM dot_config
WHERE key = 'description_min_length';
IF _min_len IS NULL THEN _min_len := 30; END IF;
-- Override threshold per table nếu có (pattern: <table>_description_min_length)
BEGIN
SELECT value::int INTO _table_min FROM dot_config
WHERE key = TG_TABLE_NAME || '_description_min_length';
IF _table_min IS NOT NULL THEN
_min_len := _table_min;
END IF;
EXCEPTION WHEN OTHERS THEN NULL;
END;
-- Tìm governance_role
SELECT governance_role INTO _gov_role
FROM collection_registry
WHERE collection_name = TG_TABLE_NAME;
-- NULL = lỗi quản trị, KHÔNG bỏ qua (P1)
IF _gov_role IS NULL THEN
IF _mode = 'block' THEN
RAISE EXCEPTION
'Đ4 §2.1: Bảng % chưa đăng ký collection_registry.', TG_TABLE_NAME;
ELSE
RAISE WARNING 'Đ4 §2.1: Bảng % chưa đăng ký collection_registry.', TG_TABLE_NAME;
RETURN NEW;
END IF;
END IF;
-- excluded → bỏ qua
IF _gov_role = 'excluded' THEN RETURN NEW; END IF;
-- Chuẩn hóa description (btrim + COALESCE, generic access)
_desc := btrim(COALESCE((to_jsonb(NEW)->>'description')::text, ''));
-- Check: rỗng / ngắn / gaming
IF _desc = '' OR length(_desc) < _min_len
OR _desc ~ '^(.)\1{9,}$'
OR _desc ~ '^[.\-_\s]{10,}$' THEN
IF _gov_role = 'governed' AND _mode = 'block' THEN
RAISE EXCEPTION
'Đ4 §2.1 + Đ3 §2.1: Bảng % (governed) — description >= % ký tự, không gaming.',
TG_TABLE_NAME, _min_len;
END IF;
-- WARN mode hoặc observed: cho qua, H11 audit sau (P2 — dual-trigger NT12)
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Mức enforce:
| governance_role | WARN mode | BLOCK mode |
|---|---|---|
| governed | Cho qua, H11 bắt sau | RAISE EXCEPTION |
| observed | Cho qua, H11 log INFO | Cho qua |
| excluded | Bỏ qua | Bỏ qua |
| NULL (chưa đăng ký) | RAISE WARNING + cho qua | RAISE EXCEPTION |
Dual-trigger NT12: birth guard (chính) + H11 (phụ)
Config:
INSERT INTO dot_config(key, value, description) VALUES
('description_enforcement_mode', 'warn',
'Đ4 §2.1: warn=cho qua+H11 audit, block=reject. Chuyển block sau backfill + 7 ngày stable.');
Gắn trigger: Mọi bảng governed có cột description. Danh sách tại thời điểm triển khai = snapshot, không đóng cứng trong luật.
Lưu ý triển khai: dot_tools sẽ có 2 BEFORE INSERT triggers (fn_birth_gate Đ35 + fn_description_birth_guard Đ4). Cả hai check field khác nhau, không deadlock.
IV. SỬA ĐIỀU 24 — LUẬT NHÃN (LÁT CẮT PROVENANCE)
Thêm facet FAC-PROV + 3 label values
-- Scope = provenance description/metadata, không phải toàn entity (P6)
INSERT INTO taxonomy_facets(code, name, description, cardinality, max_labels_per_entity)
VALUES ('FAC-PROV', 'Description Provenance',
'Nguồn gốc sinh description/metadata — ai viết, bằng phương thức nào.',
'single', 1)
ON CONFLICT (code) DO NOTHING;
-- ★ M2 REV 3: PROV-HUMAN mô tả rõ "review output AI"
INSERT INTO taxonomy(code, name, facet_id, depth, description, status)
VALUES
('PROV-AI', 'AI-generated',
(SELECT id FROM taxonomy_facets WHERE code='FAC-PROV'),
0, 'Description được AI agent sinh tự động — chưa human review', 'active'),
('PROV-HUMAN', 'Human-reviewed',
(SELECT id FROM taxonomy_facets WHERE code='FAC-PROV'),
0, 'Description do con người viết trực tiếp hoặc đã review và approve output AI', 'active'),
('PROV-DOT', 'DOT-generated',
(SELECT id FROM taxonomy_facets WHERE code='FAC-PROV'),
0, 'Description được DOT sinh từ template/metadata', 'active')
ON CONFLICT (code) DO NOTHING;
V. TRIỂN KHAI
- Seed dot_config:
description_min_length=30,dot_tools_description_min_length=50,description_enforcement_mode=warn - Seed taxonomy: FAC-PROV + PROV-AI + PROV-HUMAN + PROV-DOT
- Tạo function
fn_description_birth_guard - Gắn trigger cho bảng governed có cột description (snapshot triển khai)
- Pilot batch 20-30 DOT (agent AI + spot-check)
- Backfill diện rộng (write path Directus API + admin_fallback_log)
- Sau backfill + 7 ngày stable →
UPDATE dot_config SET value='block' WHERE key='description_enforcement_mode'
VI. KIỂM TRA HP — 13/13 PASS
| NT | Đánh giá |
|---|---|
| NT1 | governance_role SSOT, entity_labels provenance SSOT ✅ |
| NT2 | PG trigger auto ✅ |
| NT3 | Ngoại lệ trí tuệ, write path Directus API (gateway Đ33 §0.1) + admin_fallback_log. TD-D33-NT3 ghi nhận. ✅ |
| NT4 | mode + threshold via dot_config ✅ |
| NT7+NT12 | birth guard (chính) + H11 (phụ) ✅ |
| NT9 | NULL gov_role → WARN/BLOCK ✅ |
| NT10 | Config PG, enforcement PG trigger ✅ |
| NT11 | Reuse governance_role + entity_labels ✅ |
| NT13 | PG native function + trigger ✅ |
VII. TECH DEBT GHI NHẬN
| TD | Mô tả | Khi nào |
|---|---|---|
| TD-D33-NT3 | Ngoại lệ "công việc trí tuệ 1 lần" chưa có trong Đ33 §13 | Amend Đ33 lần sau |
| TD-D3-CLASSIFICATION | Đ3 classification legacy overlap Đ24/Đ29 |
Track B |
| TD-D3-ANTI-GAMING | Regex chỉ chặn gaming đơn giản (chuỗi lặp). Gaming phức tạp → H11/spot-check. | Sau backfill |
Dự thảo REV 3 FINAL | Hội đồng 2 vòng APPROVE FINAL | Desktop rà soát 13 NT + xung đột liên luật | Sẵn sàng ban hành