KB-A4AE rev 3

Dự thảo sửa luật Track A REV 3 FINAL — Đ3 + Đ35 + Đ4 + Đ24

11 min read Revision 3
law-drafttrack-arev3finaldieu3dieu4dieu35dieu24approveds178-fix23

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_log cho 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

  1. Seed dot_config: description_min_length=30, dot_tools_description_min_length=50, description_enforcement_mode=warn
  2. Seed taxonomy: FAC-PROV + PROV-AI + PROV-HUMAN + PROV-DOT
  3. Tạo function fn_description_birth_guard
  4. Gắn trigger cho bảng governed có cột description (snapshot triển khai)
  5. Pilot batch 20-30 DOT (agent AI + spot-check)
  6. Backfill diện rộng (write path Directus API + admin_fallback_log)
  7. 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