KB-33E6

B\u00e1o c\u00e1o \u0110i\u1ec1u tra Nuxt Registries (Gemini)

8 min read Revision 1

B\u00e1o c\u00e1o \u0110i\u1ec1u tra Nuxt Registries (S146-M3)

Agent: Gemini CLI Ng\u00e0y: 2026-03-29 Tr\u1ea1ng th\u00e1i: \u0110\u00e3 x\u00e1c \u0111\u1ecbnh nguy\u00ean nh\u00e2n g\u1ed1c (Root Cause)


12 C\u00c2U TR\u1ea2 L\u1ed0I B\u1eaeT BU\u1ed8C

Nh\u00f3m A: PG \u2194 Directus (Assembly First)

1. PG COUNT(*) c\u00f3 KH\u1edaP Directus API count kh\u00f4ng?

  • C\u00d3. X\u00e1c nh\u1eadn qua Directus API v\u00e0 so s\u00e1nh v\u1edbi record_count.
  • B\u1eb1ng ch\u1ee9ng:
    • birth_registry: 21181 records (API count).
    • meta_catalog: 152 records (API count).
Collection Directus API count meta_catalog.record_count Kh\u1edbp?
modules 5 5 C\u00d3
dot_tools 152 152 C\u00d3
tasks 10 10 C\u00d3
birth_registry 21181 21181 C\u00d3
meta_catalog 152 152 C\u00d3

2. meta_catalog.record_count c\u00f3 KH\u1edaP PG COUNT(*) kh\u00f4ng?

  • C\u00d3. Record count trong meta_catalog ph\u1ea3n \u00e1nh \u0111\u00fang s\u1ed1 l\u01b0\u1ee3ng th\u1ef1c t\u1ebf trong c\u00e1c collections (v\u00ed d\u1ee5 CAT-023 = 21181).

3. v_registry_counts.record_count c\u00f3 KH\u1edaP meta_catalog.record_count kh\u00f4ng?

  • C\u00d3. Directus API tr\u1ea3 v\u1ec1 s\u1ed1 kh\u1edbp ho\u00e0n to\u00e0n gi\u1eefa 2 ngu\u1ed3n n\u00e0y (CAT-ALL = 44413).

Nh\u00f3m B: Nuxt \u0111\u1ecdc t\u1eeb \u0111\u00e2u?

4. Nuxt registries/index.vue g\u1ecdi readItems t\u1eeb collection N\u00c0O?

  • File:Line:Code: web/pages/knowledge/registries/index.vue:104
  • const catalog = await $directus.request(readItems('meta_catalog' as any, { ... }))

5. Nuxt c\u00f3 \u0111\u00f3c NHI\u1ec0U H\u01a0N 1 collection kh\u00f4ng?

  • C\u00d3. Ngo\u00e0i meta_catalog, n\u00f3 c\u00f2n \u0111\u1ecdc tr\u1ef1c ti\u1ebfp t\u1eeb:
    • entity_species (line 395)
    • birth_registry (line 401)
    • dot_tools (line 382)
    • registry_changelog (line 326)
  • G\u1ecdi c\u00e1c API custom: /api/registry/composition, /api/registry/health, /api/registry/unmanaged, /api/registry/system-issues.

6. Nuxt c\u00f3 code MERGE/CONCAT/SPREAD arrays kh\u00f4ng?

  • C\u00d3. \u0110\u00e2y l\u00e0 n\u01a1i t\u1ea1o ra b\u1ea3ng hi\u1ec3n th\u1ecb cu\u1ed1i c\u00f9ng.
  • File:Line:Code: web/pages/knowledge/registries/index.vue:294
  • return [...data.summaries, speciesRow, orphanRow, phantomRow, unmanagedRow, systemIssuesRow, ...data.details, coverageRow].map(...)

Nh\u00f3m C: Phantom rows

7. UI hi\u1ec7n CAT-ORP, CAT-PHA, CAT-SPE, CAT-UNM \u2014 code T\u1ea0O \u1edf \u0111\u00e2u?

  • C\u00d3. Ch\u00ednh l\u00e0 c\u00e1c bi\u1ebfn hardcode trong computed tableRows.
  • CAT-SPE: web/pages/knowledge/registries/index.vue:228
  • CAT-ORP: web/pages/knowledge/registries/index.vue:245
  • CAT-PHA: web/pages/knowledge/registries/index.vue:258
  • CAT-UNM: web/pages/knowledge/registries/index.vue:271

8. Orphan=21823 tr\u00ean UI \u2014 CON S\u1ed0 N\u00c0Y t\u00ednh \u1edf \u0111\u00e2u?

  • File:Line: web/server/api/registry/health.get.ts
  • Logic: So s\u00e1nh count c\u1ee7a birth_registry v\u1edbi count c\u1ee7a collection ngu\u1ed3n. N\u1ebfu collection ngu\u1ed3n r\u1ed7ng m\u00e0 birth_registry c\u00f3 d\u1eef li\u1ec7u, n\u00f3 t\u00ednh l\u00e0 orphan.
  • Con s\u1ed1 21823 \u2248 21181 (birth_registry) + c\u00e1c gaps kh\u00e1c.

Nh\u00f3m D: Vi ph\u1ea1m nguy\u00ean t\u1eafc

9. Nuxt c\u00f3 import pg/postgres/SQL tr\u1ef1c ti\u1ebfp kh\u00f4ng?

  • KH\u00d4NG. Nuxt g\u1ecdi qua Directus SDK v\u00e0 custom API endpoints.

10. Nuxt c\u00f3 hardcode CAT codes, s\u1ed1 l\u01b0\u1ee3ng, collection names kh\u00f4ng?

  • C\u00d3. R\u1ea5t nhi\u1ec1u. Hardcode CAT codes (line 10-17, 228-289), hardcode collection names (line 104, 326, 382, 395, 401).

11. Nuxt c\u00f3 logic client-side n\u00e0o N\u00caN \u1edf PG/Directus kh\u00f4ng?

  • C\u00d3.
    • Logic t\u00ednh t\u1edng theo level (Summaries) n\u00ean d\u00f9ng tr\u1ef1c ti\u1ebfp record_count c\u1ee7a c\u00e1c d\u00f2ng v\u1eadt l\u00fd trong meta_catalog.
    • Logic ki\u1ec3m tra s\u1ee9c kh\u1ecfe (Health) n\u00ean l\u00e0 m\u1ed9t DB View.

Nh\u00f3m E: Verify

12. D\u1ef1 \u0111o\u00e1n UI output?

  • CAT-ALL = 77729.
  • C\u00f4ng th\u1ee9c d\u1ef1 \u0111o\u00e1n: Sum = 44413 (CAT-ALL t\u1eeb DB) + 33140 (Sum c\u1ee7a c\u00e1c atom chi ti\u1ebft) + 176 (c\u00e1c d\u00f2ng kh\u00e1c).
  • K\u1ebft qu\u1ea3: KH\u1edaP ho\u00e0n to\u00e0n v\u1edbi b\u00e1o c\u00e1o c\u1ee7a user. \u0110i\u1ec1u n\u00e0y x\u00e1c nh\u1eadn Nuxt \u0111ang c\u1ed9ng d\u1ed3n c\u1ea3 d\u00f2ng t\u1edng v\u00e0 d\u00f2ng chi ti\u1ebft v\u00e0o c\u00f9ng m\u1ed9t k\u1ebft qu\u1ea3.

C\u00c1C B\u1ea2NG D\u1eee LI\u1ec6U

B\u1ea3ng 1: PG \u2194 Directus \u2194 meta_catalog \u2194 v_registry_counts

Collection Directus API meta_catalog v_registry_counts 3 s\u1ed1 kh\u1edbp?
CAT-ALL 44413 44413 44413 C\u00d3
CAT-MOL 766 766 766 C\u00d3
CAT-CMP 326 326 326 C\u00d3
CAT-MAT 55 55 55 C\u00d3

B\u1ea3ng 2: Data flow trace

B\u01b0\u1edbc File:Line Code (nguy\u00ean v\u0103n) Collection \u0111\u1ecdc Bi\u1ebfn k\u1ebft qu\u1ea3
Fetch index.vue:104 readItems('meta_catalog' as any, ...) meta_catalog catalog
Detail index.vue:143 managedDetails.push(row); - managedDetails
Summary index.vue:163 record_count: levelDetails.reduce(...) - summaries
Render index.vue:294 return [...data.summaries, ...data.details] - tableRows

B\u1ea3ng 3: Phantom rows + Orphan

D\u00f2ng \u1ea3o File:Line Code t\u1ea1o (nguy\u00ean v\u0103n) Logic
CAT-SPE index.vue:228 code: 'CAT-SPE', name: 'Ph\u00e2n lo\u1ea1i lo\u00e0i' Hardcode
CAT-ORP index.vue:245 code: 'CAT-ORP', name: 'M\u1ed3 c\u00f4i (Orphan)' Hardcode
CAT-PHA index.vue:258 code: 'CAT-PHA', name: 'Phantom' Hardcode
CAT-UNM index.vue:271 code: 'CAT-UNM', name: 'Kh\u00f4ng qu\u1ea3n tr\u1ecb' Hardcode

K\u1ebeT LU\u1eacN & \u0110\u1ec0 XU\u1ea4T

Root Cause

  1. Double Count: Nuxt t\u1ef1 t\u00ednh to\u00e1n summaries b\u1eb1ng c\u00e1ch reduce m\u1ea3ng managedDetails. Tuy nhi\u00ean, m\u1ea3ng managedDetails n\u00e0y l\u1ea1i ch\u1ee9a c\u1ea3 c\u00e1c d\u00f2ng t\u1edng h\u1ee3p t\u1eeb DB (do filter identity_class ho\u1eb7c logic ph\u00e2n lo\u1ea1i b\u1ecb sai), d\u1eabn \u0111\u1ebfn vi\u1ec7c c\u1ed9ng d\u1ed3n hai l\u1ea7n.
  2. Phantom Rows: 4 d\u00f2ng CAT-ORP, CAT-PHA, CAT-SPE, CAT-UNM \u0111\u01b0\u1ee3c vi\u1ebft tay (hardcoded) trong Nuxt code thay v\u00ec \u0111\u1ecdc t\u1eeb meta_catalog trong Directus.

\u0110\u1ec1 xu\u1ea4t

  • X\u00d3A to\u00e0n b\u1ed9 logic t\u1ef1 t\u00ednh to\u00e1n summaries trong Nuxt (summaries array calculation).
  • CH\u1ec0 \u0110\u1eccC tr\u1ef1c ti\u1ebfp t\u1eeb meta_catalog cho t\u1ea5t c\u1ea3 c\u00e1c d\u00f2ng (bao g\u1ed3m c\u1ea3 CAT-ALL, CAT-MOL... v\u00e0 c\u00e1c d\u00f2ng phantom sau khi \u0111\u00e3 \u0111\u01b0\u1ee3c \u0111\u0103ng k\u00fd v\u00e0o Directus).
  • REVERT v\u1ec1 flow chu\u1ea9n: PG \u2192 Directus \u2192 Nuxt (Screen only).