RP DOT Pivot-Update — 01 State Recovery + Live Preflight
01 — State Recovery + Live Preflight
State recovered (read, not guessed)
- GPT review
gpt-review-rp-dot-cleanup-partial-dot-update-gap-next-author-and-cleanup-macro-2026-06-03.md— confirmed the true blocker: existing pivot DOT tools cannot UPDATE classification fields on an existing row. - Prior packages (DOT cleanup partial; classification cleanup + view apply; governance attach) — the mapping view
v_rp_classification_governance_mapis LIVE in prod and the cleanup remained: 3 composition fixes, 12 naming, 2 retire. - Đ26 v4.0 Pivot Law §II-QUINQUIES — pivot mutation via DOT only ("KHÔNG INSERT tay"); 1F: pivot_results refresh by cron + PG trigger is the designed auto-update; §II-TER + Đ3: every DOT must carry a
description. - Đ35 DOT Governance v5.2 +
law_dot_enforcement— laws map to enforcing DOT codes (executor/auditor); registration of DOT tools is governed. - Live DOT scripts at
/opt/incomex/dot/bin/read directly via ssh (read_file denies dot/bin):TEMPLATE-DOT-SCRIPT,dot-pivot-declare,dot-matrix-update,dot-matrix-retire,dot-dot-register,dot-misclass-scanner,config/environment.sh.
Exact DOT gap (confirmed)
| Tool | Code | Can it update composition_level/species/registry_group on an existing row? |
|---|---|---|
| dot-pivot-declare | DOT-113 | No — INSERT-only (dup-guarded on source_object+filter_spec) |
| dot-matrix-update | DOT-313 | No — touches matrix_spec + name only |
| dot-matrix-retire | DOT-314 | No — soft-delete (is_active=false) only |
| dot-pivot-update | (new) | Yes — this macro authored it |
Target fields (allowlisted)
composition_level · species · registry_group · description
(matrix_spec deliberately excluded → that is dot-matrix-update's domain.)
Lawful mutation path
UPDATE pivot_definitions SET <allowlisted_field> WHERE code=<PIV-xxx> issued only
by a governed DOT tool, validated against entity_species (species truth) and the
Đ26 composition ladder, firing the existing statement-level refresh trigger exactly
once (Đ26 §II-QUINQUIES 1F).
Live preflight (prod=directus, read-only via query_pg)
| Gate | Value | Note |
|---|---|---|
| DB | directus |
✓ |
v_rp_classification_governance_map |
37 rows | live |
pivot_definitions |
37 (35 active / 2 inactive) | md5 70d6df05501a7de91e24b848168c5b03 |
| composition_status | match 21 / mismatch 3 / drill_overload 9 / no_ref 4 | mismatch = cleanup target |
| L2 ownership | 0 | gate CLOSED |
L2 v_object_owner_gap |
210 | not-yet-governed signal (NOT a coverage claim) |
L2 gov_emit (event_outbox domain=governance) |
0 | inert |
| axis_assignment / topic_taxonomy_map tables | absent | L2 skeleton inert |
| idle-in-transaction | 0 | clean |
dot_tools total |
309 | dot-pivot-update absent (update_exists=0) |
| pivot DOT family | DOT-113/114/307/308/312–315 | mapped |
| triggers on pivot_definitions | 3 (refresh stmt-level; birth INSERT-only; matrix WHEN matrix_spec NOT NULL) | UPDATE fires refresh only |
| backup/rollback | BEGIN..ROLLBACK feasible (refresh fns are xact-safe, no NOTIFY/dblink) | ✓ |
Gate verdict: all preflight gates pass for a read-only + rehearsal path. The single gate that fails for production commit is governed registration (credentials absent) → downgrade Objective D commit to staged, per mission §2.
The 3 deterministic composition fixes (governed, from entity_species)
| Pivot | source_object | species | governed comp | current | fix |
|---|---|---|---|---|---|
| PIV-001 | meta_catalog | catalog | atom | molecule | molecule→atom |
| PIV-016 | entity_species | species | meta | atom | atom→meta |
| PIV-021 | task_comments | checkpoint_support | molecule | atom | atom→molecule |
Each fix sets composition_level := entity_species.composition_level for the pivot's
governed species — fully deterministic, never hardcoded.