KB-3D6C

S160 Complete Report — Merge #567 + UI Final + Tier A Contracts

8 min read Revision 1
reports160registriesplaywrighttier-aregression

S160 Complete Report

Ngày ghi nhận: 2026-03-22 Agent: Codex GPT-5.4 Phạm vi: hoàn tất S160 theo Điều 30 v1.2, gồm merge PR #567, follow-up UI final, data-testid, contract JSON, CI gate, deploy, smoke và production evidence.

Quy tắc đã áp dụng

  • §0-R 1 HỆ THỐNG DUY NHẤT: sửa trong Nuxt web-test, không sửa PG/Directus vì backend và classification đã đúng.
  • §0-T Automated Regression Testing: chuyển Tier A sang contract-driven Playwright để máy chặn regression.
  • §0-S Verify Visual bắt buộc – 3 mũ: agent chỉ ghi evidence; không tự kết luận visual PASS.
  • Điều 30 v1.2: No Blind PASS, Rule of Evidence, Tier A phải có data-testid + contract JSON + Playwright.

Assembly Gate

  • Q0 PG: không cần sửa. Backend API production đã trả dữ liệu hợp lệ.
  • Q1 Directus: không cần sửa schema.
  • Q2 Nuxt: có sửa. Root cause nằm ở render layer của UTable.
  • Q3 Code mới: có, theo assembly pattern, phạm vi Nuxt + tests.
  • Q4 Test: có. Playwright 17 tests + smoke production + production probe.
  • Q5 Rollback: git revert.

Mũ 1 — PR #567 merge + deploy

PR #567

CI / deploy artifacts cho #567

  • PR E2E Tests: run 23400576522
  • PR Nuxt 3 CI: run 23400576524
  • Main Nuxt 3 CI: run 23400806731
  • Main Terraform Deploy: run 23400806748
  • Main Deploy to VPS: run 23400843892

Smoke sau #567

  • Lệnh: scripts/smoke-test.sh
  • Kết quả: PASS 17 | FAIL 0

Phát hiện root cause UI còn lại

Production API đã đúng nhưng UI vẫn sai. Điều tra cho thấy các trang Tier A đang dùng sai slot API của Nuxt UI UTable:

  • code cũ dùng #cell-*
  • component thực tế của UTable dùng #<column>-data#<column>-header

Hệ quả trực tiếp:

  • cột Thành phần không render theo custom slot
  • cột Xác minh lộ raw boolean thay vì icon
  • các custom cell khác có nguy cơ bị fallback render sai
  • hook data-testid nếu đặt quá sớm sẽ kéo tableRows chạy trước khi các useAsyncData phụ được khởi tạo

Phase 2 + 3 + 4 — UI final + data-testid + contract gate

Follow-up branch / PR

  • Branch: fix/s160-ui-final
  • Commit: 93181c3 (fix(s160): restore tier-a registries ui contract)
  • PR: https://github.com/Huyen1974/web-test/pull/568
  • Trạng thái: MERGED
  • Merged at: 2026-03-22T10:41:47Z
  • Merge commit: 25e22e25ef4aebaa01c990ef505a09401b64bce4

CI / deploy artifacts cho #568

  • PR E2E Tests: run 23401260251
  • PR Nuxt 3 CI: run 23401260256
  • PR Terraform Deploy: run 23401260255
  • Main Nuxt 3 CI: run 23401319562
  • Main Terraform Deploy: run 23401319570
  • Main Deploy to VPS: run 23401350004

Các thay đổi chính

  1. Sửa render Tier A bằng slot API đúng
  • web/pages/knowledge/registries/index.vue
  • web/pages/knowledge/registries/health/index.vue
  • web/pages/knowledge/registries/unmanaged/index.vue
  • web/components/shared/DirectusMatrix.vue
  1. Thêm hook gắn data-testid vào DOM thật của table / th / tr
  • web/composables/useTableTestIds.ts
  1. Thêm data-testid Tier A
  • Registries: registries-table, row-CAT-*, link-species-matrix, col-*
  • Species Matrix: species-matrix-table, species-matrix-total, species-col-*
  • Health: health-table, health-card-khop, health-card-orphan, health-card-phantom, health-col-*
  1. Thêm contract JSON tầng 0
  • web/tests/contracts/registries.json
  • web/tests/contracts/species-matrix.json
  • web/tests/contracts/health.json
  1. Đổi Playwright sang contract-driven checks
  • web/tests/e2e/registries.spec.ts
  • web/tests/e2e/registries-species.spec.ts
  • web/tests/e2e/registries-health.spec.ts
  • helper: web/tests/e2e/support/contracts.ts

Verify local trước merge #568

Typecheck

  • Lệnh: pnpm typecheck
  • Kết quả: pass

Focused debug run

  • Lệnh: REGISTRY_E2E_FIXTURES=1 pnpm exec playwright test tests/e2e/registries.spec.ts tests/e2e/registries-health.spec.ts
  • Kết quả: 6 passed

Full regression suite

  • Lệnh: REGISTRY_E2E_FIXTURES=1 pnpm exec playwright test
  • Kết quả: 17 passed

Mũ 2 — deploy production sau #568

Smoke production sau deploy #568

  • Lệnh: scripts/smoke-test.sh
  • Kết quả: PASS 17 | FAIL 0

Production evidence sau deploy #568

/knowledge/registries

  • HTTP/UI: load thành công, title Danh mục hệ thống - Incomex AI Portal
  • data-testid="registries-table": có
  • Headers bảng thực tế:
    • STT
    • Code
    • Tên
    • Lớp
    • Số lượng
    • Thành phần
    • +
    • -
    • Mồ côi
    • Xác minh
  • Số dòng hiện tại: 30
  • Dòng có Số lượng trống: 0 dòng (blankCountRows = [])
  • link-species-matrix: có
  • row-CAT-SPE, row-CAT-ORP, row-CAT-PHA, row-CAT-UNM: đều có trên production

Các dòng 1-10 trên production

  • CAT-ALL: Số lượng = 472, Thành phần = 15 loài
  • CAT-MOL: Số lượng = 344, Thành phần = 10 loài
  • CAT-CMP: Số lượng = 15, Thành phần = 5 loài
  • CAT-MAT: Số lượng = 55, Thành phần = —
  • CAT-PRD: Số lượng = 0, Thành phần = —
  • CAT-BLD: Số lượng = 0, Thành phần = —
  • CAT-SPE: Số lượng = 1437, Thành phần = 33 loài
  • CAT-ORP: Số lượng = 0, Thành phần = —
  • CAT-PHA: Số lượng = 0, Thành phần = —
  • CAT-UNM: Số lượng = 120, Thành phần = —

Kết luận hẹp cho lỗi production cũ

  • Cột +/-: đã hiện đủ 2 cột riêng biệt.
  • Cột Thành phần: không còn blank toàn cột; hiện dữ liệu thực trên CAT-ALL, CAT-MOL, CAT-CMP, CAT-SPE.
  • Các dòng từng bị nghi thiếu Số lượng: hiện không còn ô Số lượng trống trên production probe.
  • CAT-ORP, CAT-PHA: hiện số 0 đúng dạng hiển thị.

/knowledge/registries/species

  • HTTP/UI: load thành công, title Ma trận Loài - Incomex AI Portal
  • data-testid="species-matrix-table": có
  • data-testid="species-matrix-total": có
  • Headers bảng thực tế:
    • STT
    • Mã loài
    • Tên loài
    • Lớp
    • Tổng
    • Certified
    • Chưa
  • Số dòng species hiện tại: 33
  • Dòng TOTAL: hiện trên production

/knowledge/registries/health

  • HTTP/UI: load thành công, title Registry Health - Incomex AI Portal
  • data-testid="health-table": có
  • data-testid="health-card-khop", health-card-orphan, health-card-phantom: đều có
  • Headers bảng thực tế:
    • STT
    • Collection
    • Nơi chứa
    • Nơi sinh
    • Gap
    • Trạng thái
  • Số dòng hiện tại: 18
  • Summary cards hiện tại:
    • KHỚP = 18
    • Orphan = 0
    • Phantom = 0
  • Mẫu 5 dòng đầu production:
    • agents: 6 / 6 / gap 0 / KHOP
    • meta_catalog: 33 / 33 / gap 0 / KHOP
    • checkpoint_sets: 2 / 2 / gap 0 / KHOP
    • checkpoint_types: 31 / 31 / gap 0 / KHOP
    • collection_registry: 138 / 138 / gap 0 / KHOP

Tự kiểm tra mission

# Câu hỏi Kết quả
1 PR #567 merged? Deploy success? Có. #567 merged, deploy run 23400843892 success
2 Cột Thành phần có data? Có dữ liệu thật trên production; không còn blank toàn cột
3 Cột +/- khôi phục?
4 Các dòng từng thiếu số giờ có số? Production probe: blankCountRows = []
5 CAT-ORP, CAT-PHA hiện số kể cả 0? Có, đều hiện 0
6 data-testid trên Tier A? Có trên production
7 Contract JSON cho 3 trang?
8 Playwright đọc từ contract và pass? Có, local 17 passed; PR CI E2E Tests success
9 Smoke production pass? Có, `PASS 17
10 Report đúng path current-state/reports/?

Ghi chú cho Orchestrator

  • Agent không tự kết luận visual PASS.
  • Evidence ở trên xác nhận deploy, smoke, CI gate, DOM contract, và dữ liệu production hiện tại.
  • Mũ 3 Verify Visual vẫn do Orchestrator thực hiện theo Điều 30 v1.2.