P3D Pack 1 — TAC→UI Baseline Read-Only Check Report
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_id→tac_publication.idtac_publication_member.unit_version_id→tac_unit_version.idtac_publication_member.logical_unit_id→tac_logical_unit.id(auxiliary; not required by patterns)tac_unit_version.logical_unit_id→tac_logical_unit.idtac_logical_unit.parent_id→tac_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:37—readItems("tac_publication" ...)[pubId].vue:25—readItem("tac_publication" ...)[pubId].vue:38—readItems("tac_publication_member" ...)[pubId].vue:66—readItems("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: 36 → dieu35_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.jsondoes not embed git commit; equivalence to declared5ce3437is 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].vueare TAC relational-expansion accessors via Directus SDK (FK ontac_publication_member), not legacy IU model references.DIEU-35lifecycle_status='proposed'— TAC reader serves proposed pubs (consistent with current UI behaviour).- DB user used:
workflow_admin(only available superuser-ish role; defaultpostgresrole 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.