RP DOT Cleanup — 03 DOT Rehearsal Results
03 — DOT Rehearsal Results
All rehearsal was read-only. No clone was needed: the cleanup operates on the live mapping view + governed truth, and the decisive blocker (no update-DOT) is a tooling fact, not a data-state question. A BEGIN..ROLLBACK rehearsal of UPDATEs was deliberately not run — it would model the Đ26-forbidden manual path and fire the pivot triggers inside the transaction. SQL: sql/03_rehearsal_readonly.sql.
R1 — Target-state preview (9 actionable rows)
| pivot_code | species | current_comp | target_comp | comp_status | current_group | lane | is_active |
|---|---|---|---|---|---|---|---|
| MTX-TEST | — | matrix | (null) | no_ref | test | inactive_retire | false |
| PIV-020 | — | atom | (null) | no_ref | default | inactive_retire | false |
| PIV-001 | catalog | molecule | atom | mismatch | cấu_trúc | gov_home | true |
| PIV-016 | species | atom | meta | mismatch | default | rp_local | true |
| PIV-021 | checkpoint_support | atom | molecule | mismatch | default | rp_local | true |
| PIV-015 | governance_infra | atom | atom | match | default | rp_local | true |
| PIV-017 | governance_infra | atom | atom | match | default | rp_local | true |
| PIV-018 | governance_infra | atom | atom | match | default | rp_local | true |
| PIV-019 | governance_infra | atom | atom | match | default | rp_local | true |
- Action A = the 3
mismatchrows; target_comp is the governed value. - Action D = the 2
inactive_retirerows — both alreadyis_active=false. - Action B default-bucketed candidates = PIV-015/017/018/019 (+ PIV-016/021).
R2 — Retire candidates are already inactive ⇒ DOT-314 is a no-op
| code | is_active | superseded_by | is_matrix |
|---|---|---|---|
| PIV-020 | false | NULL | false |
| MTX-TEST | false | deprecated | true |
dot-matrix-retire early-exits ("already retired") on is_active='f'. So it writes nothing for either. Note PIV-020's superseded_by is NULL and cannot be set via DOT-314 (the early-exit precedes the UPDATE) — a cosmetic gap, not a classification issue. Action D: already satisfied; nothing to execute.
R3 — Governed-truth anchor for Action A (entity_species)
| species_code | display_name | composition_level |
|---|---|---|
| catalog | Danh mục hệ thống | atom |
| checkpoint_support | Hỗ trợ Checkpoint | molecule |
| species | Loại | meta |
Confirms the 3 target compositions exactly: PIV-001→atom, PIV-021→molecule, PIV-016→meta.
R4 — Retire+recreate workaround is NON-VIABLE
Could Action A be done by dot-matrix-retire (retire the wrong row) + dot-pivot-declare (recreate with correct --level)? No:
| source_object | default-filter pivots | codes |
|---|---|---|
| meta_catalog | 1 | PIV-001 |
| entity_species | 2 | PIV-016, PIV-103 |
| task_comments | 1 | PIV-021 |
dot-pivot-declare's duplicate-guard matches on (source_object, filter_spec) without an is_active filter. After retiring PIV-001 it still EXISTS (soft delete), so re-declaring --source meta_catalog --filter '{"filters":[]}' finds PIV-001 → Already exists → creates nothing. Same for entity_species (PIV-103 also blocks) and task_comments. And even if it created, it would mint a new PIV code, breaking identity. ⇒ Retire+recreate is rejected as unbounded, identity-destroying, and self-blocking.
Rehearsal verdict
- ✅ Target state computed and anchored to governed truth.
- ✅ Action A/B confirmed unbindable (no update-DOT) — see doc 02.
- ✅ Action D confirmed already-done / no-op.
- ✅ Retire+recreate confirmed non-viable.
- ✅ Side effects characterized (future UPDATE fires only the refresh trigger).
- ✅ No event/system_issues/UI side effects possible from a read-only rehearsal.
Conclusion: there is no safe, lawful, bounded, reversible DOT mutation to execute in this macro. Proceed to HOLD (doc 04).