KB-7AED rev 2

P3D Pack 1 Phase 5 — TAC→IU Migration Read-Only/Dry-Run Report (Post-Phase5A Rerun, rev6)

28 min read Revision 2
p3dpack1phase5phase5adry-runreruntac-to-iurev6post-disambiguationevidence-onlyno-mutation2026-05-11

P3D Pack 1 Phase 5 — TAC→IU Migration Read-Only/Dry-Run Report (Post-Phase5A Disambiguation Rerun)

Date: 2026-05-11 Mode: READ-ONLY / DRY-RUN — zero writes, zero mutation Run kind: POST-PHASE5A-DISAMBIGUATION RERUN Prompt: prompts/p3d-pack1-phase5-readonly-dryrun-tac-to-iu-migration-prompt.md rev6 (APPROVED FOR RERUN 2026-05-11) Approval review: reviews/gpt-final-review-p3d-pack1-phase5a-prompt-rev6-approved-rerun-2026-05-11.md Registry addendum: design/p3d-pack1-phase5a-semantic-registry-disambiguation-addendum.md Design reference: design/p3d-pack1-phase5-tac-to-iu-migration-design.md Previous run: rev4 returned PARTIAL because the registry correctly flagged 3 AMBIGUOUS concepts. Rev6 splits those concepts; this rerun produces a clean evidence set. Author: Opus 4.7 (agent rerun) DB target: VPS PostgreSQL (postgres container, db=directus, schema=public)


STATUS FLAGS (final response format)

phase5a_rerun_status=PASS
report_path=knowledge/dev/laws/dieu44-trien-khai/reports/p3d-pack1-phase5-tac-to-iu-migration-dryrun-report.md
no_mutation_performed=true
gate0_all_passed=true
resolved_field_map_complete=true
g1_to_g11_attempted=true
old_concept_references_present=false
publication_metrics_available=true
provenance_projection_available=true
rollback_sizing_available=true
nesting_evidence_available=true
nesting_max_depth=2
address_collision_count=0
scale_brittleness_self_audit_passed=true
next_recommended_action=GPT/User makes D1/D2/D3 nesting decision (depth=2, 3 roots, 83 children — both D1 and D2 viable on data shape) and Phase 5B species/composition decision (4 atom + 4 molecule species are PLAUSIBLE against target governance_role=observed; likely a new species per Phase 4D)

Status = PASS — all goals returned evidence. Only one residual AMBIGUOUS_FIELD remains (collection_display_name on collection_registry — informational, no goal blocked).


1. GATE-0 — Phase 1 Table Existence

Check Table relkind Result
P1 tac_logical_unit r PASS
P2 tac_unit_version r PASS
P3 tac_publication r PASS
P4 tac_publication_member r PASS
P5 information_unit r PASS
P6 unit_version r PASS
P7 collection_registry rows for information_unit + unit_version both present PASS
P8 dot_config vocab.unit_kind.law_unit value=law_unit PASS
P8b entity_species r PASS
P8c species_collection_map r PASS
P8d collection_registry r PASS
P8e birth_registry r PASS

Phase 1 verdict: PASS.

2. GATE-0 — Phase 3 Function Existence

Check Function Result Signature
P9 fn_iu_create PRESENT (p_canonical_address text, p_title text, p_body text, p_actor text, p_unit_kind text, p_section_type text, p_owner_ref text, p_publication_type text, p_parent_ref uuid) → jsonb
P10 fn_iu_create_plan PRESENT same args → jsonb
P11 fn_content_hash PRESENT (p_body text) → text
P12 fn_iu_birth_gate_layer1 PRESENT () → trigger
P13 fn_iu_birth_gate_layer2 PRESENT () → trigger
P14 fn_iu_verify_invariants PRESENT (p_addr text) → jsonb

Phase 3 verdict: 6/6 PRESENT.

3. GATE-0 — Phase 2 Resolved Field Map (rev6 registry, 31 concepts)

Core domain concepts

Concept Table Resolution Column
address_field tac_logical_unit RESOLVED canonical_address
address_field information_unit RESOLVED canonical_address
content_body tac_unit_version RESOLVED body
content_body unit_version RESOLVED body
content_hash tac_unit_version RESOLVED content_hash
content_hash unit_version RESOLVED content_hash
provenance_json_profile unit_version RESOLVED content_profile (jsonb)
provenance_text_note unit_version RESOLVED provenance (text)
provenance_text_note tac_unit_version RESOLVED provenance (text)
parent_ref tac_logical_unit RESOLVED parent_id
parent_ref information_unit RESOLVED parent_or_container_ref
sort_order tac_logical_unit RESOLVED sort_order
section_type tac_logical_unit RESOLVED section_type
section_type information_unit RESOLVED section_type
lifecycle tac_logical_unit RESOLVED lifecycle_status
lifecycle information_unit RESOLVED lifecycle_status
publication_ref tac_publication_member RESOLVED publication_id
logical_unit_ref tac_publication_member RESOLVED logical_unit_id
publication_render_order tac_publication_member RESOLVED render_order
title_field tac_unit_version RESOLVED title
title_field unit_version RESOLVED title
description_field tac_unit_version RESOLVED description
description_field unit_version RESOLVED description

Registry/Species concepts

Concept Table Resolution Column
species_identifier entity_species RESOLVED species_code
species_identifier species_collection_map RESOLVED species_code
species_identifier collection_registry RESOLVED species_code
species_identifier birth_registry RESOLVED species_code
species_display entity_species RESOLVED display_name
species_composition entity_species RESOLVED composition_level
species_composition birth_registry RESOLVED composition_level
species_management entity_species RESOLVED management_mode
species_hierarchy_parent entity_species RESOLVED parent_id
species_hierarchy_depth entity_species RESOLVED depth
collection_table_key collection_registry RESOLVED collection_name
collection_table_key species_collection_map RESOLVED collection_name
collection_table_key birth_registry RESOLVED collection_name
collection_display_name collection_registry AMBIGUOUS_FIELD name, name_en (informational only; no goal blocked)
governance_role collection_registry RESOLVED governance_role
governance_role birth_registry RESOLVED governance_role
migration_state collection_registry RESOLVED migration_state
birth_strategy collection_registry RESOLVED birth_code_strategy
mapping_primary species_collection_map RESOLVED is_primary
disc_field species_collection_map RESOLVED discriminator_field
disc_value species_collection_map RESOLVED discriminator_value
disc_operator species_collection_map RESOLVED discriminator_operator
disc_config species_collection_map RESOLVED discriminator_config
birth_entity birth_registry RESOLVED entity_code

Field map: complete. 1 residual AMBIGUOUS (informational), 0 FIELD_ABSENT among operational concepts.

Comparison vs rev4 (post-disambiguation gain)

Concept rev4 status rev6 status
publication_link / tac_publication_member AMBIGUOUS (publication_id + logical_unit_id) REPLACED: publication_ref→publication_id RESOLVED; logical_unit_ref→logical_unit_id RESOLVED
sort_order / tac_publication_member FIELD_ABSENT (render_order was UNREGISTERED) REPLACED: publication_render_order→render_order RESOLVED
provenance_profile / unit_version AMBIGUOUS (content_profile + provenance) REPLACED: provenance_json_profile→content_profile RESOLVED; provenance_text_note→provenance RESOLVED
collection_key / collection_registry AMBIGUOUS (name + collection_name) REPLACED: collection_table_key→collection_name RESOLVED; collection_display_name AMBIGUOUS (name+name_en) but informational

All operational ambiguity resolved. No deprecated concepts referenced in this rerun.


4. G1 — Source Row Accounting

Table Row count
tac_logical_unit 86
tac_unit_version 86
tac_publication 3
tac_publication_member 86
information_unit (target, current) 12
unit_version (target, current) 19

section_type distribution on tac_logical_unit (12 distinct values)

section_type count
technical_spec 19
governance_process 16
paragraph 14
heading 10
principle 8
process 7
checklist 6
changelog 2
article 1
appendix 1
instruction_block 1
definition 1

lifecycle_status distribution on tac_logical_unit

lifecycle_status count
draft_only 86

Uniform single-value lifecycle across all source rows.


5. G2 — Schema Alignment (source → target)

Pair A: tac_logical_unit → information_unit

Concept Source col Target col Alignment
address_field canonical_address canonical_address ALIGNED
parent_ref parent_id parent_or_container_ref ALIGNED (uuid↔uuid, different names)
section_type section_type section_type ALIGNED
lifecycle lifecycle_status lifecycle_status ALIGNED
sort_order sort_order sort_order ALIGNED

Target-only fields requiring construction at migration: unit_kind, content_anchor_ref, version_anchor_ref, conformance_status, owner_ref, identity_profile. Source owner (text) maps semantically to target owner_ref (text) but is OUTSIDE registry as the owner_ref concept isn't defined for source.

Pair B: tac_unit_version → unit_version

Concept Source col Target col Alignment
content_body body body ALIGNED
content_hash content_hash content_hash ALIGNED (but recipe differs — see G6)
title_field title title ALIGNED
description_field description description ALIGNED
provenance_json_profile (concept not registered on source) content_profile TARGET-RESOLVED — source has content_profile jsonb column (UNREGISTERED on source per current registry)
provenance_text_note provenance provenance ALIGNED (both text)

Pair C/D: tac_publication / tac_publication_member → (no IU target)

Per design §G — IU publication model not yet designed. Out of scope.

UNREGISTERED_FIELD list (unchanged from rev4 except render_order now RESOLVED via publication_render_order)

  • tac_publication_member: (none — render_order now covered).
  • tac_publication: enacted_at, council_score, approved_by, risk_tier, publication_profile, version.
  • tac_unit_version: version_number, review_state, length_flag, length_exception_reason, content_profile (jsonb — note: registry doesn't include provenance_json_profile for source side), vector_sync_status, vector_synced_at, vector_chunk_count, editor, enacted_at.
  • tac_logical_unit: doc_code, section_code, owner, tier, identity_profile.
  • information_unit: doc_code, section_code, unit_kind, content_anchor_ref, version_anchor_ref, conformance_status, identity_profile, owner_ref, created_by, updated_by, deleted_at.
  • unit_version: unit_id, version_seq, editor, review_state, enacted_at, created_by.
  • entity_species: code, prefix, kg_metadata, _dot_origin.
  • collection_registry: code, classification, owner, group, icon, field_count, has_note, purpose, _dot_origin, storage_role, source_kind, description_policy, birth_code_column, birth_identity_source.

6. G3 — Nesting Evidence

parent_ref RESOLVED on tac_logical_unit = parent_id. (Unchanged from rev4 — same source data.)

Roots vs children

Kind Count
root (parent_id IS NULL) 3
child 83

3 roots = 3 publications.

Recursive depth distribution

depth count
0 (roots) 3
1 38
2 45

Max depth = 2. Sum 3+38+45 = 86 (no cycles).

Parent→child section_type pairs (top 22)

parent_st child_st count
heading technical_spec 11
governance_process governance_process 9
heading paragraph 9
heading principle 7
heading heading 7
technical_spec technical_spec 7
heading process 5
heading checklist 4
heading governance_process 4
article governance_process 3
governance_process paragraph 3
article checklist 2
article process 2
article paragraph 2
article heading 1
article technical_spec 1
article principle 1
article appendix 1
article definition 1
article changelog 1
article instruction_block 1
heading changelog 1

Evidence for D-decision (no Agent recommendation):

  • Shallow tree (depth ≤ 2). Both D1 (preserve) and D2 (flatten) viable on data shape.
  • Parents are typed: article, heading, governance_process, technical_spec.
  • Leaves are typed mostly: technical_spec, paragraph, principle, checklist, process, etc.
  • D1 → mixed composition (parents=compound/molecule, leaves=atom). D2 → uniform atom.

7. G4 — Publication Structure (now joinable via publication_ref)

tac_publication SELECT * (3 rows)

doc_code version publication_type name lifecycle_status
DIEU-28 v2.0 law ĐIỀU 28: LUẬT KỸ THUẬT HIỂN THỊ — v2.0 BAN HÀNH proposed
DIEU-32 v1.1 law Điều 32: Luật Phê duyệt — v1.1 BAN HÀNH proposed
DIEU-35 v5.2 law DIEU 35: LUAT QUAN TRI DOT - v5.2 FINAL (BAN HANH 2026-04-18 S178 Fix 15) proposed

Members per publication (via tac_publication_member.publication_id join)

doc_code version member_count
DIEU-28 v2.0 27
DIEU-32 v1.1 23
DIEU-35 v5.2 36

Sum = 27+23+36 = 86 (matches G1).

Logical-unit ref integrity (1:1 with tac_logical_unit)

total_members distinct_lu_refs orphan_refs
86 86 0

PASS — every pub_member.logical_unit_id resolves to a tac_logical_unit row; no duplicates, no orphans.

Ordering integrity per publication (render_order)

doc_code min max member_count distinct_orders no_duplicates
DIEU-28 0 26 27 27 true
DIEU-32 0 22 23 23 true
DIEU-35 0 35 36 36 true

PASS — each publication has a contiguous [0, member_count-1] render_order range with no duplicates. Zero gaps, zero duplicates across all 3 publications.


8. G5 — Canonical Address Collision

Metric Value
collision_count 0
collision_sample (empty)

PASS — no overlap between 86 TAC source addresses and 12 current IU target addresses.


9. G6 — Hash / Provenance Projection

  • content_body RESOLVED on source (body) + target (body).
  • content_hash RESOLVED on source + target.
  • fn_content_hash PRESENT.
  • provenance_json_profile RESOLVED on target = content_profile (jsonb).
  • provenance_text_note RESOLVED on target = provenance (text). Informational.

Hash recipe comparison (re-verified live, 5 sampled tac_unit_version rows)

id8 stored_hash matches fn_content_hash(body)?
9ed7b93b f (differ)
bd4718d6 f
b6998920 f
b15c0098 f
665338ba f

5/5 differ. Confirms recipe divergence (TAC composite vs IU body-only sha256). Migration MUST recompute IU hash; MUST NOT copy TAC hash into target.content_hash.

Provenance projection — RESOLVED carriers

Carrier Column Type Total target rows Non-empty rows
provenance_json_profile unit_version.content_profile jsonb 19 0
provenance_text_note unit_version.provenance text 19 0

Projection feasibility: PASS. Both carriers exist and are unpopulated on current target rows. Migration can write content_profile.source_hashes.tac_v1 = <original TAC composite hash> per Phase 4B addendum §7. The text provenance field stays untouched (free-text editor note) or receives a short origin tag if Phase 5B chooses.


10. G7 — Species/Composition Grouping (NO Agent interpretation)

Live entity_species count = 40.

Target governance_role

collection_name governance_role
information_unit observed
unit_version observed

Composition groups + PLAUSIBLE/CONFLICT

PLAUSIBLE = management_mode = 'observed'.

composition total plausible conflict unknown
atom 20 4 16 0
compound 8 0 8 0
meta 1 0 1 0
molecule 11 4 7 0

Live species dump (40 rows; all candidate_not_approved)

code species_code display_name composition management status
SPE-AGT agent Agent atom governed active
SPE-AIS ai_support Hỗ trợ AI atom observed active
SPE-CAT catalog Danh muc he thong atom governed active
SPE-CPT checkpoint_type Loai checkpoint atom governed active
SPE-BLK cms_block CMS Block atom excluded active
SPE-DEP dependency Phu thuoc atom governed active
SPE-DXF directus_field Directus Field atom observed active
SPE-DOT dot_tool DOT Tool atom governed active
SPE-LBL entity_label Entity Label atom governed active
SPE-ERL entity_rule Quy tac thuc the atom governed active
SPE-GOV governance_infra Hạ tầng Giám sát atom observed active
SPE-GRL governance_relation Liên kết Quản trị atom governed active
SPE-JCT junction_table Bảng Liên kết atom excluded active
SPE-JUR jurisdiction Phạm vi Pháp lý atom governed active
SPE-FAC label_facet Chieu phan loai atom governed active
SPE-LBR label_rule Quy tac gan nhan atom governed active
SPE-ENF law_enforcement Thực thi DOT-Luật atom governed active
SPE-SYS system_backup Hệ thống/Backup atom excluded active
SPE-ISS system_issue Van de he thong atom governed active
SPE-LOG system_log Nhật ký Hệ thống atom observed active
SPE-APP approval_request Yeu cau phe duyet compound governed active
SPE-GAG governance_agency Cơ quan Quản trị compound governed active
SPE-LAW law Văn bản Luật compound governed active
SPE-MOD module Module compound governed active
SPE-OSC os_crm OS CRM compound excluded active
SPE-TSK task Nhiem vu compound governed active
SPE-WCR wcr De xuat thay doi compound governed active
SPE-WKF workflow Quy trinh compound governed active
SPE-SPE species Loai meta governed active
SPE-BZS business_support Hỗ trợ Kinh doanh molecule observed active
SPE-CPS checkpoint_set Bo checkpoint molecule governed active
SPE-CKS checkpoint_support Hỗ trợ Checkpoint molecule observed active
SPE-COL collection Collection molecule governed active
SPE-HLP help_center Trung tâm Trợ giúp molecule observed active
SPE-PGE page Trang UI molecule governed active
SPE-PVR pivot_result Ket qua Pivot molecule observed active
SPE-TBL table_ui Bang UI molecule governed active
SPE-WEB website_content Nội dung Website molecule excluded active
SPE-PGW website_page Trang Website molecule excluded active
SPE-WFS workflow_step Buoc quy trinh molecule governed active

Agent makes no composition or species recommendation. GPT/User applies Điều 0-B and the D-nesting decision.


11. G8 — IU Creation Pathway (bounded output)

Function inventory

function identity_args return parent_ref candidate match?
fn_iu_create (p_canonical_address text, p_title text, p_body text, p_actor text, p_unit_kind text, p_section_type text, p_owner_ref text, p_publication_type text, p_parent_ref uuid) jsonb YES (substring parent_ref in args)
fn_iu_create_plan same args jsonb YES
fn_content_hash (p_body text) text n/a
fn_iu_birth_gate_layer1 () trigger n/a
fn_iu_birth_gate_layer2 () trigger n/a
fn_iu_verify_invariants (p_addr text) jsonb n/a

Trigger inventory — information_unit

trigger_name tgtype function_called
trg_aa_iu_gateway_write_guard 23 fn_iu_gateway_write_guard
trg_birth_information_unit 5 fn_birth_registry_auto
trg_iu_birth_gate_layer1 7 fn_iu_birth_gate_layer1
trg_iu_birth_gate_layer2 21 fn_iu_birth_gate_layer2
trg_iu_updated_at 19 fn_iu_updated_at

Trigger inventory — unit_version

trigger_name tgtype function_called
trg_aa_iu_notif_version 5 fn_iu_notif_version
trg_aa_uv_gateway_write_guard 23 fn_iu_gateway_write_guard

Agent provides identity/signature/triggers; GPT/User interprets behavior.


12. G9 — Birth Gate Field Requirements (bounded output)

Layer1 — NEW.<field> extracted from source

field_name exists_on_target status
canonical_address YES SATISFIED
unit_kind YES SATISFIED
lifecycle_status YES SATISFIED
owner_ref YES SATISFIED
conformance_status YES SATISFIED
identity_profile (jsonb keys: title, owner_lookup_ref, primary_section_type_ref, publication_authority_ref, publication_type_ref) YES (column); per-key satisfaction UNKNOWN until migration constructs the jsonb SATISFIED (column)

Layer1 also performs vocab lookups (vocab.unit_kind.*, vocab.section_type.*, vocab.publication_type.*). Vocab table existence confirmed (P8). Per-section_type vocab presence for the 12 distinct section_types from G1 must be re-verified pre-pilot.

Layer2 — v_row.<field> extracted from source

field_name exists_on_target status
content_anchor_ref YES SATISFIED
version_anchor_ref YES SATISFIED

Layer2 also enforces: version_anchor_ref must point to a unit_version where unit_id=NEW.id; content_anchor_ref must equal version_anchor_ref::text. Satisfiable via ordered INSERT (IU stub → UV → UPDATE anchors); migration logic must honor this.


13. G10 — Pilot Candidate Metrics (metric-only, NO Agent ranking)

All 3 metric concepts RESOLVED → full metric set available.

Sort: diversity_count DESC, member_count ASC. All rows candidate_not_approved.

doc_code version name lifecycle_status member_count diversity_count nesting_depth label
DIEU-35 v5.2 DIEU 35: LUAT QUAN TRI DOT - v5.2 FINAL (BAN HANH 2026-04-18 S178 Fix 15) proposed 36 12 2 candidate_not_approved
DIEU-32 v1.1 Điều 32: Luật Phê duyệt — v1.1 BAN HÀNH proposed 23 8 2 candidate_not_approved
DIEU-28 v2.0 ĐIỀU 28: LUẬT KỸ THUẬT HIỂN THỊ — v2.0 BAN HÀNH proposed 27 7 2 candidate_not_approved

All 3 publications have nesting_depth = 2 (max across publication members under recursive parent walk).

Agent does NOT recommend a pilot. GPT/User selects from the full list per Phase 5C plan.


14. G11 — Rollback Input Computation

address_field RESOLVED on tac_logical_unit + publication_ref RESOLVED on tac_publication_member.

Metric Value
total_projected_iu_inserts 86
total_projected_uv_inserts 86

Per-publication breakdown (rollback batch sizing)

doc_code version projected_inserts
DIEU-28 v2.0 27
DIEU-32 v1.1 23
DIEU-35 v5.2 36

Per-publication transactions per design §J/§L are sized 23–36 IU + matching UV rows. Exact-key rollback (RETURNING capture) per publication is the proposed model.


15. SCALE-BRITTLENESS SELF-AUDIT

Check Result Notes
Column name from memory used in a query? No All operational column refs come from rev6 resolved field map. Information_schema introspection is the only direct column-name usage.
"or similar" / "equivalent" in any selector? No Exact string-equality matching only.
Agent interpreted "simplest" / "allows containment"? No G7 dumps and groups; D1/D2/D3 evidence only.
AMBIGUOUS_FIELD silently resolved? No Only collection_display_name remains AMBIGUOUS; reported and not used by any goal.
Fixed counts as logic? No All counts live SELECT.
Phase 3/4 labels treated as facts without re-verification? No Hash recipe re-verified (5/5 differ).
Semantic concept missing from registry? No new UNREGISTERED on operational tables. render_order (rev4 UNREGISTERED) now covered by publication_render_order.
Old/deprecated concepts referenced in operational logic? No publication_link, provenance_profile, collection_key no longer appear in any operational query.
Agent recommended a pilot? No All G10 rows labelled candidate_not_approved.
Composition/species decision pushed? No All species rows labelled candidate_not_approved.
Nesting decision (D1/D2/D3) pushed? No Evidence presented; no Agent recommendation.
Any write/mutation? No All SELECT / introspection. No INSERT/UPDATE/DELETE/DDL/CREATE/ALTER executed.

Self-audit verdict: PASS.


16. CRITICAL BLOCKERS — none for evidence-gathering

The rev6 registry split resolves all operational ambiguity. Only one residual AMBIGUOUS_FIELD remains (collection_display_name on collection_registry — informational, no goal blocked).

Outstanding decisions for GPT/User (not blockers for this dry-run)

  1. Nesting decision D1/D2/D3 — depth=2, 3 roots, 83 children, contiguous render_order per publication. Both D1 (preserve) and D2 (flatten) viable on data shape. D2 has smallest blast radius; D1 preserves tree fidelity.
  2. Species/composition (Phase 5B) — atom: 4 PLAUSIBLE / 20 total; molecule: 4 PLAUSIBLE / 11 total. No existing species is semantically law_unit. Per Phase 4D, a new species is likely needed.
  3. Provenance JSON structurecontent_profile.source_hashes.tac_v1 carrier confirmed (jsonb, currently empty on all 19 target rows). Migration script may write per Phase 4B addendum §7 contract.
  4. Hash recipe divergence (re-confirmed) — IU must recompute fn_content_hash(body). Source composite hash → JSON provenance only.
  5. collection_display_name AMBIGUOUS (informational)name vs name_en on collection_registry. Registry can split into collection_display_name_primary + collection_display_name_en in a future revision; not blocking.

17. Boundaries honored

  • No INSERT — confirmed.
  • No UPDATE — confirmed.
  • No DELETE — confirmed.
  • No DDL — confirmed.
  • No migration — confirmed.
  • No seed — confirmed.
  • No backfill — confirmed.
  • No function/trigger patch — confirmed.
  • No Directus/Nuxt/Qdrant changes — confirmed.
  • No nested/secondary agent dispatch — confirmed.
  • No production nesting/species/composition decision — confirmed.
  • No deprecated concept names in operational logic — confirmed (registry §0.1 rev6 only).
  • No hardcoded column names outside semantic field resolution — confirmed.
  • No fuzzy selectors — confirmed.

Phase 5 Dry-Run Report rev6 | Post-Phase5A disambiguation | Full G1–G11 PASS | evidence-only | 2026-05-11

Back to Knowledge Hub knowledge/dev/laws/dieu44-trien-khai/reports/p3d-pack1-phase5-tac-to-iu-migration-dryrun-report.md