KB-78B5 rev 2

Điều 32: Luật Phê duyệt — v1.1 BAN HÀNH

6 min read Revision 2
lawdieu32approvalaprpg-nativequorumv1.1ban-hanhs178-fix15

ĐIỀU 32: LUẬT PHÊ DUYỆT — v1.1 BAN HÀNH

v1.1 BAN HÀNH | 2026-04-18 | Amend bởi S178 Fix 15 — DOT Repair Governance v4 FINAL Base: v1.0 draft cùng path. Phạm vi v1.1: PG-native action/request types, split code khỏi payload JSONB, quorum approval theo risk, bridge migration an toàn, audit-safe FK, và reserved action cho flow amend luật chưa implement.


§1. Mục đích

Mọi thay đổi có tác động tới hệ thống phải qua cơ chế phê duyệt chuẩn hoá. Phê duyệt = PG collections + trigger + trạng thái rõ ràng; không phải chat, không phải email, không phải “anh OK rồi đó”.

§2. Nguyên tắc

§2.1 DOT 100%

Mọi approval request phải được tạo qua DOT hợp pháp; không insert SQL tay, không curl bypass.

§2.2 Đề xuất phải đứng được một mình

Mỗi APR phải đủ evidence, phương án đề xuất, phương án thay thế, và dữ liệu cần thiết để người/AI quyết định mà không cần truy thêm ngoài luồng.

§2.3 Qua PG — theo đúng luồng thiết kế

approval_requests, apr_action_types, apr_request_types, apr_approvals và các trigger liên quan là SSOT của flow phê duyệt.

§2.4 Phạm vi áp dụng

Áp dụng cho birth, reclassify, retire, new collection, new/fix DOT, amend luật, và mọi thay đổi có tác động hệ thống.


§3. Schema approval

§3.1 Split code khỏi payload

approval_requests phải có 2 cột code riêng:

  • request_type_code TEXT
  • proposed_action_code TEXT

proposed_action JSONB tiếp tục giữ payload chi tiết; không làm FK.

FK bắt buộc:

  • request_type_codeapr_request_types(request_code)
  • proposed_action_codeapr_action_types(action_code)
  • ON UPDATE RESTRICT, ON DELETE RESTRICT cho toàn bộ chain type codes.

Nguyên tắc audit-preservation: muốn đổi tên code type = tạo code mới, deprecate/retire code cũ; cấm update trực tiếp PK code đang được lịch sử APR tham chiếu.

§3.2 2 bảng type

apr_action_types

  • action_code PK
  • description
  • handler_ref
  • risk_level in (low,medium,high)
  • status in (active,deprecated,retired)
  • _dot_origin TEXT NOT NULL
  • created_at, retired_at

apr_request_types

  • request_code PK
  • description
  • default_action_code FK → apr_action_types(action_code)
  • status in (active,deprecated,retired)
  • _dot_origin TEXT NOT NULL
  • created_at, retired_at

§3.3 Seed chuẩn

Action seed tối thiểu:

  • create_item (low)
  • update_item (low)
  • add_field (medium)
  • patch_ops_code (high)
  • amend_law (high, RESERVED)

Request type seed tối thiểu:

  • giữ các type hiện hành
  • bổ sung fix_repair_dot

Reserved action: amend_law có thể tồn tại trong bảng type nhưng nếu handler_ref='unimplemented' thì DB/engine phải chặn status tiến tới approved/applied cho action này.

§3.4 Register Collection Protocol

apr_action_types, apr_request_types, apr_approvals phải được đăng ký trong collection_registry + meta_catalog trước khi runtime dùng.

§3.5 Sequencing migration bắt buộc

  1. Tạo apr_action_types, apr_request_types + seed.
  2. Register theo Đ36.
  3. Amend approval_requests thêm request_type_code, proposed_action_code (nullable).
  4. Backfill APR legacy từ text/JSONB.
  5. Verification query: 0 row missing mapping.
  6. Bật maintenance gate app_lock vài phút cho production để chặn write window.
  7. Deploy runtime bridge/new code đọc cột code.
  8. Mở lại write path.
  9. Sau observation window mới nâng constraint nếu cần.

Production default: chọn app_lock ngắn thay vì dual-write 24h. Dual-write chỉ là phương án fallback khi không thể đóng write window.


§4. Quorum approvals

§4.1 Bảng apr_approvals

Mỗi quyết định duyệt phải được ghi thành row riêng:

  • apr_id
  • approver
  • approver_type in (human,ai_council)
  • decision in (approve,reject,abstain)
  • rationale
  • created_at
  • UNIQUE (apr_id, approver)

§4.2 Trigger quorum

BEFORE UPDATE OF status ON approval_requests:

  • high: cần ≥1 president approve + ≥2 ai_council approve + 0 reject
  • medium: cần ≥1 president approve
  • low: cần ≥1 approve hoặc rule auto-approve hợp lệ

§4.3 Hardening rules

  1. Cấm self-approve cho high-risk request của chính người/agent tạo request.
  2. Có reject mở thì không được approve đè; phải mở chu kỳ review mới.
  3. Trigger phải kiểm trong cùng transaction snapshot khi đổi status.

§5. DOT hỗ trợ APR

  • dot-apr-types-register
  • dot-apr-type-integrity-audit (A-tier)
  • dot-apr-type-integrity-propose (B/pseudo)

Mục tiêu: quét orphan code, missing mapping, inactive references; không auto-fix tuỳ tiện.


§6. Lifecycle

pending → approved → applied hoặc pending → rejected hoặc pending → expired

approved không đồng nghĩa đủ quorum; status chỉ được phép đổi khi trigger quorum pass.


§7. Reserved / unimplemented handlers

Mọi action có handler_ref='unimplemented'không được thực thi. Cơ chế chặn phải tồn tại ở DB gate và runtime, không chỉ text policy.


§8. Thước đo

  1. Thời gian pending trung bình.
  2. Tỷ lệ request đủ evidence ngay từ lần đầu.
  3. Tỷ lệ reject do thiếu evidence/rule.
  4. Tỷ lệ APR historical còn missing mapping = 0.

CHANGELOG

Version Nội dung
v1.0 Draft ban đầu về approval_requests, scanner, lifecycle cơ bản.
v1.1 S178 Fix 15 BAN HÀNH. Split code/payload, PG-native type tables, quorum approvals, audit-safe FK RESTRICT, bridge migration theo app_lock, reserved amend_law, và DOT integrity cho APR vocabulary.

Điều 32 v1.1 BAN HÀNH | APR PG-native | Quorum enforced | Audit-safe FK