KB-7B03

P9 G6 — Source Extraction Note

19 min read Revision 1
dieu38p9g6source-extractiontier3s184

P9 G6 — Source Extraction Note

Loại: Source-of-Truth extraction summary cho G6 Migration Dry-run Phase: P9 Entry Gate, Tier 3, G6 Trạng thái: DRAFT v0.1 — chờ GPT review Phiên: S184 | Ngày: 2026-04-27 Scope: Doc-only extraction. KHÔNG DDL/DML. KHÔNG soạn DDL thật ở đây — file kế tiếp P9-G6-dry-run-package.md mới chứa DDL plan. Inputs đã đọc đầy đủ: P5 v0.2, P5b v0.2, P6 v0.2, P7 v0.2, P8 v0.4, P9 Tier 3 Readiness Package, handoff S183→S184.


1. Mục tiêu

Trước khi soạn G6 dry-run package, gom mọi nguồn SoT vào một bản tóm tắt — để package kế tiếp khỏi phải mò lại nguồn và để GPT/User dễ kiểm tra package có bám đúng SoT hay không.

Bản tóm tắt này trả lời:

  1. G6 phải dựng bao nhiêu bảng, từ nguồn nào?
  2. Mỗi bảng dùng cấu trúc gì (FK vocab vs CHECK enum)?
  3. Functions/triggers nào phải compile?
  4. Vocab seed values lấy từ đâu?
  5. Đ33 / Đ24 / Đ32 / Đ35 ràng buộc gì lên G6?
  6. Bài học S183 nào phải bake vào G6 ngay từ đầu?
  7. Sandbox P7 cung cấp baseline gì?

2. 14 production tables — nguồn cụ thể

Theo P8 §1.4 (OFFICIAL v0.4):

# Bảng Nhóm Nguồn DDL gốc Production hardening (P8)
1 tac_lu_lifecycle_vocab Vocab — lifecycle P5 §5.1 (CHECK enum 3 values: active/draft_only/retired) P8 §1.1: chuyển CHECK → vocab table, FK từ logical_unit. NT4.
2 tac_uv_lifecycle_vocab Vocab — lifecycle P5 §5.2 (CHECK enum 4 values: draft/enacted/superseded/retired) P8 §1.1: chuyển CHECK → vocab table, FK từ unit_version.
3 tac_review_state_vocab Vocab — lifecycle P5 §5.2 (CHECK enum 5 values: unreviewed/in_review/review_passed/review_failed/needs_re_review) P8 §1.1: chuyển CHECK → vocab table.
4 tac_pub_lifecycle_vocab Vocab — lifecycle P5 §5.3 (CHECK enum 4 values: proposed/enacted/superseded/retired) P8 §1.1: chuyển CHECK → vocab table.
5 tac_cs_lifecycle_vocab Vocab — lifecycle P5 §5.7 (CHECK enum 7 values: draft/submitted/review_passed/approval_passed/enacted/rejected/withdrawn) P8 §1.1: chuyển CHECK → vocab table. OD-P8-05 (cs lifecycle 7 values enough?).
6 tac_section_type_vocab Vocab — type P5 §5.5 (full DDL — code PK + lifecycle + length thresholds + birth gate flags) P5 nguyên trạng + thêm prefix tac_.
7 tac_publication_type_vocab Vocab — type P5 §5.6 (full DDL — code PK + lifecycle + default_risk_tier) P5 nguyên trạng + thêm prefix tac_.
8 tac_birth_gate_config Config P8 §1.1 (DDL mới: checker_id PK + mode TEXT DEFAULT 'block' + enabled BOOLEAN DEFAULT TRUE) P8 §2.3: per-checker tiered enforcement. NT4.
9 tac_logical_unit Core P5 §5.1 P8 §1.1: lifecycle_status thành FK vào tac_lu_lifecycle_vocab. canonical_address UNIQUE giữ.
10 tac_unit_version Core P5 §5.2 P8 §1.1: lifecycle_status thành FK tac_uv_lifecycle_vocab, review_state thành FK tac_review_state_vocab. length_flag + vector_sync_status GIỮ CHECK (P8 chú thích "Cố định technical").
11 tac_publication Core P5 §5.3 P8 §1.1: lifecycle_status thành FK tac_pub_lifecycle_vocab, publication_type thành FK tac_publication_type_vocab.
12 tac_publication_member Core P5 §5.4 P5 nguyên trạng + thêm prefix tac_. UNIQUE (publication_id, logical_unit_id) giữ.
13 tac_change_set Hook P5 §5.7 P8 §1.1: lifecycle_status thành FK tac_cs_lifecycle_vocab.
14 tac_change_set_member Hook P5 §5.8 P5 nguyên trạng + thêm prefix tac_.

Tổng: 5 lifecycle vocab + 2 type vocab + 1 config + 4 core + 2 change-set hook = 14 tables.

Lưu ý quan trọng (P8 §1.1):

  • uv.length_flag GIỮ CHECK (3 values: normal/soft_limit/hard_limit) — không chuyển vocab.
  • uv.vector_sync_status GIỮ CHECK (4 values: pending/synced/stale/error) — P5 enum hiện hành. Cần thêm 'skip' → phải amend P5 trước (out of G6 scope).

3. Functions/triggers cần compile

Theo P8 §2.3/§2.4 + P5 §5.2/§5.4/§7.1 + P6 BG-* / PE-* / DOT-*.

3.1 Bắt buộc compile trong G6

Function Trigger event Mục đích Nguồn
fn_tac_uv_compute_derived BEFORE INSERT/UPDATE on tac_unit_version Compute content_hash (sha256 của title+body+description+content_profile) + length_flag (so word count với section_type_vocab thresholds) P8 §2.4, P5 §5.2
fn_tac_birth_gate_lu BEFORE INSERT on tac_logical_unit BG-LU-01→06: address unique, doc_code valid, parent same doc, section_type active, owner present, sort_order valid P6 §4.1, P5 §12.1
fn_tac_birth_gate_uv BEFORE INSERT on tac_unit_version BG-UV-01→06: title present, description per config, body per config, required profile per config, length_flag set, provenance valid P6 §4.1, P8 §2.3 (đọc tac_section_type_vocab + tac_birth_gate_config)
fn_tac_enacted_immut BEFORE UPDATE/DELETE on tac_unit_version Block sửa body/title/description/content_profile khi lifecycle='enacted' P5 §5.2 rule 2, INV-ENACTED-IMMUT
fn_tac_pm_consistency BEFORE INSERT/UPDATE on tac_publication_member Verify unit_version.logical_unit_id = publication_member.logical_unit_id P5 §5.4 rule 1, INV-PM-CONSISTENCY
fn_tac_pm_enacted_lock BEFORE INSERT/UPDATE/DELETE on tac_publication_member Block thay đổi khi publication.lifecycle_status='enacted' P5 §5.4 rule 2c, INV-ENACTED-PUB

3.2 Defer khỏi G6 (compile-only check)

Function Lý do defer
fn_tac_supersede_uv (auto-supersede old enacted) Behavior test cần seed thật + INSERT thật → defer post-G6, đặt vào G6+1 hoặc P9 thật
fn_tac_pre_enact_pub (PE-PUB-01→06) Pre-enactment gate — gọi từ application/transition function khi pub→enacted, không phải PG trigger natural. Defer behavior test.
fn_tac_log_checker_issue Đã tồn tại trên public (S183 E-R3). G6 KHÔNG đụng.

3.3 Quy tắc cho G6 compile

  • Compile-only: function body có thể chứa logic skeleton (RAISE EXCEPTION + comment). Quan trọng là PL/pgSQL parse PASS, signature đúng, trigger ATTACH thành công lên table.
  • Behavior verify: defer post-G6.
  • Trigger ATTACH: trên schema isolated p9_g6_dryrun.* — không bao giờ ATTACH lên public.*.

4. Vocab seed values — nguồn cụ thể

Mỗi vocab table cần seed initial values để FK trong core tables tham chiếu được. Seed phải có SHA-256 hash + KB source reference theo P8 §8.2 (Sandbox = evidence, NOT SoT; KB OFFICIAL snapshot = SoT).

Vocab table Initial seed values Nguồn KB
tac_lu_lifecycle_vocab active, draft_only, retired P5 §5.1 CHECK enum
tac_uv_lifecycle_vocab draft, enacted, superseded, retired P5 §5.2 CHECK enum
tac_review_state_vocab unreviewed, in_review, review_passed, review_failed, needs_re_review P5 §5.2 CHECK enum
tac_pub_lifecycle_vocab proposed, enacted, superseded, retired P5 §5.3 CHECK enum
tac_cs_lifecycle_vocab draft, submitted, review_passed, approval_passed, enacted, rejected, withdrawn P5 §5.7 CHECK enum
tac_section_type_vocab 17 candidates (heading, article, paragraph, definition, principle, rationale, process, technical_spec, governance_process, checklist, instruction_block, reference_mapping, matrix, invariant_list, open_decision_list, appendix, changelog) — với length thresholds + body_required + description_required mặc định P5 §5.5, C1A §6
tac_publication_type_vocab 10 candidates (law, policy, sop, constitution, knowledge, design_note, report, memo, draft, working) — với default_risk_tier P5 §5.6, C1A §11.3
tac_birth_gate_config Mỗi checker_id (BG-LU-02→06, BG-UV-02→06) một dòng với mode='block' / 'warn' theo P8 §2.3 tiered table P8 §2.3 birth gate tiered enforcement

Hash chain: Mỗi seed plan = 1 file seed-{vocab_name}.sql (read-only) → SHA-256 hash → ghi vào package §6. Re-run dry-run phải verify hash khớp.


5. Đ33 (PG Law) compliance path cho G6

Theo P8 §9 + Đ33 §0.1:

Hoạt động Path Đ33 cho G6
CREATE SCHEMA p9_g6_dryrun E1 exception (DDL bootstrap), action log bắt buộc
CREATE TABLE/INDEX/CONSTRAINT trong p9_g6_dryrun.* E1 exception, action log bắt buộc
CREATE FUNCTION trong p9_g6_dryrun.* E1 exception (function trong schema isolated, không phải public)
CREATE TRIGGER ATTACH lên p9_g6_dryrun.* E1 exception
INSERT seed vào vocab tables p9_g6_dryrun.* E1 bootstrap (không phải DML thường — one-time only, action log)
Verify (SELECT count, SELECT FK constraints, etc.) Read-only, không cần E1
ROLLBACK: DROP SCHEMA p9_g6_dryrun CASCADE E1 exception
Mọi thao tác trên public.tac_* CẤM (G6 hard exclusion)
Directus role/permission/collection mutation CẤM (thuộc G8, không phải G6)
Production DML (INSERT INTO public.system_issues, etc.) CẤM

Connection identity: Theo bài học S183 E-R3, dùng .env + $DB_USER qua psql — KHÔNG hardcode -U directus.


6. Đ24 (Label Law) ràng buộc lên G6

Đ24 yêu cầu G6 status
FAC-07/08/09 (doc/topic/layer) phải tồn tại trong production taxonomy_facets ✅ E5 đã PASS (S183) — facets có ids 8/9/10. G6 KHÔNG cần tạo lại.
Labels chỉ ở entity_labels, không tạo registry song song G6 KHÔNG ghi entity_labels (hard exclusion). Tạo bảng tac_* trong schema isolated KHÔNG phải parallel registry — đây là core data tables, không phải label registry.
entity_code format = tac_logical_unit.canonical_address G6 verify regex constraint trên tac_logical_unit.canonical_address (BG-LU-01) khi compile birth gate function. Behavior test = post-G6.
provenance map vào FAC-PROV vocab G6 KHÔNG seed entity_labels. Birth gate UV-06 chỉ compile, không verify behavior.

7. Đ32 (APR) ràng buộc lên G6

Đ32 yêu cầu G6 status
Mọi structural change phải qua change-set + APR G6 = isolated schema dry-run, không phải structural change đối với production. Vẫn cần GPT supervision PASS + User authorization.
change_set.apr_ref opaque reference G6 chỉ tạo bảng tac_change_set, KHÔNG INSERT change-set thật.
APR readiness check tại pre-enact gate Defer — function fn_tac_pre_enact_pub không bắt buộc compile trong G6 (§3.2).

8. Đ35 (DOT Law) — references đã sẵn sàng

Đ35 yêu cầu G6 status
19 DOT-TAC-* registered trong dot_tools ✅ E7 đã PASS (S183) — ids 971–989. G6 KHÔNG đăng ký lại.
Adapter dot-dot-register v0.2 hoạt động ✅ E7 PASS. G6 KHÔNG đụng.
DOT phải approved theo Đ35 trước khi gọi function G6 không gọi DOT function thật — chỉ verify schema/DDL/compile.
Cấp B (executor) paired Cấp A (verifier) G6 = SCHEMA-ENSURE (B) + SCHEMA-VERIFY (A). Cả hai DOT đều registered.

9. P5b (Component/BOM) DEFER xác nhận

Theo P8 §7 + handoff §3.2:

  • P5b 10 tables (component, component_version, bom_entry, reuse_decision, compatibility_rule, governance_status_vocab, usage_type_vocab, component_type_vocab, component_pg_ref, change_set_subject) + 2 phase 2 (golden_path, golden_path_member) KHÔNG include trong G6.
  • G6 chỉ dựng 14 tables P5 production-faithful.
  • P5b sẽ vào round 2 sau khi P9 production migration của P5 PASS.

10. P7 sandbox baseline — tham khảo

P7 pilot execution (S182, P7A→P7C) đã chứng minh:

  • 76 logical units segmented byte-exact (3 docs: HOWTO, C1A, P5)
  • Schema P5 v0.2 + P5b v0.2 hoạt động trên sandbox_tac schema
  • 0 violations, round-trip preserved

G6 dùng baseline sandbox như tài liệu tham khảo:

  • Tên bảng + cột (sandbox_tac có thể dùng lu/uv/pub/pm/cs/csm rút gọn — G6 phải dùng tac_logical_unit/tac_unit_version/... đầy đủ theo P8).
  • Constraint logic (FK chain, INV-PM-CONSISTENCY, INV-RETIRE) đã verify ở sandbox.
  • Seed pattern (vocab values, section_type list) đã verify ở sandbox.

Rủi ro reuse sandbox: sandbox dùng CHECK enum (P5 design notation), G6 production dùng FK vocab (P8 §1.1 hardening). Không copy DDL trực tiếp — phải re-author DDL với FK vocab.


11. Bài học S183 cần bake vào G6 ngay từ đầu

Theo handoff §5 + reports/p9-e7-d4-failed-attempt-log:

# Bài học S183 G6 áp dụng
1 Schema-qualify mọi nơi (public.fn_* trong CREATE/ALTER/DROP/verify) G6 dùng p9_g6_dryrun.* cho mọi statement. KHÔNG bao giờ reference tac_* mà không có schema prefix.
2 §0-AU CẤM hardcode credentials DDL script dùng .env + $DB_USER qua psql connection. KHÔNG hardcode -U directus.
3 AP-DRY-RUN-FK: Dry-run PHẢI verify FK vocabulary constraints, không chỉ logic G6 §4 (Pre-flight) verify EVERY FK target value tồn tại trong vocab table TRƯỚC khi tạo core tables tham chiếu.
4 AP-APR-SCOPE: APR scope phải khớp exact mutation G6 dry-run scope = chỉ schema isolated. KHÔNG mở rộng sang production hoặc Directus dù tiện.
5 GPT SUPERVISION PASS = đủ authority cho dry-run, không hỏi User liên tục G6 package gửi GPT review trước. User chỉ duyệt mục tiêu ban đầu (đã duyệt) và go/no-go cuối G6 PASS.
6 E-R3 prompt v0.4 cần 3 vòng GPT (14 patches) — phức tạp tăng theo độ chi tiết G6 package dự kiến 2-3 vòng GPT review. Patch log ghi rõ.

12. Pre-flight checks bắt buộc trước khi run G6 dry-run

Theo bài học #3 (AP-DRY-RUN-FK), G6 package PHẢI có pre-flight verify:

# Check Method Expected
1 Schema p9_g6_dryrun chưa tồn tại SELECT 1 FROM information_schema.schemata WHERE schema_name='p9_g6_dryrun' Empty (nếu có → DROP CASCADE trước)
2 Production public.tac_* chưa tồn tại SELECT count(*) FROM information_schema.tables WHERE table_schema='public' AND table_name LIKE 'tac\_%' 0 (nếu >0 → STOP, BLOCKER)
3 FAC-07/08/09 sẵn trong production taxonomy_facets Directus API GET 3 facets, ids 8/9/10, all active
4 19 DOT-TAC-* sẵn trong dot_tools Directus API GET 19 rows, ids 971–989, all active
5 public.fn_tac_log_checker_issue tồn tại SELECT proname FROM pg_proc WHERE proname='fn_tac_log_checker_issue' 1 row
6 Backup gần nhất (Đ-43 §X backup) rclone GDrive 4x/day check Last backup < 6h
7 TRIGGER-GUARD informational mode (C2A) Verify nó không BLOCK CREATE SCHEMA Permits

Nếu BẤT KỲ check fail → STOP, ghi blocker, không tự fix.


13. Open decisions (cho GPT decide trong G6 package review)

Code Câu hỏi Đề xuất Opus
OD-G6-01 Function body: skeleton (RAISE NOTICE) hay full logic? Skeleton + comment chi tiết. Behavior test post-G6.
OD-G6-02 Vocab seed: minimal (đủ FK) hay full (17 section_type + 10 pub_type)? Full — vì FK reference từ core có thể trỏ tới bất kỳ value nào, seed thiếu = false-positive PASS.
OD-G6-03 Constraint test: chỉ verify exist, hay test violation (INSERT trái constraint expect ERROR)? Verify exist + test 1 violation per constraint type (UNIQUE, FK, CHECK, NOT NULL) để chứng minh constraint bind đúng.
OD-G6-04 Rollback verify: count residue or fresh schema check? Cả hai — DROP SCHEMA p9_g6_dryrun CASCADE + verify information_schema zero rows trong p9_g6_dryrun.*.
OD-G6-05 Action log path: reports/p9-g6-execution-log-{date}.md hay dot_action_log table? Cả hai — markdown report cho human review, dot_action_log cho system audit (theo Đ35).
OD-G6-06 Agent assignment: Codex (codex-webtest) hay Claude CLI (claude-go)? Claude CLI — DDL phức tạp, cần plan-then-execute pattern phù hợp Claude CLI hơn. Codex tốt cho quick edit/verify.

14. Đối chiếu luật (constitutional check sơ bộ)

Nguyên tắc / Luật Verdict G6 Note
NT1/NT13 — PG SoT PASS G6 tạo schema PG isolated, không phá SoT production.
NT2 — Cơ chế máy PASS G6 verify constraint/FK/trigger compile = cơ chế máy hoạt động.
NT4 — Config not hardcode PASS Vocab tables + birth_gate_config = config path.
NT8 — Scale PASS Index design theo P5 (idx_lu_doc_code, idx_uv_logical_unit, etc.).
NT11 — Khai tối thiểu PASS Tables = core data, không tạo registry song song với entity_labels.
Đ24 PASS Facets đã có (E5). G6 không ghi entity_labels.
Đ32 PASS change_set hooks tạo, không INSERT thật.
Đ33 PASS có điều kiện E1 exception cho DDL trong schema isolated. Action log bắt buộc.
Đ35 PASS DOTs đã registered (E7). G6 = SCHEMA-ENSURE (B) + SCHEMA-VERIFY (A) paired.
§0-AU không hardcode PASS DDL script dùng .env + $DB_USER.
§0-AY không register=vô hình PASS G6 schema = test isolated, không phải production entity, không cần register. ROLLBACK xóa sạch.

15. Output map cho G6 package (file kế tiếp)

File P9-G6-dry-run-package.md sẽ chứa:

Section Content nguồn từ extraction note này
§1 Mục tiêu §1 (note này)
§2 Scope/Out-of-scope §1 + §11
§3 Target schema design §10 (sandbox baseline) + §11 (schema-qualify)
§4 Pre-flight checks §12
§5 DDL plan — 14 tables full §2 + §4
§6 Functions/triggers §3
§7 Seed plan + SHA-256 §4
§8 Verification plan §3 + §13 OD-G6-03
§9 Rollback plan §13 OD-G6-04
§10 Hard exclusions §11 + §5
§11 Bài học S183 áp dụng §11 (note này)
§12 Đối chiếu luật §14
§13 Risk register (mới — soạn trong package)
§14 Open decisions §13
§15 PASS/FAIL criteria (mới — soạn trong package theo handoff §3.4)
§16 Sequence post-G6 (mới — G8 → G11)

16. PASS criteria cho extraction note này

# Criterion Status
1 14 tables xác định từ P8 §1.4 với nguồn DDL gốc ✅ §2
2 Functions/triggers cần compile xác định ✅ §3
3 Vocab seed values với KB source xác định ✅ §4
4 Đ33/Đ24/Đ32/Đ35 compliance path xác định ✅ §5–§8
5 P5b DEFER xác nhận ✅ §9
6 P7 sandbox baseline note ✅ §10
7 Bài học S183 áp dụng ✅ §11
8 Pre-flight checks list ✅ §12
9 Open decisions cho GPT ✅ §13
10 Constitutional check sơ bộ ✅ §14
11 Output map cho package ✅ §15
12 Không DDL/DML trong note này ✅ Doc-only

17. Blocker phát hiện trong quá trình extract

Không có blocker cứng. 6 open decisions (§13) là câu hỏi cần GPT chốt trong G6 package review, không phải mâu thuẫn schema.

Mâu thuẫn nhỏ phát hiện (đã ghi nhận, không block):

  1. P8 §3.2 header nói "8B + 11A = 19 DOTs" nhưng table thực tế = 7B + 12A = 19 (handoff §4 cũng nêu). Không ảnh hưởng G6 vì DOTs đã registered.
  2. P5 §5.2 vector_sync_status enum hiện hành thiếu 'skip' (P5b đề xuất thêm). P8 §1.1 chú thích "Cần skip → amend P5 trước". G6 dùng enum hiện hành (4 values), skip chờ amend P5.

P9 G6 Source Extraction Note v0.1 | DRAFT | S184 | 2026-04-27 | Opus 4.7 Chờ GPT review → tiến hành G6 dry-run package (file kế tiếp).