RP DOT Pivot-Update — 08 UI/API Handoff (badges, L2 banner, JSON, Đ26 layers)
08 — UI / API Handoff (RP classification)
Source of truth for the screen: v_rp_classification_governance_map (37 rows, live).
Nuxt = screen only (Đ26 §0-BA: readItems → render, no business logic). All classification
is computed in PG.
Fields the UI consumes (per pivot)
pivot_code, pivot_name, source_object, is_active, raw_registry_group, registry_group_kind (domain|pivot_shape), fac02_label_code, fac02_label_name, pivot_kind, raw_species, species_governed_code, species_display_name, species_governed_composition, species_status (clean|missing|ambiguous_meta), raw_composition_level, composition_status (match|mismatch|drill_overload|no_ref), classification_lane (governance_home|rp_local|inactive_retire_candidate).
Badges
| Field | Badge values | Color intent |
|---|---|---|
| classification_lane | governance_home 🟢 / rp_local 🔵 / inactive_retire_candidate ⚪ | green=L1-governed home, blue=RP-local shape, grey=retired |
| composition_status | match ✓ / mismatch ✗ / drill_overload ▦ / no_ref — | mismatch=red (cleanup), drill_overload=neutral (LAW-VALID, not error) |
| species_status | clean ✓ / missing — / ambiguous_meta ◑ | ambiguous_meta is NOT an error (governed meta-species) |
| registry_group_kind | domain 🏷 / pivot_shape ⬡ | domain=FAC-02 facet; shape=RP-local structure |
| fac02_label_code | LBL-1xx chip or "provisional" | provisional = council backlog (no governed label yet) |
State after cleanup (what to show)
- Counts: governance_home 15, rp_local 20, inactive_retire 2.
- composition_status: match 21 → 24 after the 3 fixes; mismatch 3 → 0; drill_overload 9 (keep, neutral badge); no_ref 4.
- DOT cleanup state badge:
tool=dot-pivot-update deployed; commit HELD pending registration.
MANDATORY L2 banner (never claim gap=0)
L2 Object-Ownership Governance is GATED (inert). This screen reflects L1 classification only. Do not render "fully governed / 0 gaps". L2 ownership=0,
v_object_owner_gap=210, axis/topic tables absent, gov_emit=0. Any L2 coverage figure is not production-true.
Forbidden UI assumptions (must encode)
drill_overloadis not an error — it is the Đ26 td-matrix drill ladder (material/product/building…); render neutral, never red/"broken".species='species'(PIV-016/103) is not an orphan/bug — it is a governed meta-species pivoting overentity_species; render as governed.- Do not show L2 ownership/axis/topic as populated — those are clone-only / inert in prod.
- Do not compute counts in Nuxt; read
record_count/view fields from PG.
JSON example (PIV-001, post-fix)
{
"pivot_code": "PIV-001",
"pivot_name": "Meta Catalog — Total",
"source_object": "meta_catalog",
"is_active": true,
"classification_lane": "governance_home",
"registry_group_kind": "domain",
"raw_registry_group": "cấu_trúc",
"fac02_label_code": "LBL-101",
"fac02_label_name": "Cấu trúc",
"raw_species": "catalog",
"species_governed_code": "SPE-CAT",
"species_status": "clean",
"species_governed_composition": "atom",
"raw_composition_level": "atom",
"composition_status": "match"
}
Đ26 drill-down contract (Layers, for the RP UI build, §09)
L1 summary (9-row table) → L2 group list (Atom→species via entity_species WHERE composition_level='atom'; DOT→category; Collections→governance_role) → L3 entity list
→ L4 entity detail (6 headings) → L5 matrix (pivot GROUP BY, max 7 dims). Each layer ends
in a matrix (§II-QUINQUIES). Drill keys come from the classification fields above.