feat(catalog): activate construction_goals_three_circle_intersection (IMP-04 Track A 2/16)

Reason : V4 strongest UAI tier candidate (use_as_is=1 for 02-1, light_edit=1
for 01-1, restructure=1). Track A frame 2 per Codex rounds 30/33/35 V4-
priority rule. F14 clean pass completed at 834ed39; this is the next
Track A activation.

3-layer architecture context (matrix §0) :
- V4 = matching authority — V4 ranked this frame as use_as_is for the
  "DX의 궁극적 목표" section (02-1) and light_edit for "용어 정의" (01-1).
- figma_to_html (1171281189) = rich source/evidence — 510-line index.html
  base, full analysis/flat/texts/assets present (A+T+I+F+S).
- Phase Z = runtime orchestration — this commit adds the runtime contract,
  builder, partial, and fixture so the V4 candidate can be assembled.

New runtime additions :

1. src/phase_z2_mapper.py — new `cycle_intersect_3` PAYLOAD_BUILDERS entry
   - Reuses existing `quadrant_item` ITEM_PARSERS (label only, body
     ignored) — F16 parser reused, no new parser.
   - Produces flat keys : circle_1_label / circle_2_label / circle_3_label
     + intersection text (optional) — distinct from F16's quadrant_N_body
     structure since this frame's 3 main circles use labels only.
   - pad_to=3, truncate_at=3, configurable via builder_options.

2. templates/phase_z2/families/construction_goals_three_circle_intersection.html
   - Adapted from figma_to_html_agent/blocks/1171281189/index.html.
   - Slot mapping : title + 3 circle labels + optional intersection text.
   - PROMOTED CSS : 3 circle gradients (safety #BC652B/#A24200, productivity
     #897445/#3E3523, trust #296B55/#123328) + outer multiply blend +
     title gradient (#000#883700, F13/F14 zone-title family) + main
     label typography (white text + shadow).
   - NOT PROMOTED (P1 case-by-case, compact zone fit) : 6 accent hanja
     circles (安/質/速/利/通/信), 6 side labels (안전성 제고 etc.), 3
     decoration rects, 3 arc images, bg-texture multiply image. These
     are Figma-side decorative content not in MDX and would clutter a
     Phase Z zone of ~320 px.
   - ADAPTED : Figma 70/50/40 px → token-fixed font sizes, 350×350
     absolute-positioned overlapping circles → 110×110 flex row (cycle
     intent expressed via intersection text instead of geometric overlap).

3. templates/phase_z2/catalog/frame_contracts.yaml — append F12 contract
   - template_id, frame_id 1171281189, family=diagram, source_shape=
     top_bullets, strict cardinality 3, role_order [safety, productivity,
     trust].
   - visual_hints.min_height_px = 320, derived from 3 circle row 80 +
     title 30 + label area 60 + intersection 30 + padding 40 = 240
     + 80 safety buffer (lighter than F14's 350 since CSS-only).
   - accepted_content_types = [text_block] only.
   - 4 sub_zones declared (circle_1/2/3 main_text + intersection emphasis).

4. scripts/smoke_frame_render.py — add bundled fixture for F12 self-check.

Verification :
- python -m py_compile src/phase_z2_mapper.py scripts/smoke_frame_render.py
  : PASS
- python scripts/smoke_frame_render.py --self-check : PASS 5/5 (F12 added
  at 3691 chars CSS-only)
- python scripts/smoke_frame_render.py construction_goals_three_circle_intersection
  --render-to data/runs/imp04_f12_visual : PASS, R3 artifact written. 0
  raster refs (CSS-only partial); copy_assets ran successfully and
  produced data/runs/imp04_f12_visual/assets/construction_goals_three_circle_intersection/
  with the frame's 4 PNG files (unused since partial is CSS-only — assets
  remain available for future raster promotion if visual inspection
  flags fidelity loss).
- python run_mdx03_pipeline.py --phase-z2 --run-id imp04_f12_regression
  : PASS (MDX 03 V4 rank-1 still F13/F29, F12 not selected — F12 only
  triggered by 02-1 / 01-1 sections per V4 evidence)

scope-lock honored : V4 logic / V4 evidence / mapper existing builders /
composition planner / Phase R' / pipeline production render path / AI/Kei
all unchanged. New builder added without modifying existing 3 (mixed
strategy per scope-lock §4).

Calibration status (matrix §4.1 Fix 7 4-class) :
- class 1 adapter readiness : new builder registered, partial loadable,
  contract valid, smoke passing.
- class 2 content-fit : compact 110×110 circles + label, watch for label
  overflow if MDX bullets exceed ~12 chars.
- class 3/4 mapping/routing : not applicable for this commit.
- Codex review mandatory per scope-lock §5 (new builder pattern
  cycle_intersect_3 first introduction).

Refs Gitea #4 (IMP-04 Track A frame 2 — V4 strongest UAI tier)
This commit is contained in:
2026-05-13 11:50:44 +09:00
parent 46e9db30b2
commit c67609c083
4 changed files with 310 additions and 0 deletions

View File

@@ -248,3 +248,73 @@ three_persona_benefits:
item_parser: quadrant_item # ITEM_PARSERS entry (F16 재사용)
array_root: personas # payload.personas = list of items
role_field: color_class # role_order[i] → item.color_class
construction_goals_three_circle_intersection:
# Reason : V4 use_as_is=1 (02-1) + light_edit=1 (01-1) + restructure=1 — UAI tier strongest.
# Pattern : diagram / cycle-3way-intersection (3 메인 원 + 중앙 intersection).
# Track A frame 2 / IMP-04 Track A V4 priority strict (Codex round 30/33/35 합의).
template_id: construction_goals_three_circle_intersection
frame_id: 1171281189
family: diagram
source_shape: top_bullets
cardinality:
strict: 3 # 3 메인 원 — strict.
overflow_policy: abort_or_review
# 순서 기반 visual role (3 메인 원 각자 다른 gradient — index.html L141-189).
# circle_1 = 안전(orange/red), circle_2 = 생산성(brown/grey), circle_3 = 소통(green/dark).
role_order:
- safety
- productivity
- trust
# min_height_px derivation :
# Figma frame total height = 1195 px @ scale 0.58312 → 697 px adapted (full frame).
# Phase Z slide-body ≤ 585 px → compact adapted layout 필요.
# Content density (3 메인 원 visual + title) — F14 (350, raster-heavy) 보다 가벼움.
# Derived = 320 (3 원 60-80 px × 3 + title 30 + intersection 30 + padding 30).
# Confirm via smoke `--render-to` artifact (R3 acceptance gate).
visual_hints:
min_height_px: 320
accepted_content_types:
- text_block
# Frame Slot 선언 (SPEC v1 §3 layer B). 3 메인 원 + intersection center.
sub_zones:
- id: circle_1
role: main_text
accepts: [text_block]
cardinality: { strict: 1 }
partial_target_path: ".f12b__circles > .f12b__circle:nth-child(1)"
- id: circle_2
role: main_text
accepts: [text_block]
cardinality: { strict: 1 }
partial_target_path: ".f12b__circles > .f12b__circle:nth-child(2)"
- id: circle_3
role: main_text
accepts: [text_block]
cardinality: { strict: 1 }
partial_target_path: ".f12b__circles > .f12b__circle:nth-child(3)"
- id: intersection
role: emphasis
accepts: [text_block]
cardinality: { strict: 1 }
partial_target_path: ".f12b__intersection"
payload:
title:
source: section.title
# New builder `cycle_intersect_3` (phase_z2_mapper.py) — 3 circle labels + intersection.
# parser 재사용 = `quadrant_item` (label 만 사용, body 무시).
builder: cycle_intersect_3
builder_options:
item_parser: quadrant_item # F16 의 parser 재사용 (label only)
pad_to: 3
truncate_at: 3
label_key_pattern: "circle_{n}_label"
empty_label: ""
intersection_default: "" # MDX 안 intersection 명시 안 되면 빈 문자