05 — Trigger-Policy Contradiction Reconciliation
05 — Trigger-Policy Contradiction Reconciliation
Live recount (validates Codex's ~78)
| class | count | action | owner |
|---|---|---|---|
| EXEMPT_BUT_TRIGGER_ACTIVE | 29 | gateway D neutralizes (births skipped); DROP trigger = cleanup. Priority entity_labels, registry_changelog | platform |
| DEFERRED_BUT_TRIGGER_ACTIVE | 50 | owner review: confirm REQUIRED or flip BIRTH_EXEMPT; gateway then governs. Do NOT mass-disable | collection-owner |
| REQUIRED_BUT_NO_TRIGGER | 5 | owner review: add trigger or reclassify | collection-owner |
| DUPLICATE_TRIGGER | 18 tables | DROP redundant birth_trigger_*, keep trg_birth_* after TG_ARGV-parity preflight |
platform |
| TRIGGER_ON_UNREGISTERED | 0 | none | — |
29 EXEMPT + 50 DEFERRED = 79 collections where an active trigger contradicts a non-REQUIRED policy ≈ Codex's 78.
Duplicate triggers (18 tables)
agents, checkpoint_sets, checkpoint_types, collection_registry, dot_tools, entity_dependencies, entity_species, meta_catalog, modules, system_issues, table_registry, tasks, taxonomy, taxonomy_facets, ui_pages, workflow_change_requests, workflow_steps, workflows — each carries both birth_trigger_* and trg_birth_* → fn_birth_registry_auto. Harmless (EXISTS-skip + ON CONFLICT) but redundant.
Why STAGED not applied
Trigger DDL requires reviewed migration (safety rule). Gateway D already makes exempt triggers harmless, so removal is non-urgent cleanup. The drop set + preflight is in STAGED_E_trigger_reconciliation_DO_NOT_APPLY.sql. Rollback for any drop = recreate the trigger (capture defs in preflight).
Views
v_birth_trigger_policy_contradictions_v2 (per-collection class), v_birth_trigger_reconciliation_plan (class → action/owner/severity), v_birth_trigger_reconciliation_no_go_guard (no DDL applied; gateway neutralizes; every contradiction has owner+action).