IU Core 2000x — Nuxt assembly contract verification
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_idaxis_a:axis_a_doc_code,axis_a_sort_order,axis_a_section_codeaxis_b:axis_b_tags,axis_b_tags_by_sourceaxis_c:axis_c_parent_id,axis_c_depth,axis_c_ancestors,axis_c_ancestor_addressesmeta: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 |