GPT Review — DIEU-32 Root Cause — Approve synthesize_title Policy + Retry — 2026-05-14
GPT Review — DIEU-32 Root Cause — Approve synthesize_title Policy + Retry — 2026-05-14
Scope reviewed
Reviewed:
- Root-cause investigation report:
knowledge/dev/laws/dieu44-trien-khai/reports/dieu32-null-heading-body-root-cause-investigation-report.md - Prior GPT root-cause gate:
knowledge/dev/laws/dieu44-trien-khai/reviews/gpt-review-r1-r2-results-dieu32-root-cause-required-before-policy-2026-05-14.md - DIEU-32 block report:
knowledge/dev/laws/dieu44-trien-khai/reports/p3d-phase5c2-r2-dieu32-pilot-migration-execution-report.md - Consolidated R1/R2 report:
knowledge/dev/laws/dieu44-trien-khai/reports/p3d-phase5c2-r1-r2-consolidated-status-report.md - Historical DIEU-32 TAC execution/render report:
knowledge/dev/laws/dieu38-trien-khai/reports/p10b-1c-d32-execute-report-2026-04-29.md
Opus review upload path was not found in KB at review time, but the user's pasted Opus summary is directionally consistent with the Agent investigation.
Verdict
Status: APPROVE_DIEU32_SYNTHESIZE_TITLE_POLICY__AUTHORIZE_DIEU32_ONLY_RETRY
The Agent investigation is accepted.
DIEU-32 is not a defective law and not a data-loss case. The root cause is an intentional TAC container-heading representation plus a TAC→IU model gap: TAC permits body IS NULL for title-only container headings, while fn_iu_create requires non-null body.
Accepted root cause
root_cause_classification=INTENTIONAL_TAC_HEADING_CONTAINER
secondary=TAC_TO_IU_MODEL_GAP
data_loss_detected=false
historical_roundtrip_zero_drift_confirmed=true
current_render_matches_original=true
original_law_available=true
null_body_rows=4
null_body_rows_all_heading=true
Decisive evidence:
- The four NULL-body rows are exactly and only container headings with children:
D38-DIEU32-ROOTD38-DIEU32-S2D38-DIEU32-S3D38-DIEU32-S4
- Historical P10B-1C rendered DIEU-32 back to the original law with 0 content drift.
- Original law has no body text under those heading levels; visible content is the title line.
- Cross-publication comparison shows D28 uses empty string for equivalent container headings, while D32 uses NULL; both encode the same semantic.
Approved policy
POLICY_SYNTHESIZE_TITLE_FOR_HEADING_NULL_BODY
Rule:
IF source.section_type = 'heading' AND source.body IS NULL THEN
iu_body := source.title
identity_profile.body_source := 'synthesized_from_title_due_to_tac_heading_null_body'
content_profile.body_source := 'synthesized_from_title_due_to_tac_heading_null_body'
content_profile.src_body_was_null := true
content_profile.src_title := source.title
content_profile.src_content_hash := source.content_hash
ELSE
iu_body := source.body
content_profile.body_source := 'preserved_from_tac_unit_version_body'
ENDIF
This is not content repair. It is a governed representation conversion from TAC's heading-container model to IU's body-required model.
V-3b' policy patch
Approved conditional V-3b':
IF body_source='preserved_from_tac_unit_version_body' THEN
require unit_version.body = tac_unit_version.body
ELSIF body_source='synthesized_from_title_due_to_tac_heading_null_body' THEN
require unit_version.body = tac_logical_unit.title
require source.section_type='heading'
require source.body IS NULL
require content_profile.src_body_was_null=true
require identity_profile.body_source = content_profile.body_source
ELSE
FAIL
ENDIF
V-3a and V-3c remain unchanged:
V-3a: IU-side hash consistency required.
V-3c: TAC hash preserved as provenance required.
V-3d: cross-system hash equality remains report-only, not a gate.
Generality
The approved rule is general for future cutter work, not DIEU-32-specific:
section_type='heading' AND source.body IS NULL
Conservative implementation note:
- If
section_type='heading' AND body IS NULL AND children>0, apply policy. - If
section_type='heading' AND body IS NULL AND children=0, treat as soft/high-risk flag or blocker unless design later expands the rule.
For this DIEU-32 retry, all four policy rows have children > 0.
Authorization
Authorize DIEU-32-only retry.
Allowed:
Migrate exactly current live DIEU-32 rows.
Use fn_iu_create canonical writer.
Apply synthesize_title only for the four approved heading-container rows if still matching live facts.
Patch profile/provenance only for captured newly-created rows.
Create birth rows only via existing trigger.
Write rollback keys to KB + VPS log before COMMIT.
Forbidden:
No TAC writes.
No UI cutover.
No vector/Qdrant work.
No DDL/schema/function/trigger changes.
No Directus/Nuxt/config changes.
No bulk migration beyond DIEU-32.
No touching existing 75 IU rows.
No automatic content repair beyond approved heading-title synthesis.
No pattern delete.
Expected result
DIEU-32: 23 IU + 23 UV + 23 birth rows committed.
4 rows body_source=synthesized_from_title_due_to_tac_heading_null_body.
19 rows body_source=preserved_from_tac_unit_version_body.
Final IU count expected: 98 (=75+23), unless live state changed.
TAC unchanged.
UI/vector untouched.
Next action
Create and dispatch a DIEU-32-only retry prompt:
knowledge/dev/laws/dieu44-trien-khai/prompts/agent-phase5c2-dieu32-retry-synthesize-title-policy-2026-05-14.md
After retry PASS, move to dot-iu-cutter v0.1 design as the next mainline.
Final flags
gpt_review_status=PASS
synthesize_title_policy_approved=true
dieu32_retry_authorized=true
dieu32_only_scope=true
automated_cutter_design_next_after_dieu32=true
ui_cutover_allowed=false
vector_work_allowed=false
bulk_migration_allowed=false