KB-2E27
09 — Consolidated Node / List Data Contract
3 min read Revision 1
architecturenode-contractlist-contractdrilldownauto-labelpincount-integrity2026-05-31
title: 09 — Consolidated Node / List Data Contract date: 2026-05-31
09 — Consolidated Node / List Data Contract
Every node returned by the backend to Registries-Pivot carries this contract. Nuxt renders fields verbatim — no derivation, no math, no thresholds. Fields are grouped by addendum source.
A. Identity & counts (reflection-screen core — addendum 1)
node_code— pivot code or filter-path identitylayer·composition_level·species·group/label_reftotal— pivot value (pivot_count/pivot_query) orPIVOT_MISSINGplus/minus— period delta vsbaseline_count(pivot-backed; elsePIVOT_MISSING)orphan_count— frommeta_catalog.orphan_count/ orphan pivotphantom_count—GREATEST(record_count − actual_count, 0)(needs column; doc 02)verification_status— verified | unverified | failed (fromlast_scan_date+ invariant)drift_status— none | drift (record ≠ actual)count_integrity_status— ok | failed (doc 02)warning_flags[]— orphan | phantom | unmonitored | unregistered | ghost | pivot_missing | label_missing | driftnext_action— register | onboard | recount | propose_pivot | propose_label | investigate | nonesource_ref—source_object+ filter-path (provenance, Đ28 traceability)
B. Drill-down (addendum 1 §4)
has_children(true ifftotal > 1∧ a next layer resolves)children_countnext_layer_kind(species | composition_level | group | facet | collection | substrate)child_grouping_dimensionnext_pivot_code(or null → leaf)drilldown_query_ref(the pivot/query to expand this node)final_substrate_ref(set only at leaf: real rows / relationship edges)group_size
C. Auto-label / grouping (addendum 1 §5 + threshold addendum)
requires_auto_label(group_size > threshold ∧ no existing grouping)classification_status(classified | inspectable | classification_required | LABEL_MISSING)classification_dimensionlabel_ref(→taxonomy.code/label_rules.id)grouping_requiredgrouping_reasonmax_ungrouped_threshold(per-species; default 50 = MAX ceiling, may be smaller — read from PG)suggested_next_groupingclassification_workflow_trigger
D. Pin / ghim (addendum 1 §6)
pin_state(pinned | unpinned | pinned-by-role | pinned-by-team) — fromregistry_pin, scoped to viewer
Contract invariants
- Any numeric field is a pivot result or literally
PIVOT_MISSING— never computed in the client (T-COUNT-1/2). max_ungrouped_thresholdand all label/layer/pin data come from PG (T-LABEL-2, T-DRILL-2, T-PIN-1).has_childrenand depth are backend-decided; the client rendersnext_layer_kindwithout level logic.- A failed invariant is represented (warning_flags + count_integrity_status), never hidden (Đ28/Đ23).