KB-108C

IU Core 1500x — DOT 128/128 · no-hardcode · five-layer · acceptance matrix

4 min read Revision 1
iu-core1500xdotacceptanceno-hardcodefive-layer

05 — DOT · no-hardcode · five-layer · acceptance matrix

1. DOT — 123 -> 128

runtime/110 after migration 021: 128/128, every D9 class ok=true, D8 drift 0.

class before after added (migration 021)
table 18 19 iu_qdrant_collection_registry
view 18 20 v_iu_qdrant_collection_active, v_ui_iu_directus_registration_envelope
function 45 47 fn_iu_qdrant_collection_register, fn_iu_qdrant_collection_retire
trigger 3 3
config 8 8
event_type 15 15
route 16 16
total 123 128 +5

Live DOT scan on production post-apply: all 7 classes report ok=true, D8 drift 0.

2. No-hardcode — PASS

  • No DSN, password, IP, :5432.
  • Qdrant secret reference QDRANT_LOCAL_API_KEY / OpenAI OPENAI_API_KEY — names only, never values.
  • Default IU Core collection name iu_core_iu_chunks lives in ONE place: runtime/310. Every caller discovers it via v_iu_qdrant_collection_active.
  • The Directus three-axis collection name is config-shaped (overridable).
  • Nuxt assembly contract reads the field list from the registration envelope view; no field name repeated as Python literal.

3. Five-layer sync

  • PG: durable additive — 1 table + 2 views + 2 functions + 1 registry row. IU data unchanged.
  • Directus: none yet (package built; apply deploy-gated).
  • Nuxt: none (data-only assembly contract).
  • AgentData: 7 reports uploaded + verified.
  • Qdrant: new EMPTY collection iu_core_iu_chunks; production_documents untouched.

4. Acceptance matrix — IU Core

All prior capabilities DONE. New 1500x rows:

  • Qdrant collection registry — DONE (durable)
  • Qdrant dedicated IU Core collection — DONE (live, empty, reversible)
  • Embedder seam (OpenAIEmbedder + NoopEmbedder) — DONE (code + tests; no embed call run)
  • Vector sync external Qdrant write — DONE_WITH_EXTERNAL_BLOCKER
  • Directus read-only registration package — DONE (built; apply deploy-gated)
  • Nuxt assembly contract — DONE (data-only artifact)

5. External integration acceptance matrix

11 rows total: 8 DONE, 2 DONE_WITH_EXTERNAL_BLOCKER (Qdrant external write, Directus apply), 0 PARTIAL, 0 BLOCKED. Each blocker is an operator decision, not a code gap.

6. Acceptance hardening checks

  • no-hardcode audit: PASS (0 real violations)
  • DOT scan: 128/128, D8 drift 0
  • rollback drill: rollback/021 authored
  • backup: hashed -Fc, sha256 d798fcc9…
  • vector boundary: sandbox/190 8/8, sandbox/200 10/10 PASS
  • tests: 1083 pass (+38)

7. Rollback / disable readiness

  • Code/DDL: rollback/021 drops 1 table + 2 views + 2 fns; runtime/rollback/310 retires registry row.
  • Qdrant: DELETE /collections/iu_core_iu_chunks (atomic).
  • Gates unchanged.

8. Completion ruling

IU Core is externally-integration-ready. Remaining external decisions: Qdrant bounded reindex (needs gate flip + operator approval), Directus registration apply (admin action), Nuxt screen wiring (assembly only). None is a core gap.

Back to Knowledge Hub knowledge/dev/laws/dieu44-trien-khai/v0.6-iu-core-1500x-qdrant-directus-nuxt-external-closeout-open-goal/05-dot-fivelayer-acceptance.md