feat(catalog): activate dx_sw_necessity_three_perspectives (IMP-04 Track A 5/16)

Reason : V4 LE=2 (03-1 + 01-1) + RS=1 — V4 LE tier strongest remaining
after F12/F11/F18 UAI tier. Track A frame 5 per Codex round 45 V4-priority
acceptance.

3-layer architecture (matrix §0) :
- V4 = matching authority — V4 ranked this frame light_edit for 03-1 (DX 시행
  필수 요건) and 01-1 (용어 정의).
- figma_to_html (1171281198) = source/evidence — 386-line index.html + assets/.
- Phase Z = runtime — this commit adds catalog + partial + smoke fixture.

Builder reuse (no new builder/parser introduced) :
- Reuses existing `quadrant_flat_slots` builder (F16/F11 pattern) with
  pad_to=3 + `perspective_{n}_label` / `perspective_{n}_body` keys.
- Reuses existing `quadrant_item` parser.
- Same flat-keyed label+body grammar as F11; only N=3 + key names differ.
- mapper.py unchanged — secondary builder reuse per Codex round 45.

3 file changes :

1. templates/phase_z2/families/dx_sw_necessity_three_perspectives.html
   - Adapted from figma_to_html_agent/blocks/1171281198/index.html.
   - 3-column grid (BIM 전면설계 / 디지털 전환 S/W / 고부가가치 산업전환).
   - PROMOTED CSS : header bar dark green (#296B55 → #123328 Figma green
     family), header text white bold, title gradient (#000#883700
     F13/F14/F12/F11/F18 zone-title family), card border + bullet markers
     (green family).
   - NOT PROMOTED (P1 case-by-case + preservation guardrail per Codex
     round 37) : 상단 dark green banner ("디지털 전환(DX)은 S/W가 필수다"
     visual block), 좌측 DX circular area (multi-image + center text +
     decor — main rhetorical anchor but cannot fit compact zone),
     hanmaek/한자/배경 텍스처. figma_to_html source evidence preserved.
   - ADAPTED : Figma 90/65/40 px → token-fixed, 1280×426 absolute +
     zoom → Phase Z 3-column grid, 3 perspective cards → flex column.

2. templates/phase_z2/catalog/frame_contracts.yaml
   - F20 contract appended.
   - frame_id=1171281198, family=cards, source_shape=top_bullets, strict 3,
     role_order=[perspective_1, perspective_2, perspective_3].
   - visual_hints.min_height_px = 320 (3 col × header 30 + body bullets ~75
     + title 30 + padding 30 = ~195 + 125 buffer for label/5+ bullet
     overflow; F12/F11/F18 class).
   - accepted_content_types = [text_block].
   - 3 sub_zones (perspective_1/2/3 main_text).
   - payload.builder = quadrant_flat_slots (reuse) with perspective_{n}_*
     key patterns.

3. scripts/smoke_frame_render.py — bundled fixture for F20 self-check.

Verification :
- python scripts/smoke_frame_render.py --self-check : PASS 8/8 (F20 added
  at 3160 chars CSS-only)
- python scripts/smoke_frame_render.py dx_sw_necessity_three_perspectives
  --render-to data/runs/imp04_f20_visual : PASS, R3 artifact, 0 raster
  refs (CSS-only)
- python run_mdx03_pipeline.py --phase-z2 --run-id imp04_f20_regression :
  PASS (MDX 03 V4 rank-1 still F13/F29; F20 light_edit candidate for 03-1
  but F13 was use_as_is at higher rank, so F20 not selected here)

scope-lock honored (3-layer + 4-class) :
- V4 logic / V4 evidence yaml : unchanged
- Existing PAYLOAD_BUILDERS (5 builders) : unchanged. No new builder added.
- Existing ITEM_PARSERS (3 parsers) : unchanged. No new parser added.
- Existing 7 partials : unchanged.
- Composition planner / production render / Phase R' / AI/Kei : unchanged.

4-class status :
- class 1 readiness :  contract + builder reuse + partial + smoke fixture
  + R3 artifact aligned.
- class 2 content-fit : watch — header single-line, body 3-5 bullets per
  column. 6+ bullets per column may overflow.
- class 3/4 : N/A.

Codex review remains useful (per scope-lock §5 "shared catalog/builder
logic" category — quadrant_flat_slots is now reused by F16/F11/F20). New
builder/parser path is NOT this commit.

Refs Gitea #4 (IMP-04 Track A frame 5 — V4 LE tier, builder reuse)
This commit is contained in:
2026-05-13 12:28:49 +09:00
parent f7a9240fe5
commit bc58102b66
3 changed files with 244 additions and 0 deletions

View File

@@ -218,6 +218,27 @@ _MOCK_BIM_DX_COMPARISON = {
],
}
# Track A frame 5 — dx_sw_necessity_three_perspectives (frame 20).
# Builder reuse = quadrant_flat_slots (F11 pattern) — pad_to=3, perspective_N keys.
_MOCK_DX_SW_NECESSITY = {
"title": "디지털 전환(DX)은 S/W가 필수다",
"perspective_1_label": "BIM 전면설계",
"perspective_1_body": [
{"text": "건설산업 생산성 향상", "indent": 0},
{"text": "고부가가치 산업 전환", "indent": 0},
],
"perspective_2_label": "디지털 전환 S/W",
"perspective_2_body": [
{"text": "노동집약형 업무 탈피", "indent": 0},
{"text": "S/W 고도화 + 투자 필요", "indent": 0},
],
"perspective_3_label": "고부가가치 산업전환",
"perspective_3_body": [
{"text": "기본기술 이해 발전 필요", "indent": 0},
{"text": "DX 통한 Process 혁신", "indent": 0},
],
}
SELF_CHECK_FIXTURES: dict[str, dict] = {
"three_parallel_requirements": _MOCK_THREE_PARALLEL,
"process_product_two_way": _MOCK_PROCESS_PRODUCT,
@@ -226,6 +247,7 @@ SELF_CHECK_FIXTURES: dict[str, dict] = {
"construction_goals_three_circle_intersection": _MOCK_CONSTRUCTION_GOALS,
"construction_bim_three_usage": _MOCK_CONSTRUCTION_BIM_USAGE,
"bim_dx_comparison_table": _MOCK_BIM_DX_COMPARISON,
"dx_sw_necessity_three_perspectives": _MOCK_DX_SW_NECESSITY,
}