KB-637B rev 5

P2B-P0 — IU Schema Inspection Read-Only Prompt

7 min read Revision 5
iu-0pack-2bp2b-p0schema-inspectionread-onlyprompt

P2B-P0 — IU Schema Inspection Read-Only Prompt

Date: 2026-05-05 | Status: PROMPT rev2 — sẵn sàng dispatch Controlling: Pack 2B design (file 19) + GPT handoff Pack 2B directive + GPT review rev1 Scope: READ-ONLY schema inspection. Không DDL, không INSERT, không mutation.


§0. Mission

Inspect actual PG schema của information_unitunit_version tables. Upload report. HARD STOP.

Mục đích: Thu thập schema thật để build exact INSERT payloads cho P2B-P1. Không đoán columns từ trí nhớ. Không tạo IU rows. Không sửa gì.


§1. Connection

docker exec -i postgres psql -U directus -d directus

§2. Queries — chạy lần lượt, capture output đầy đủ

Q1: information_unit columns

SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_schema='public' AND table_name='information_unit'
ORDER BY ordinal_position;

Q2: unit_version columns

SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_schema='public' AND table_name='unit_version'
ORDER BY ordinal_position;

Q3: information_unit constraints

SELECT conname, contype, pg_get_constraintdef(oid)
FROM pg_constraint
WHERE conrelid='information_unit'::regclass
ORDER BY conname;

Q4: unit_version constraints

SELECT conname, contype, pg_get_constraintdef(oid)
FROM pg_constraint
WHERE conrelid='unit_version'::regclass
ORDER BY conname;

Q5: information_unit triggers

SELECT tgname, tgfoid::regproc AS func, pg_get_triggerdef(oid) AS def
FROM pg_trigger
WHERE tgrelid='information_unit'::regclass AND NOT tgisinternal
ORDER BY tgname;

Q6: unit_version triggers

SELECT tgname, tgfoid::regproc AS func, pg_get_triggerdef(oid) AS def
FROM pg_trigger
WHERE tgrelid='unit_version'::regclass AND NOT tgisinternal
ORDER BY tgname;

Q7: Current counts (baselines)

SELECT 'information_unit' AS tbl, count(*) AS cnt FROM information_unit
UNION ALL
SELECT 'unit_version', count(*) FROM unit_version
UNION ALL
SELECT 'iu_birth', count(*) FROM birth_registry WHERE collection_name='information_unit'
UNION ALL
SELECT 'uv_birth', count(*) FROM birth_registry WHERE collection_name='unit_version';

Q8: IU collection metadata

SELECT collection_name, governance_role, birth_code_strategy,
       birth_code_column, birth_identity_source, description_policy
FROM collection_registry
WHERE collection_name IN ('information_unit','unit_version')
ORDER BY collection_name;

Q9: Function hash + trigger count audit

SELECT md5(pg_get_functiondef('fn_birth_registry_auto'::regproc)) AS fn_hash;
SELECT count(*) AS birth_trigger_count
FROM pg_trigger WHERE tgname LIKE 'trg_birth_%' AND NOT tgisinternal;

Q10: RLS policies (Opus bổ sung — nếu có RLS thì INSERT sẽ bị ảnh hưởng)

SELECT tablename, policyname, cmd, qual
FROM pg_policies
WHERE tablename IN ('information_unit','unit_version');

Q10b: RLS table flags (GPT bổ sung — phát hiện RLS enabled kể cả khi chưa có policy)

SELECT relname, relrowsecurity, relforcerowsecurity
FROM pg_class
WHERE relname IN ('information_unit','unit_version');

Q11: FK references TO these tables (ai tham chiếu IU/UV)

SELECT
  c.conname AS fk_name,
  src.relname AS source_table,
  tgt.relname AS target_table,
  pg_get_constraintdef(c.oid) AS definition
FROM pg_constraint c
JOIN pg_class src ON c.conrelid = src.oid
JOIN pg_class tgt ON c.confrelid = tgt.oid
WHERE c.contype = 'f'
  AND tgt.relname IN ('information_unit','unit_version')
ORDER BY source_table, fk_name;

§3. Report format

Upload report tại: knowledge/dev/laws/dieu44-trien-khai/reports/19-p2b-p0-iu-schema-inspection-report.md

Report phải có các section sau:

§3.1 Actual columns

  • Bảng columns đầy đủ cho cả IU và UV
  • Đánh dấu rõ: cột nào NOT NULL mà KHÔNG có default → bắt buộc trong INSERT payload

§3.2 Constraints summary

  • PK, FK, UNIQUE, CHECK constraints
  • FK references ĐẾN IU/UV (ai phụ thuộc)

§3.3 Triggers summary

  • Triggers trên IU: phải thấy trg_birth_information_unit
  • Triggers trên UV: ghi nhận có/không birth trigger

§3.4 Current counts (baselines)

  • IU rows, UV rows, IU birth rows, UV birth rows
  • IU rows và IU birth rows expected = 0 (evidence: 18c report)
  • UV rows và UV birth rows: capture baseline. Nếu non-zero → flag cho GPT/User review, không tự coi là failure trừ khi có design evidence bắt buộc UV phải empty

§3.5 Collection metadata

  • birth_code_strategy, birth_code_column, birth_identity_source cho cả IU và UV
  • description_policy

§3.6 Audit invariants

  • fn_birth_registry_auto hash
  • Birth trigger count

§3.7 RLS status

  • Có policy nào không? Nếu có → ghi rõ impact lên INSERT

§3.8 Minimum INSERT payload — candidate fields

Phân tích từ actual schema (KHÔNG từ trí nhớ):

  • Liệt kê tất cả NOT NULL columns không có default → PHẢI có trong INSERT
  • Liệt kê columns có default → có thể bỏ qua
  • Liệt kê nullable columns → optional
  • Đề xuất minimum valid INSERT payload shape cho 1 pilot IU row
  • Đề xuất unit_version row shape nếu cần (hoặc ghi nhận UV là subordinate)

§3.9 Risks / blockers trước P2B-P1

  • FK dependencies chưa có data?
  • Enum/vocab columns cần giá trị hợp lệ?
  • Trigger side effects?
  • Bất kỳ vấn đề nào có thể block pilot INSERT

§3.10 Hard-stop confirmation

Ghi rõ: "P2B-P0 COMPLETE. HARD STOP. Chờ GPT/User review trước P2B-P1."


§4. Hard boundaries — TUYỆT ĐỐI

  • ❌ NO DDL (no ALTER, no CREATE TABLE, no CREATE INDEX)
  • ❌ NO INSERT / UPDATE / DELETE
  • ❌ NO IU rows, NO UV rows
  • ❌ NO trigger/function edits
  • ❌ NO DOT-119 execute
  • ❌ NO Pack 2B CRUD
  • ❌ NO vector/outbox/Qdrant
  • ❌ NO Directus exposure
  • ❌ NO P3/HC
  • ❌ NO schema changes of any kind

Nếu bất kỳ query nào trả lỗi → ghi nguyên lỗi vào report, KHÔNG sửa.


§5. Sau report

Upload report → DỪNG. Không draft P2B-P1. Không tiếp tục. Chờ review.


P2B-P0 prompt rev2 | 2026-05-05 | Opus 4.6 + GPT review | Read-only schema inspection. 12 queries. HARD STOP.

Back to Knowledge Hub knowledge/dev/laws/dieu44-trien-khai/prompts/19-p2b-p0-iu-schema-inspection-readonly-prompt.md