Quy trình Khai sinh — v1.0 (QT-001 + QT-002)
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:
dot-content-create→ thêm bước 1-2 trước INSERTdot-schema-*tạo collection → sau khi tạo xong, setup birth trigger- 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.