KB-7673

P3D Pack 1 — TAC→UI Baseline Read-Only Check Report

9 min read Revision 1
p3dpack1tac-uibaselinereadonlyreportrev3

P3D Pack 1 — TAC→UI Baseline Read-Only Check — Report

Date: 2026-05-12 Mode: Read-only execution of prompt rev3 (approved dispatch) Operator: Opus (Claude Code) Pilot publication: DIEU-35 Implementation commit (declared): 5ce3437


Phase 0 — Runtime environment discovery

Item Value Status
db_container postgres (image postgres:16) RESOLVED
db_user workflow_admin RESOLVED
db_name directus (TAC tables live here; not workflow, not incomex_metadata) RESOLVED
project_root /opt/incomex/docker/nuxt-repo RESOLVED
nuxt_container incomex-nuxt (image nuxt-ssr-local:d28gmr-1778407456) RESOLVED
source_dir /opt/incomex/docker/nuxt-repo/web (contains nuxt.config.ts) RESOLVED
deploy_root /opt/incomex/deploys/nuxt-output (mounted → /app/.output) RESOLVED
production_origin https://vps.incomexsaigoncorp.vn (nginx server_name + NUXT_PUBLIC_SITE_URL) RESOLVED
deploy_status DEPLOYED (.output/nitro.json dated 2026-05-10T10:07:49Z; routes 200) — note: bundle does not stamp git commit, so exact equivalence to 5ce3437 is INFERRED, not byte-verified DEPLOYED

Phase 1 — TAC schema concept resolution

1A. Table existence

All four required tables exist in public schema of directus DB: tac_publication, tac_logical_unit, tac_unit_version, tac_publication_member. table_existence_verified=true.

1B+1C. Concept resolution (all 1 candidate ⇒ RESOLVED)

Concept Resolved column
tac_pub_pk tac_publication.id (uuid)
tac_pub_code tac_publication.doc_code (text)
tac_pub_version tac_publication.version (text)
tac_pub_lifecycle tac_publication.lifecycle_status (text → tac_pub_lifecycle_vocab.code)
tac_member_pub_ref tac_publication_member.publication_id (uuid → tac_publication.id)
tac_member_uv_ref tac_publication_member.unit_version_id (uuid → tac_unit_version.id)
tac_member_render_order tac_publication_member.render_order (integer)
tac_lu_pk tac_logical_unit.id (uuid)
tac_lu_parent_ref tac_logical_unit.parent_id (uuid → tac_logical_unit.id)
tac_lu_sort_order tac_logical_unit.sort_order (integer)
tac_lu_address tac_logical_unit.canonical_address (text)
tac_lu_section_type tac_logical_unit.section_type (text → tac_section_type_vocab.code)
tac_uv_pk tac_unit_version.id (uuid)
tac_uv_lu_ref tac_unit_version.logical_unit_id (uuid → tac_logical_unit.id)
tac_uv_title tac_unit_version.title (text)
tac_uv_body tac_unit_version.body (text)

schema_concepts_resolved=true. No FIELD_ABSENT, no AMBIGUOUS_FIELD.

1D. Join paths (FK introspection)

  • tac_publication_member.publication_idtac_publication.id
  • tac_publication_member.unit_version_idtac_unit_version.id
  • tac_publication_member.logical_unit_idtac_logical_unit.id (auxiliary; not required by patterns)
  • tac_unit_version.logical_unit_idtac_logical_unit.id
  • tac_logical_unit.parent_idtac_logical_unit.id (self)

join_paths_resolved=true. No AMBIGUOUS_JOIN_PATH.


Phase 2 — Route file discovery + TAC source confirmation

2A. Route files discovered (route_files_discovered=true)

  • /opt/incomex/docker/nuxt-repo/web/pages/knowledge/laws/index.vue
  • /opt/incomex/docker/nuxt-repo/web/pages/knowledge/laws/[pubId].vue

2B. TAC source confirmation (tac_source_confirmed=true)

  • index.vue:37readItems("tac_publication" ...)
  • [pubId].vue:25readItem("tac_publication" ...)
  • [pubId].vue:38readItems("tac_publication_member" ...)
  • [pubId].vue:66readItems("tac_publication" ...)
  • [pubId].vue:4 (comment) — tac_publication_member -> tac_logical_unit + tac_unit_version

2C. IU absence check (iu_references_in_laws_page=false)

Grep for information_unit|unit_version (excluding tac_unit_version) returns four hits, all on the FK column unit_version_id of tac_publication_member (the relational expansion path used by Directus SDK). No references to legacy IU model (information_unit, standalone unit_version).


Phase 3 — HTTP reachability

Route Status
https://vps.incomexsaigoncorp.vn/knowledge/laws 200 (laws_listing_reachable=true)
https://vps.incomexsaigoncorp.vn/knowledge/laws/27e48995-d6a1-4a44-8559-cab6a07fdbe0 (DIEU-35) 200 (dieu35_reader_reachable=true)

Phase 4 — TAC data evidence (compiled & executed)

4A. Publication

SELECT id, doc_code, version, lifecycle_status
FROM tac_publication
WHERE doc_code = 'DIEU-35';

Result: 27e48995-d6a1-4a44-8559-cab6a07fdbe0 | DIEU-35 | v5.2 | proposed (1 row)

4B. Member count

SELECT count(*) FROM tac_publication_member pm
JOIN tac_publication p ON p.id = pm.publication_id
WHERE p.doc_code = 'DIEU-35';

Result: 36dieu35_member_count=36

4C. Section types

SELECT DISTINCT lu.section_type
FROM tac_logical_unit lu
JOIN tac_unit_version uv ON uv.logical_unit_id = lu.id
JOIN tac_publication_member pm ON pm.unit_version_id = uv.id
JOIN tac_publication p ON p.id = pm.publication_id
WHERE p.doc_code = 'DIEU-35'
ORDER BY 1;

Result: 12 distinct section types — appendix, article, changelog, checklist, definition, governance_process, heading, instruction_block, paragraph, principle, process, technical_spec. dieu35_section_type_count=12.


Phase 5 — Baseline tree captured (baseline_tree_captured=true)

36 ordered members captured (render_order 0–35), spanning DIEU-35 ROOT through S15 GHI CHÚ BAN HÀNH. Sample (full set saved in this report appendix):

render_order canonical_address sort_order title (excerpt) body_len
0 D38-DIEU35-ROOT 0 ĐIỀU 35: LUẬT QUẢN TRỊ DOT — v5.2 FINAL 67
1 D38-DIEU35-S0 1 …v5.2 FINAL (BAN HÀNH 2026-04-18 S178 Fix 15) 1285
2 D38-DIEU35-S1 2 §1. MỤC TIÊU 1015
13 D38-DIEU35-S5 13 §5. QUY TRÌNH TẠO DOT MỚI — 8 BƯỚC 2854
29 D38-DIEU35-S9 29 §9. BOOTSTRAP — 4 BLOCKS (v5.1) 3464
35 D38-DIEU35-S15 35 GHI CHÚ BAN HÀNH (post-merge TODO) 829

All 36 share D38-DIEU35-* canonical_address prefix; all except ROOT have parent_id IS NOT NULL.


Phase 6 — Dynamic no-hardcode audit (hardcode_scan_dynamic=true)

6A. Live publication codes discovered

DIEU-28, DIEU-32, DIEU-35 (3 rows from tac_publication).

6B. Hardcoded code literal scan

Scanned /opt/incomex/docker/nuxt-repo/web/pages/knowledge/laws/ for each live code. 0 hits for DIEU-28, DIEU-32, DIEU-35.

6C. Code-column comparison operator scan

grep -rnE 'doc_code.*===|doc_code.*==' against laws/ routes — 0 hits.

no_hardcode_audit_pass=true.


Final response

tac_ui_baseline_status=PASS
db_connection_status=RESOLVED
project_root_status=RESOLVED
nuxt_container_status=RESOLVED
source_dir_status=RESOLVED
deploy_root_status=RESOLVED
production_origin_status=RESOLVED
deploy_status=DEPLOYED
table_existence_verified=true
schema_concepts_resolved=true
join_paths_resolved=true
route_files_discovered=true
tac_source_confirmed=true
iu_references_in_laws_page=false
laws_listing_reachable=true
dieu35_reader_reachable=true
dieu35_member_count=36
dieu35_section_type_count=12
baseline_tree_captured=true
hardcode_scan_dynamic=true
no_hardcode_audit_pass=true
report_path=knowledge/dev/laws/dieu44-trien-khai/reports/p3d-pack1-tac-ui-baseline-readonly-check-report.md
no_mutation_performed=true
next_recommended_action=GPT_REVIEW_BASELINE_THEN_5C2_REV3

Notes

  • Deploy bundle nitro.json does not embed git commit; equivalence to declared 5ce3437 is inferred from build date (2026-05-10) and route reachability, not byte-verified. If GPT review requires hard verification, add commit stamping to build pipeline (out of scope here).
  • unit_version_id.* patterns inside [pubId].vue are TAC relational-expansion accessors via Directus SDK (FK on tac_publication_member), not legacy IU model references.
  • DIEU-35 lifecycle_status='proposed' — TAC reader serves proposed pubs (consistent with current UI behaviour).
  • DB user used: workflow_admin (only available superuser-ish role; default postgres role absent on this instance).

Read-only — no DB write, no UI change, no Nuxt change, no deploy, no DDL, no permission change, no nested dispatch.

Back to Knowledge Hub knowledge/dev/laws/dieu44-trien-khai/reports/p3d-pack1-tac-ui-baseline-readonly-check-report.md