KB-514B
dot-iu-cutter v0.2 — BR-5 canonical-address-v1 Ratification Closure (2026-05-15)
9 min read Revision 1
dieu44-trien-khaidot-iu-cutterv0.2br-5canonical-address-v1ratificationclosureclosed-with-notesdieu242026-05-15
dot-iu-cutter v0.2 — BR-5 canonical-address-v1 Ratification Closure
document_path: knowledge/dev/laws/dieu44-trien-khai/v0.2-planning/dot-iu-cutter-v0.2-br-5-canonical-address-v1-ratification-closure-2026-05-15.md
revision: r1
date: 2026-05-15
author: Agent (Claude Code CLI, Opus 4.7 1M)
sovereign: User / anh Huyên
verifier: GPT (Đ32 HIGH-risk path)
secondary: Opus
phase: v0.2 planning — BR-5 closure record
mutation_performed: false
ddl_written: false
§1 — Closure Status
BR_5_status: closed_with_notes
closure_basis: GPT review accepted the BR-5 ratification request recommendation on 2026-05-15; d38-v1 explicitly rejected
agent_revision_needed: false
mutation_performed: false
phase_alpha_design_unblocked_from_BR_5_side: true
§2 — Ratified Version Identifier
version_string: canonical-address-v1
short_form_allowed: cav1 (for jsonb / index payloads where size matters)
rejected_alternative: d38-v1 (couples version label to a specific doc id; not future-proof)
binding: the DEFAULT value for public.tac_logical_unit.canonical_address_format_version (when added in Phase α) is 'canonical-address-v1'
§3 — Ratified Grammar
canonical_form (storage layer):
D{doc}-DIEU{N}-{S{seg}|ROOT}[-P{n}][-{n}]
EBNF (excerpt; full grammar in BR-5 request §5):
canonical_address = doc_prefix , "-" , section_prefix , [ "-" , subsegment_chain ] ;
doc_prefix = "D" , doc_id ;
doc_id = digit , { digit } ;
section_prefix = root_marker | numbered_section ;
root_marker = "DIEU" , dieu_number , "-" , "ROOT"
| section_code_token , "-" , "ROOT" ;
numbered_section = "DIEU" , dieu_number , "-" , section_token
| section_code_token , "-" , section_token ;
section_code_token = uppercase_letter , { uppercase_letter | digit } ;
section_token = "S" , digit , { digit } ;
subsegment = ("P" , digit , { digit }) | (digit , { digit }) ;
subsegment_chain = subsegment , [ "-" , subsegment_chain ] ;
§4 — Storage Rules (ratified)
character_set: ASCII only (no Vietnamese diacritics)
separator: hyphen "-" between tokens
case_sensitivity: case-sensitive; canonical form is UPPER-CASE for doc/section/subsegment tokens
whitespace: NONE (forbidden inside an address)
max_length: not bounded by v1; UNIQUE constraint enforces practical bound
collision_policy_at_storage_layer: DB unique index rejects duplicates
nullability_in_schema: unchanged from current production state (NOT NULL on tac_logical_unit + 5 sister tables; NULL allowed only on birth_registry)
4.1 Validity examples (ratified)
VALID:
D38-DIEU28-ROOT
D38-DIEU28-S0
D38-DIEU28-S10
D38-DIEU28-S1-P1
D38-DIEU35-S4-P1-3
D38-C1A-ROOT
D38-C1A-S4-P7
D40-DIEU44-ROOT
D38-DIEU44-S5
INVALID:
D38-DIEU28-S2.1 (dot separator — only hyphen allowed)
Đ44§5.3.1 (Vietnamese diacritic + section sign — ASCII only)
d38-DIEU28-S2 (lower-case doc prefix)
D38_DIEU28_S2 (underscore separator)
D38-DIEU-28-S2 (hyphen between DIEU and number — must concat as DIEU{N})
D38 DIEU28 S2 (whitespace forbidden)
D38-DIEU28- (trailing separator)
"" (empty)
NULL (on NOT-NULL columns)
§5 — Storage / Display Decoupling (ratified)
storage_form_authoritative: D38-DIEU28-S2-P1 (ASCII, v1)
display_form_human_facing: e.g., "Đ28 §2.1" (i18n; rendered by presentation-layer renderer)
storage_value_NEVER_changes_for_display_purposes: TRUE
display_renderer_responsibility:
- read canonical_address column
- parse via the v1 grammar
- emit the human form for citation surfaces (D11 §4.13 consumer contract)
display_renderer_layer: out of v0.2 P0 scope; expected placement is Nuxt SSR / client (the existing reader per BR-3 §9)
v1_grammar_changes_do_NOT_require_renderer_changes_unless: storage syntax changes substantively (would trigger v1.1 or v2)
§6 — Non-Law Artifact Format (ratified deferral)
non_law_artifact_formats (e.g., design artifacts, code symbols, reports, runbooks):
status: EXPLICITLY DEFERRED — NOT part of canonical-address-v1
deferred_to: future Đ24 follow-up
trigger_for_future_ratification: emergence of a concrete production use-case for storing non-law canonical addresses
reserved_path: a separate v-NL-1 vocabulary (or v1.1 extension) — to be designed when needed
v0_2_Phase_α_treatment: do not introduce any non-law form columns or grammar extensions
§7 — Compatibility with Phase α (closure note)
column_to_add_in_phase_alpha: public.tac_logical_unit.canonical_address_format_version
column_type: text
column_nullable_in_phase_alpha: NO (NOT NULL with DEFAULT 'canonical-address-v1')
column_default_at_DDL_add_time: 'canonical-address-v1'
backfill_for_existing_86_rows: AUTOMATIC at column-add time (DEFAULT value applied); no separate UPDATE statement needed
mirror_on_sandbox_tac.logical_unit: SAME — column added with same DEFAULT; 76 sandbox rows get 'canonical-address-v1' at column-add time (per BR-7 Option II)
constraint_on_value: column may carry future version strings (e.g., 'canonical-address-v1.1', 'canonical-address-v2'); v0.2 Phase α does NOT enforce a FK or CHECK constraint on the value — Phase β may add a Đ24-vocabulary FK if a registry table is established
duplicate_storage_in_identity_profile_jsonb_(BR-2_finding):
- 27 of 86 rows have canonical_address duplicated inside identity_profile
- cosmetic; out of v0.2 Phase α scope
- Đ24 ratifies that the canonical_address COLUMN is the authoritative source; jsonb mirror is redundant; cleanup deferred
§8 — Hard Boundaries
no_DDL_written_in_this_closure: TRUE
no_SQL_mutation: TRUE
no_ALTER_TABLE: TRUE
no_INSERT_UPDATE_DELETE: TRUE
no_migration: TRUE
no_change_to_tac_logical_unit: TRUE
no_change_to_sandbox_tac: TRUE
no_change_to_cutter_governance: TRUE
no_change_to_sister_tables: TRUE
no_phase_alpha_design_started: TRUE
no_phase_alpha_DDL_authored: TRUE
no_deploy: TRUE
agent_self_advance_to_phase_alpha: PROHIBITED
output_form: br_5_closure_record_documentation_only
§9 — Status Roll-Up
BR-5_status: closed_with_notes
phase_alpha_design_unblocked_from_BR_5_side: TRUE
phase_alpha_design_unblocked_overall: depends on BR-4 closure (companion file) and a separate explicit prompt
remaining_blockers_after_this_closure (separate scope):
- BR-6 split/merge metadata propagation TD (blocks P0-2 design only, NOT Phase α DDL)
§10 — Cross-References
br_5_request_source: knowledge/dev/laws/dieu44-trien-khai/v0.2-planning/dot-iu-cutter-v0.2-br-5-dieu24-canonical-address-v1-ratification-request-2026-05-15.md
br_4_5_gpt_review: knowledge/dev/laws/dieu44-trien-khai/reviews/dot-iu-cutter-v0.2-br-4-5-gpt-review-2026-05-15.md
br_4_closure_companion: knowledge/dev/laws/dieu44-trien-khai/v0.2-planning/dot-iu-cutter-v0.2-br-4-authority-backfill-rule-closure-2026-05-15.md
br_4_5_closure_report: knowledge/dev/laws/dieu44-trien-khai/v0.2-planning/dot-iu-cutter-v0.2-br-4-5-closure-report-2026-05-15.md
closure_readiness_predecessor: knowledge/dev/laws/dieu44-trien-khai/v0.2-planning/dot-iu-cutter-v0.2-br-4-5-closure-readiness-report-2026-05-15.md
production_evidence_schema_snapshot (86 + 76 + 98 + 13 + 44726 rows confirm syntax): /opt/incomex/backups/dieu44_exec_2026-05-15/directus_schema_pre_20260515T141429Z.sql sha256 638307fd62d4b1aa087ce7f70f42112c4c6185a2e44d8144a1d859029515668a
v0_2_scope_backlog: knowledge/dev/laws/dieu44-trien-khai/planning/dot-iu-cutter-v0.2-scope-backlog-2026-05-15.md
§11 — Sign-Off Block
agent (author): Claude Code CLI / Opus 4.7 1M action: BR-5 closure record authored
verifier (Đ32 HIGH-risk path): GPT action: BR-5 review — PASS (recorded in companion review file)
secondary (record keeping): Opus action: closure stored in Agent Data — DONE (this file)
sovereign (authorizing party): User / anh Huyên action: any next-step prompt to authorize Phase α design — PENDING
council_review_status:
Đ24: ratification recorded via GPT review (accepted: canonical-address-v1; rejected: d38-v1; grammar ratified per §3; non-law artifact deferral per §6); FUTURE Đ24 formal pass only required if grammar revised or non-law extension landed
Đ32: standard risk class accepted
End of BR-5 canonical-address-v1 ratification closure.