KB-7710

GPT Review — DIEU-32 Root Cause — Approve synthesize_title Policy + Retry — 2026-05-14

6 min read Revision 1
gpt-reviewdieu32root-causesynthesize-titlephase5c2retry-authorized2026-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-ROOT
    • D38-DIEU32-S2
    • D38-DIEU32-S3
    • D38-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
Back to Knowledge Hub knowledge/dev/laws/dieu44-trien-khai/reviews/gpt-review-dieu32-root-cause-approve-synthesize-title-retry-2026-05-14.md