feat(catalog): activate bim_current_problems_paired (IMP-04 Track A 8/16)
V4 signal = restructure 1 (4 MDX sample). Catalog-completeness activation —
Codex round 51 guardrail (per-frame source-evidence check, not blind F16
reuse). Source confirmed as 2x2 paired-rows BIM problem layout, distinct
from F16's quadrant-4 framing.
3-layer architecture (matrix §0) :
- V4 = matching authority — restructure tier signal; runtime activation
prepares Phase Z to assemble this frame when V4 ranks it.
- figma_to_html (1171281194) = source/evidence — 4 BIM problem cards in
2x2 grid (개념 부재 / 잘못된 접근방식 / 방향성 상실 / 전제조건 오류).
- Phase Z = runtime — adds catalog + partial + smoke fixture.
Builder reuse :
- `quadrant_flat_slots` reused with pad_to=4 + `issue_{n}_label/body` keys.
- `quadrant_item` parser reused.
- F16 quadrant pattern reused, but the partial is a 2-row × 2-column
problem-theme grid (red/orange/amber/deep-amber), not the F16 TL/TR/BL/BR
quadrant visual. Source-evidence-driven decision per Codex round 51 §10.
3 file changes :
1. templates/phase_z2/families/bim_current_problems_paired.html
- 2x2 CSS grid with per-issue problem theme.
- PROMOTED CSS : per-cell warning gradient (red/orange/amber/deep-amber),
title gradient (zone-title family), "!" bullet markers in per-cell color.
- NOT PROMOTED : Figma source banner / numbered badges / texture —
figma_to_html source evidence preserved for future fidelity review.
- ADAPTED : Figma absolute positioning → CSS grid 2x2, token-fixed
typography.
2. templates/phase_z2/catalog/frame_contracts.yaml — F17 contract appended
- frame_id=1171281194, family=cards, source_shape=top_bullets, strict 4,
role_order=[issue_1..issue_4].
- visual_hints.min_height_px = 350 (F16/F14 class — 2-row × 2-col density).
- accepted_content_types = [text_block].
- payload.builder = quadrant_flat_slots reuse with issue_{n}_* keys.
3. scripts/smoke_frame_render.py — bundled fixture for F17.
Verification :
- python scripts/smoke_frame_render.py --self-check : PASS 11/11 (F17 at
3856 chars CSS-only)
- python scripts/smoke_frame_render.py bim_current_problems_paired
--render-to data/runs/imp04_f17_visual : PASS, 0 raster refs
- python run_mdx03_pipeline.py --phase-z2 --run-id imp04_f17_regression :
PASS (MDX 03 V4 rank-1 unchanged; F17 not in MDX 03 V4 selection so
this is non-impacting regression check)
scope-lock honored : V4 logic / mapper / production render / Phase R' /
AI/Kei / 10 existing partials all unchanged.
4-class status :
- class 1 readiness : ✅
- class 2 content-fit : watch — paragraph-heavy source (each issue body
is multi-line Korean text). Compact 2x2 cell may need wrap. max-content
fit checked via R3 artifact.
- class 3 : N/A
- class 4 : N/A
Refs Gitea #4 (IMP-04 Track A frame 8 — V4 RS tier, source-evidence-confirmed)
This commit is contained in:
@@ -280,6 +280,17 @@ SELF_CHECK_FIXTURES: dict[str, dict] = {
|
||||
"emphasis_3_label": "실무 적용 불가",
|
||||
"emphasis_3_body": [{"text": "특수성 반영 어려움", "indent": 0}],
|
||||
},
|
||||
"bim_current_problems_paired": {
|
||||
"title": "현황 및 문제점",
|
||||
"issue_1_label": "개념 부재",
|
||||
"issue_1_body": [{"text": "CAD 확장판 오인", "indent": 0}],
|
||||
"issue_2_label": "잘못된 접근방식",
|
||||
"issue_2_body": [{"text": "도구로만 인식", "indent": 0}],
|
||||
"issue_3_label": "방향성 상실",
|
||||
"issue_3_body": [{"text": "대형 S/W 의존", "indent": 0}],
|
||||
"issue_4_label": "전제조건 오류",
|
||||
"issue_4_body": [{"text": "건축·토목 혼용", "indent": 0}],
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -632,3 +632,71 @@ sw_reality_three_emphasis:
|
||||
body_key_pattern: "emphasis_{n}_body"
|
||||
empty_label: ""
|
||||
empty_body: []
|
||||
|
||||
|
||||
bim_current_problems_paired:
|
||||
# Reason : V4 RS=1 (4 MDX sample 안 restructure 1). 32-frame all-in scope —
|
||||
# **catalog-completeness activation** (NOT V4 endorsement — V4 신호 유효 단 restructure
|
||||
# tier 이며 직접 use_as_is/light_edit 추천 없음).
|
||||
# Pattern : cards/paired-rows-2x2 — 4 problem cards in 2x2 grid (BIM 수행 4 문제).
|
||||
# Track A frame 8. Builder 재사용 = `quadrant_flat_slots` (F16 pattern, pad_to=4).
|
||||
template_id: bim_current_problems_paired
|
||||
frame_id: 1171281194
|
||||
family: cards
|
||||
|
||||
source_shape: top_bullets
|
||||
cardinality:
|
||||
strict: 4 # 4 issues (2x2 grid)
|
||||
overflow_policy: abort_or_review
|
||||
|
||||
role_order:
|
||||
- issue_1
|
||||
- issue_2
|
||||
- issue_3
|
||||
- issue_4
|
||||
|
||||
# min_height_px : F16 (quadrant 4) 와 동등 class.
|
||||
# 2 row × 2 col × (label 24 + body 60) + title 30 + gaps + padding = ~280 + buffer 70 = **350**.
|
||||
visual_hints:
|
||||
min_height_px: 350
|
||||
|
||||
accepted_content_types:
|
||||
- text_block
|
||||
|
||||
sub_zones:
|
||||
- id: issue_1
|
||||
role: main_text
|
||||
accepts: [text_block]
|
||||
cardinality: { strict: 1 }
|
||||
partial_target_path: ".f17b__grid > .f17b__cell:nth-child(1)"
|
||||
- id: issue_2
|
||||
role: main_text
|
||||
accepts: [text_block]
|
||||
cardinality: { strict: 1 }
|
||||
partial_target_path: ".f17b__grid > .f17b__cell:nth-child(2)"
|
||||
- id: issue_3
|
||||
role: main_text
|
||||
accepts: [text_block]
|
||||
cardinality: { strict: 1 }
|
||||
partial_target_path: ".f17b__grid > .f17b__cell:nth-child(3)"
|
||||
- id: issue_4
|
||||
role: main_text
|
||||
accepts: [text_block]
|
||||
cardinality: { strict: 1 }
|
||||
partial_target_path: ".f17b__grid > .f17b__cell:nth-child(4)"
|
||||
|
||||
payload:
|
||||
title:
|
||||
source: section.title
|
||||
# Builder 재사용 = `quadrant_flat_slots` (F16 pattern, pad_to=4).
|
||||
# F16 = TL/TR/BL/BR quadrant. F17 = paired-rows-2x2 (top-left/top-right/bottom-left/bottom-right).
|
||||
# 차이 = key prefix only ("quadrant_N" vs "issue_N"). partial layout 동일 2x2 grid.
|
||||
builder: quadrant_flat_slots
|
||||
builder_options:
|
||||
item_parser: quadrant_item # 재사용
|
||||
pad_to: 4
|
||||
truncate_at: 4
|
||||
label_key_pattern: "issue_{n}_label"
|
||||
body_key_pattern: "issue_{n}_body"
|
||||
empty_label: ""
|
||||
empty_body: []
|
||||
|
||||
137
templates/phase_z2/families/bim_current_problems_paired.html
Normal file
137
templates/phase_z2/families/bim_current_problems_paired.html
Normal file
@@ -0,0 +1,137 @@
|
||||
<!-- Phase Z-2 MVP-1.5b frame-derived adapted block.
|
||||
§17 룰 — Figma 시각 언어 promote, geometry 만 zone-compatible adapt. -->
|
||||
{#
|
||||
─────────────────────────────────────────────────────────────────────────────
|
||||
Frame 17 = "현황 및 문제점" (cards/paired-rows-2x2). 4 problem cards in 2x2 grid.
|
||||
Track A frame 8 (V4 RS=1 — restructure tier, V4 catalog-completeness 정합).
|
||||
Builder 재사용 = `quadrant_flat_slots` (F16 pattern, pad_to=4) + `issue_{n}_*` keys.
|
||||
|
||||
PROMOTED CSS : per-issue warning theme (4 distinct color tints), title gradient.
|
||||
NOT PROMOTED : Figma source decoration / banner / texture / numbered badges — figma_to_html 보존.
|
||||
ADAPTED : Figma absolute → 2x2 CSS grid + token-fixed typography.
|
||||
|
||||
slots : title, issue_1/2/3/4_label, issue_1/2/3/4_body.
|
||||
#}
|
||||
|
||||
<style>
|
||||
.f17b {
|
||||
width: 100%; height: 100%;
|
||||
display: flex; flex-direction: column;
|
||||
gap: 6px;
|
||||
font-family: 'Noto Sans KR', 'Pretendard', sans-serif;
|
||||
word-break: keep-all;
|
||||
}
|
||||
.f17b__title {
|
||||
font-size: var(--font-zone-title);
|
||||
font-weight: 700;
|
||||
line-height: var(--lh-zone-title);
|
||||
background-image: linear-gradient(180deg, #000 0%, #883700 100%);
|
||||
-webkit-background-clip: text; background-clip: text;
|
||||
color: transparent;
|
||||
flex-shrink: 0;
|
||||
filter: drop-shadow(0 0 3px rgba(50,44,30,0.4));
|
||||
}
|
||||
|
||||
/* 2x2 grid */
|
||||
.f17b__grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
grid-template-rows: 1fr 1fr;
|
||||
gap: 8px;
|
||||
flex: 1 1 auto;
|
||||
min-height: 0;
|
||||
}
|
||||
.f17b__cell {
|
||||
display: flex; flex-direction: column;
|
||||
border: 2px solid;
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
background: #fff;
|
||||
min-height: 0;
|
||||
}
|
||||
/* per-issue color theme (problem warning family) */
|
||||
.f17b__cell:nth-child(1) { border-color: #dc2626; } /* red */
|
||||
.f17b__cell:nth-child(2) { border-color: #ea580c; } /* orange */
|
||||
.f17b__cell:nth-child(3) { border-color: #d97706; } /* amber */
|
||||
.f17b__cell:nth-child(4) { border-color: #b45309; } /* deep amber */
|
||||
|
||||
.f17b__label {
|
||||
color: #fff;
|
||||
font-weight: 700;
|
||||
font-size: var(--font-sub-title);
|
||||
line-height: 1.15;
|
||||
padding: 5px 10px;
|
||||
text-align: center;
|
||||
flex-shrink: 0;
|
||||
letter-spacing: -0.02em;
|
||||
}
|
||||
.f17b__cell:nth-child(1) .f17b__label { background: linear-gradient(180deg, #dc2626 0%, #991b1b 100%); }
|
||||
.f17b__cell:nth-child(2) .f17b__label { background: linear-gradient(180deg, #ea580c 0%, #9a3412 100%); }
|
||||
.f17b__cell:nth-child(3) .f17b__label { background: linear-gradient(180deg, #d97706 0%, #92400e 100%); }
|
||||
.f17b__cell:nth-child(4) .f17b__label { background: linear-gradient(180deg, #b45309 0%, #78350f 100%); }
|
||||
|
||||
.f17b__body {
|
||||
flex: 1 1 auto;
|
||||
overflow: hidden;
|
||||
padding: 5px 8px 6px;
|
||||
color: #1a1a1a;
|
||||
min-height: 0;
|
||||
display: flex; flex-direction: column;
|
||||
gap: 2px;
|
||||
}
|
||||
.f17b__body .text-line {
|
||||
color: inherit;
|
||||
font-size: var(--font-body);
|
||||
line-height: var(--lh-body);
|
||||
position: relative;
|
||||
padding-left: 12px;
|
||||
}
|
||||
.f17b__body .text-line--bullet::before {
|
||||
content: "!";
|
||||
position: absolute;
|
||||
left: 2px; top: 0;
|
||||
font-weight: 700;
|
||||
}
|
||||
.f17b__cell:nth-child(1) .f17b__body .text-line--bullet::before { color: #dc2626; }
|
||||
.f17b__cell:nth-child(2) .f17b__body .text-line--bullet::before { color: #ea580c; }
|
||||
.f17b__cell:nth-child(3) .f17b__body .text-line--bullet::before { color: #d97706; }
|
||||
.f17b__cell:nth-child(4) .f17b__body .text-line--bullet::before { color: #b45309; }
|
||||
</style>
|
||||
|
||||
<div class="f17b" data-frame-id="1171281194" data-template-id="bim_current_problems_paired">
|
||||
<div class="f17b__title">{{ slot_payload.title }}</div>
|
||||
<div class="f17b__grid">
|
||||
<div class="f17b__cell">
|
||||
<div class="f17b__label">{{ slot_payload.issue_1_label | safe }}</div>
|
||||
<div class="f17b__body">
|
||||
{% if slot_payload.issue_1_body %}
|
||||
{% for line in slot_payload.issue_1_body %}<div class="text-line text-line--bullet{% if line.indent > 0 %} text-line--indent-{{ line.indent }}{% endif %}">{{ line.text | safe }}</div>{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="f17b__cell">
|
||||
<div class="f17b__label">{{ slot_payload.issue_2_label | safe }}</div>
|
||||
<div class="f17b__body">
|
||||
{% if slot_payload.issue_2_body %}
|
||||
{% for line in slot_payload.issue_2_body %}<div class="text-line text-line--bullet{% if line.indent > 0 %} text-line--indent-{{ line.indent }}{% endif %}">{{ line.text | safe }}</div>{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="f17b__cell">
|
||||
<div class="f17b__label">{{ slot_payload.issue_3_label | safe }}</div>
|
||||
<div class="f17b__body">
|
||||
{% if slot_payload.issue_3_body %}
|
||||
{% for line in slot_payload.issue_3_body %}<div class="text-line text-line--bullet{% if line.indent > 0 %} text-line--indent-{{ line.indent }}{% endif %}">{{ line.text | safe }}</div>{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="f17b__cell">
|
||||
<div class="f17b__label">{{ slot_payload.issue_4_label | safe }}</div>
|
||||
<div class="f17b__body">
|
||||
{% if slot_payload.issue_4_body %}
|
||||
{% for line in slot_payload.issue_4_body %}<div class="text-line text-line--bullet{% if line.indent > 0 %} text-line--indent-{{ line.indent }}{% endif %}">{{ line.text | safe }}</div>{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user