KB-26C8

Quy trình Khai sinh — v1.0 (QT-001 + QT-002)

5 min read Revision 1
processbirth-registryQT-001QT-002birth-firstgovernanceDOT

QUY TRÌNH KHAI SINH — v1.0

Áp dụng: Mọi DOT tool tạo/nhập thực thể governed PHẢI theo 1 trong 2 quy trình. Luật liên quan: Điều 0-G (Khai sinh), Điều 26 (Đếm), §0-J (Đếm 2 nơi), §0-L (Birth-first). Nguyên tắc: Không khai → không sinh. Không khai → không đếm được.


QT-001: NHẬP KHAI SINH (Backfill — cho thực thể ĐÃ TỒN TẠI)

Mục đích: Đưa thực thể đã tạo trước khi có birth_registry vào sổ khai sinh. Chạy 1 lần per collection. Sau khi xong → collection đó chuyển sang QT-002.

INPUT:  collection_name (governed, có trong species_collection_map)
OUTPUT: birth_registry records cho mọi entity trong collection

BƯỚC 1 — KIỂM TRA ĐIỀU KIỆN
  □ Collection có trong species_collection_map? → Nếu không: DỪNG, gắn species trước.
  □ Collection có trong collection_registry với governance_role = 'governed'? → Nếu không: DỪNG.
  □ Birth trigger đã setup cho collection? → Nếu không: chạy dot-birth-trigger-setup trước.

BƯỚC 2 — ĐẾM TRƯỚC
  □ Đếm nơi chứa: SELECT COUNT(*) FROM <collection> → ghi A
  □ Đếm nơi sinh: SELECT COUNT(*) FROM birth_registry WHERE collection_name = '<collection>' → ghi B
  □ Gap = A - B → nếu 0: XONG, không cần backfill.

BƯỚC 3 — NHẬP
  □ Chạy dot-birth-backfill --collection=<collection>
  □ Tool tự: lấy mọi entity trong source → check birth_registry → INSERT nếu chưa có
  □ Mỗi record: entity_code, collection_name, species_code (auto từ mapping), _dot_origin, born_at

BƯỚC 4 — XÁC NHẬN
  □ Đếm lại nơi sinh: SELECT COUNT(*) FROM birth_registry WHERE collection_name = '<collection>' → ghi B'
  □ B' = A? → KHỚP ✅ → ghi vào report
  □ B' ≠ A? → INVESTIGATE: entity nào trong source không có code? (orphan O-2 di sản)

BƯỚC 5 — THANH TRA
  □ Chạy dot-inspect-pen trên records mới nhập
  □ Ghi kết quả: bao nhiêu certified, bao nhiêu cần xử lý

QT-002: KHAI SINH TRƯỚC, SINH SAU (Birth-first — cho thực thể MỚI)

Mục đích: Entity mới KHÔNG THỂ tồn tại nếu chưa có birth record. Áp dụng cho MỌI DOT tool tạo entity governed từ nay về sau.

INPUT:  entity metadata (collection, code/prefix, species, tên, mô tả...)
OUTPUT: entity trong source collection + birth record đã certified

BƯỚC 1 — KIỂM TRA LOÀI
  □ Collection có trong species_collection_map?
    → Không: DỪNG. Báo lỗi "Collection chưa có species mapping."
  □ Species_code hợp lệ trong entity_species?
    → Không: DỪNG. Báo lỗi "Species không tồn tại."

BƯỚC 2 — TẠO KHAI SINH (TRƯỚC)
  □ Sinh entity_code: PREFIX-NNN (lấy next sequence)
  □ INSERT vào birth_registry:
    - entity_code = PREFIX-NNN
    - collection_name = <collection>
    - species_code = auto từ mapping
    - composition_level = auto từ entity_species
    - dot_origin = tên DOT tool đang chạy
    - born_at = now()
    - governance_role = 'governed'
  □ Ghi birth_id → dùng ở bước 3

BƯỚC 3 — TẠO THỰC THỂ (SAU)
  □ INSERT vào <source_collection>:
    - code = entity_code (từ bước 2)
    - _dot_origin = tên DOT tool
    - ... (các fields khác)
  □ Nếu INSERT thất bại → ROLLBACK birth record ở bước 2. Không để phantom.

BƯỚC 4 — XÁC NHẬN KHỚP
  □ SELECT FROM birth_registry WHERE entity_code = '<code>' → tồn tại?
  □ SELECT FROM <collection> WHERE code = '<code>' → tồn tại?
  □ Cả 2 tồn tại → KHỚP ✅
  □ Thiếu 1 → BÁO LỖI ngay lập tức

BƯỚC 5 — THANH TRA TỰ ĐỘNG
  □ Birth trigger (nếu có) sẽ fire → nhưng record đã có (ON CONFLICT DO NOTHING)
  □ Chạy inspect_pen ngay: code NOT NULL? _dot_origin NOT NULL? species NOT NULL?
  □ Nếu pass → inspect_pen = now()

Quan trọng: Bước 2 TRƯỚC bước 3. Birth record tồn tại = "giấy phép sinh". Entity không có giấy phép = không được tạo. DOT tool PHẢI implement theo thứ tự này.


SO SÁNH 2 QUY TRÌNH

QT-001 (Nhập) QT-002 (Khai trước sinh sau)
Khi nào 1 lần, cho entity đã tồn tại Mọi lần tạo entity mới
Thứ tự Entity tồn tại → tạo birth Birth trước → entity sau
Rủi ro Orphan tạm thời (giữa đếm và nhập) Phantom tạm thời (nếu bước 3 fail)
Xử lý rủi ro Bước 4 kiểm tra gap Bước 3 ROLLBACK birth nếu fail
DOT tool dot-birth-backfill Mọi DOT tạo entity (dot-content-, dot-schema-...)
Dùng xong? Chuyển sang QT-002 Vĩnh viễn

DOT TOOLS CẦN THAY ĐỔI

Mọi DOT tool tạo entity governed PHẢI refactor theo QT-002:

  1. dot-content-create → thêm bước 1-2 trước INSERT
  2. dot-schema-* tạo collection → sau khi tạo xong, setup birth trigger
  3. DOT tools mới → PHẢI implement QT-002 từ đầu

Ước lượng: Refactor ~5-8 DOT tools. Có thể tạo 1 hàm shared fn_birth_first() để mọi DOT gọi.