fix(IMP-04): F12 F1 follow-ups — intersection optional + smoke title generic

Same-frame F1 follow-up commit per Codex round 37 (#15503). Matrix §4.1
Fix 7 4-class: F1 = small same-frame fix + Codex re-review (not F2/F3,
no Track A pause needed).

Two fixes (both Codex-caught) :

1. F1-a — `intersection` sub_zone contract semantics
   - Previous (c67609c) declared `cardinality: { strict: 1 }` on the
     intersection sub_zone, while the builder used `intersection_default: ""`
     and the partial hides empty intersection. That mismatch meant
     production payloads could silently omit the center concept while
     the contract still demanded strict 1.
   - Fix : `cardinality: { min: 0, max: 1 }` — intersection is now
     explicitly optional, matching analysis.md "slots 5개, required 4개"
     (intersection was originally the optional 5th slot).
   - Builder behavior unchanged (intersection_default = "" still
     produces empty when MDX has no center text; partial's :empty hide
     remains semantically correct).

2. F1-b — smoke harness viewer title leakage
   - Previous harness output had `<title>F14 render artifact — {template_id}</title>`
     hardcoded from the original F14-specific implementation.
   - Fix : generic `<title>Phase Z render artifact — {template_id}</title>`.
   - Affects all `--render-to` dev artifacts going forward.

Verification :
- python scripts/smoke_frame_render.py --self-check : PASS 5/5
- python scripts/smoke_frame_render.py construction_goals_three_circle_intersection
  --render-to data/runs/imp04_f12_visual_r2 : PASS, generated title now reads
  "Phase Z render artifact — construction_goals_three_circle_intersection"
- Catalog yaml parse : intersection cardinality = {min: 0, max: 1}

scope-lock honored : no V4 logic, no builder/parser logic, no other
partial, no Phase Z production render, no Phase R'/AI/Kei changes. F1
fix scope only.

Refs Gitea #4 (IMP-04 Track A frame 2 — F1 follow-up per Codex round 37)
This commit is contained in:
2026-05-13 11:57:45 +09:00
parent c67609c083
commit 766fa4639d
2 changed files with 2 additions and 2 deletions

View File

@@ -284,7 +284,7 @@ def render_to_dir(template_id: str, slot_payload: dict, out_dir: Path) -> tuple[
viewer = f"""<!DOCTYPE html>
<html lang="ko"><head>
<meta charset="UTF-8">
<title>F14 render artifact — {template_id}</title>
<title>Phase Z render artifact — {template_id}</title>
<style>
body {{ margin: 0; padding: 20px; background: #e8ecf0;
font-family: 'Noto Sans KR', sans-serif; word-break: keep-all; }}

View File

@@ -302,7 +302,7 @@ construction_goals_three_circle_intersection:
- id: intersection
role: emphasis
accepts: [text_block]
cardinality: { strict: 1 }
cardinality: { min: 0, max: 1 } # OPTIONAL — analysis.md "slots 5개, required 4개" 정합 (Codex F1-a 정정)
partial_target_path: ".f12b__intersection"
payload: