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: PROHIBITED

Exact 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.

Back to Knowledge Hub knowledge/dev/laws/dieu44-trien-khai/v0.5-ws-q5-registry-substrate-ddl-authoring/dot-iu-cutter-v0.5-WS-Q5-registry-substrate-rollback-draft-2026-05-18.sql.md