KB-7B29

IU Core 2000x — Nuxt assembly contract verification

4 min read Revision 1
iu-core2000xnuxtassembly-contractthree-axis-envelope

04 — Nuxt assembly contract verification (config-only, no deploy)

1. What was verified

The 1500x nuxt_assembly_contract.build_nuxt_contract(...) was driven end-to-end against the live Directus registration package built from production PG. Pure config-only — no Nuxt container changes, no deploy/restart, no business logic in Nuxt, no direct PG access.

The verification script executes from MacBook against the production PG via ssh contabo + docker exec postgres psql, builds the package, projects it through build_nuxt_contract, asserts shape, and emits the deterministic JSON contract.

2. Output — the contract

collection_name:      v_ui_iu_three_axis_envelope
source_view:          v_ui_iu_three_axis_envelope
primary_key_field:    unit_id
field_count:          16
axis_filter_count:    10
tab_groups:           ['axis_a', 'axis_b', 'axis_c', 'meta', 'primary']

Axis filters (10 total)

axis_group field_name filter_kind
primary unit_id eq
axis_a axis_a_doc_code eq
axis_a axis_a_sort_order eq
axis_a axis_a_section_code eq
axis_b axis_b_tags jsonb_contains
axis_b axis_b_tags_by_source jsonb_contains
axis_c axis_c_parent_id eq
axis_c axis_c_depth depth_eq
axis_c axis_c_ancestors in_array
axis_c axis_c_ancestor_addresses in_array

Tab groups (5)

  • primary: unit_id
  • axis_a: axis_a_doc_code, axis_a_sort_order, axis_a_section_code
  • axis_b: axis_b_tags, axis_b_tags_by_source
  • axis_c: axis_c_parent_id, axis_c_depth, axis_c_ancestors, axis_c_ancestor_addresses
  • meta: canonical_address, unit_kind, section_type, lifecycle_status, created_at, updated_at

Rules (5; 4 MUST-NOT + 1 MUST)

  • Nuxt MUST NOT open a direct PG connection.
  • Nuxt MUST NOT bypass Directus permissions.
  • Nuxt MUST NOT add business logic on these fields; render only.
  • Nuxt MUST NOT mutate this collection (it is read-only by registration).
  • Filters MUST come from this contract; new filters require a new registration package (deploy-gated).

REST + SDK examples

GET /items/v_ui_iu_three_axis_envelope?fields=*&sort=axis_a_doc_code,
                                                    axis_a_sort_order
                                              &limit=200
import { createDirectus, rest, readItems } from '@directus/sdk';
const c = createDirectus(useRuntimeConfig().public.directusUrl).with(rest());
const rows = await c.request(readItems('v_ui_iu_three_axis_envelope', {
    fields: ['*'],
    sort:   ['axis_a_doc_code', 'axis_a_sort_order'],
    limit:  200,
}));

3. Deploy-gated by Directus blocker (doc 03)

Until the Directus field-permission blocker is cleared, Nuxt calling GET /items/v_ui_iu_three_axis_envelope still returns HTTP 403. The contract is ready to render; the Directus side is ready to receive an admin-UI field-grant or a view->table promotion.

When either Path A or Path B in doc 03 is taken, no Nuxt code change is required — the existing Nuxt screens that follow the SDK pattern start returning real rows.

4. Five-layer impact

layer impact
PG none
Directus none
Nuxt none (config artifact only)
AgentData none
Qdrant none
Back to Knowledge Hub knowledge/dev/laws/dieu44-trien-khai/v0.6-iu-core-2000x-qdrant-reindex-directus-apply-external-pass-open-goal/04-nuxt-assembly-verification.md