KB-430C rev 2

18c — IU Birth Trigger Install (Rev 2)

6 min read Revision 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.