KB-45A0
dot-iu-cutter v0.5 WS-Q5 Registry Substrate — Rollback Draft (exact inverse; NOT executed)
6 min read Revision 1
dot-iu-cutterv0.5ws-q5registry-substraterollback-draftauthoring-onlynot-executedno-cascadedieu442026-05-18
dot-iu-cutter v0.5 WS-Q5 Registry Substrate — Rollback Draft
Phase:
v0_5_WS_Q5_registry_substrate_DDL_authoring· Nature:executable_DDL_authoring_only__no_execution· Date: 2026-05-18 Pairs with:…-WS-Q5-registry-substrate-DDL-draft-2026-05-18.sql.md⚠️ GATING BANNER
phase: executable_DDL_authoring_only sql_executed: none # QG2 — rollback authored, NOT run rollback_executed: false cascade_used: false # QG3 — no CASCADE execution_authorized: false self_advance: PROHIBITEDExact inverse of the DDL draft. DO NOT EXECUTE. DROP order = strict reverse of create order so every FK child is dropped before its parent — no CASCADE required and none used (QG3).
1. Pre-state assumption & data-exists doctrine
designed_for: the FIRST apply, where all 12 registry tables are freshly created
and EMPTY (config tables, no DML seed in this package).
empty_table_case: exact-inverse DROP TABLE is the true inverse and fully safe.
data_exists_case (future, after seed/use):
- DO NOT hard-DROP a registry that holds governed config rows.
- Prefer: set row-level `lifecycle='deprecated'` (append-only audit trail),
supersede with corrected rows, OR quarantine writes — per project
no-hard-delete doctrine + verification-and-rollback master plan §2.5.
- A structural rollback that must drop a non-empty registry is an
ESCALATION to GPT/User, not an automatic step.
guardrail: command-review MUST capture a pre-state snapshot before any apply;
every rollback step is itself command-review-gated (NOT auto-run).
2. Rollback DDL — exact inverse (DO NOT EXECUTE)
-- ============================================================================
-- dot-iu-cutter v0.5 WS-Q5 Registry Substrate ROLLBACK (AUTHORING ONLY — DO NOT RUN)
-- Exact inverse of DDL draft. Reverse dependency order. NO CASCADE.
-- Precondition for safe hard-drop: target tables EMPTY (first-apply rollback).
-- If any target holds rows -> STOP, escalate (use lifecycle=deprecated instead).
-- ============================================================================
-- Reverse of create step 12 .. 1 (children already independent / dropped first)
DROP TABLE cutter_governance.metadata_key_registry; -- inverse of create 12
DROP TABLE cutter_governance.authority_override; -- inverse of create 11
DROP TABLE cutter_governance.entity_reference_registry; -- inverse of create 10 (FK -> entity_kind_registry)
DROP TABLE cutter_governance.entity_kind_registry; -- inverse of create 9
DROP TABLE cutter_governance.source_document_version_registry; -- inverse of create 8 (FK -> source_document_registry)
DROP TABLE cutter_governance.source_document_registry; -- inverse of create 7 (FK -> source_family_registry)
DROP TABLE cutter_governance.source_family_registry; -- inverse of create 6 (FK -> grammar_profile)
DROP TABLE cutter_governance.grammar_profile_status_marker; -- inverse of create 5 (FK -> grammar_profile)
DROP TABLE cutter_governance.grammar_profile_level; -- inverse of create 4 (FK -> grammar_profile, matcher_config_registry)
DROP TABLE cutter_governance.grammar_profile; -- inverse of create 3 (FK -> address_template_registry)
DROP TABLE cutter_governance.address_template_registry; -- inverse of create 2
DROP TABLE cutter_governance.matcher_config_registry; -- inverse of create 1
-- No CASCADE. Each DROP succeeds because all referencing children were dropped
-- earlier in this script. Constraints (pk_/fk_/uq_) drop implicitly WITH their
-- owning table only — no separate constraint DROP needed, no orphan left.
-- END ROLLBACK (12 DROP TABLE; 0 CASCADE; 0 data assumed)
3. Inverse-correctness proof (catalog-level intent)
create_order: 1 mcr -> 2 atr -> 3 gp -> 4 gpl -> 5 gpsm -> 6 sfr -> 7 sdr -> 8 sdvr -> 9 ekr -> 10 err -> 11 ao -> 12 mkr
rollback_order: 12 mkr -> 11 ao -> 10 err -> 9 ekr -> 8 sdvr -> 7 sdr -> 6 sfr -> 5 gpsm -> 4 gpl -> 3 gp -> 2 atr -> 1 mcr
property: rollback_order == reverse(create_order) -> every FK child dropped
before its FK parent -> DROP TABLE valid WITHOUT CASCADE for all 12.
post_rollback_expected: cutter_governance back to its pre-apply 12 tables;
the 12 new objects + all pk_/fk_/uq_ constraints absent; existing tables,
PKs, FKs, sysid UNCHANGED; zero data loss (tables were empty).
no_check/trigger/default/sequence created -> none to reverse.
4. Statements
- QG2: nothing executed. QG3: rollback is exact inverse, reverse-ordered, no CASCADE, no default/trigger/sequence to reverse; non-empty-table case routes to deprecate/escalate, not hard drop.
- No DML, no Directus mutation, no privilege/role change reversal (none authored in DDL).
- No repo/VPS access in this session.
code_changed: false,commit_made: false. - Self-advance PROHIBITED — doc 2 of 5; STOP after package complete → route GPT/User.
Companion files: DDL-draft, verification-plan, design-delta-and-open-decisions, DDL-authoring-report.