P9 G6 — Source Extraction Note
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.mdmớ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:
- G6 phải dựng bao nhiêu bảng, từ nguồn nào?
- Mỗi bảng dùng cấu trúc gì (FK vocab vs CHECK enum)?
- Functions/triggers nào phải compile?
- Vocab seed values lấy từ đâu?
- Đ33 / Đ24 / Đ32 / Đ35 ràng buộc gì lên G6?
- Bài học S183 nào phải bake vào G6 ngay từ đầu?
- 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_flagGIỮ CHECK (3 values: normal/soft_limit/hard_limit) — không chuyển vocab.uv.vector_sync_statusGIỮ 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ênpublic.*.
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_tacschema - 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/csmrút gọn — G6 phải dùngtac_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):
- 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.
- P5 §5.2
vector_sync_statusenum hiện hành thiếu 'skip' (P5b đề xuất thêm). P8 §1.1 chú thích "Cầnskip→ amend P5 trước". G6 dùng enum hiện hành (4 values),skipchờ 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).