18c — IU Birth Trigger Install (Rev 2)
18c — IU Birth Trigger Install via DOT-119 v2
Controlling: 18a rev4 + 18b rev3 + P1+P2 PASS + GPT 18c directive Rev 2: IU-specific birth count (not total). Rollback via DOT-119 --drop nếu verify fail.
Bước 0: Đọc controlling docs
Đọc trên KB: 18a rev4, P2 report, GPT 18c directive. Xác nhận.
Bước 1: Preflight
DOT-119 v2 behavior
DOT119=/opt/incomex/dot/bin/dot-birth-trigger-setup
ls -la "$DOT119"; md5sum "$DOT119"
grep -cF 'CREATE OR REPLACE FUNCTION fn_birth_registry_auto' "$DOT119"
# Must: 0.
grep -c 'KNOWN_V2_FN_HASH' "$DOT119"
# Must: 0.
"$DOT119" --help
# Must: exit 0, v2.0.0
Metadata + table
SELECT collection_name, birth_code_strategy, birth_code_column, birth_identity_source
FROM collection_registry WHERE collection_name = 'information_unit';
-- Must: synthetic_id | NULL | manual
SELECT count(*) FROM information_schema.tables
WHERE table_schema='public' AND table_name='information_unit';
-- Must: 1.
SELECT count(*) FROM information_unit;
-- Must: 0.
SELECT count(*) FROM pg_trigger
WHERE tgname='trg_birth_information_unit' AND NOT tgisinternal;
-- Must: 0. Non-zero → STOP.
Baselines
SELECT md5(pg_get_functiondef('fn_birth_registry_auto'::regproc)) AS fn_hash_baseline;
SELECT count(*) AS trigger_count_baseline FROM pg_trigger
WHERE tgname LIKE 'trg_birth_%' AND NOT tgisinternal;
-- ★ Rev 2: IU-specific birth count (not total)
SELECT count(*) AS iu_birth_count_baseline FROM birth_registry
WHERE collection_name = 'information_unit';
-- Must: 0.
-- Total birth count (audit only, not gate)
SELECT count(*) AS total_birth_count_baseline FROM birth_registry;
Mismatch → STOP + partial report.
Bước 2: Dry-run
"$DOT119" --collection=information_unit --dry-run --json
Verify:
- strategy = synthetic_id
- args =
'__birth_synthetic_id__' - synthetic_capability = pass
- trigger_exists = false
- proposed_sql contains CREATE TRIGGER trg_birth_information_unit
- exit 0
Sai → STOP + partial report.
Bước 3: Execute
"$DOT119" --collection=information_unit --execute --json
Verify: status=success, exit 0. Fail → STOP + partial report.
Bước 4: DOT-119 verify
"$DOT119" --collection=information_unit --verify --json
Expected: status=verified, function=fn_birth_registry_auto, exit 0.
Nếu verify fail → rollback (Bước 4R).
Bước 5: Independent SQL verification
SELECT tgname, tgfoid::regproc AS func, pg_get_triggerdef(oid) AS def
FROM pg_trigger
WHERE tgname='trg_birth_information_unit' AND NOT tgisinternal;
Must:
- Exactly 1 row
- func = fn_birth_registry_auto
- def contains
'__birth_synthetic_id__'
Nếu fail → rollback (Bước 4R).
Bước 6: Post-verify invariants
SELECT md5(pg_get_functiondef('fn_birth_registry_auto'::regproc)) AS fn_hash_after;
-- Must = fn_hash_baseline. Drift → STOP CRITICAL.
SELECT count(*) AS trigger_count_after FROM pg_trigger
WHERE tgname LIKE 'trg_birth_%' AND NOT tgisinternal;
-- Must = trigger_count_baseline + 1.
-- ★ Rev 2: IU-specific birth count
SELECT count(*) AS iu_birth_count_after FROM birth_registry
WHERE collection_name = 'information_unit';
-- Must: 0 (trigger install doesn't create birth rows — chỉ INSERT mới fire trigger).
-- Total birth count (audit only)
SELECT count(*) AS total_birth_count_after FROM birth_registry;
-- Ghi audit. Không hard STOP nếu drift (bảng sống).
SELECT count(*) FROM information_unit;
-- Must: 0.
Trigger count ≠ baseline+1 → rollback (Bước 4R). IU birth count > 0 → STOP CRITICAL + partial report. fn hash drift → STOP CRITICAL.
Bước 4R: ★ Rev 2 — Rollback nếu post-install fail
echo "═══ ROLLING BACK IU TRIGGER ═══"
DOT119_ALLOW_DROP=1 "$DOT119" --collection=information_unit --drop --confirm-drop --json
Sau rollback verify:
SELECT count(*) FROM pg_trigger
WHERE tgname='trg_birth_information_unit' AND NOT tgisinternal;
-- Must: 0.
SELECT md5(pg_get_functiondef('fn_birth_registry_auto'::regproc));
-- Must = fn_hash_baseline.
SELECT count(*) FROM information_unit;
-- Must: 0.
SELECT count(*) FROM birth_registry WHERE collection_name='information_unit';
-- Must: 0.
Upload partial report ghi rollback_happened=yes + drop JSON + post-rollback verify.
Bước 7: Upload 18c report
Path: knowledge/dev/laws/dieu44-trien-khai/reports/iu-birth-trigger-install-18c-report.md
Report:
- Preflight (v2 behavior, metadata, baselines)
- Dry-run JSON
- Execute JSON
- Verify JSON
- Independent SQL trigger def
- fn hash trail
- Trigger count trail (baseline → +1)
- IU-specific birth count (0 → 0)
- Total birth count (audit, drift noted)
- IU row count (0 → 0)
- rollback_happened: yes/no
- Nếu rollback: drop JSON + post-rollback verify
- Hard boundaries confirmation
Bước 8: HARD STOP
No raw CREATE/DROP TRIGGER. No fn edit. No IU rows. No Pack 2B. No DDL. No P3/HC.
18c rev 2 | 2026-05-05 | Opus 4.6 | IU-specific birth check. DOT-119 rollback on verify fail.