feat(catalog): activate info_management_what_how_when (IMP-04 Track A 6/16)
Catalog-completeness activation — NOT V4 endorsement (Codex round 47 §7
guardrail). V4 signal = 0 across the current 4 MDX evidence sample, but
the 32-frame all-in scope means runtime backend must accept this frame
when V4 ranks it for any future MDX outside the current sample.
V4 remains the matching authority. Phase Z adds runtime availability only.
3-layer architecture (matrix §0) :
- V4 = matching authority — current evidence does not rank this frame for
the sampled 4 MDX, so this activation must not be read as a V4-driven
promotion. It is purely catalog completeness so V4 can route to this
frame when warranted in future MDX content.
- figma_to_html (1171281179) = source/evidence — analysis/texts/index/flat/
assets all present, source intent is the What/How/When 3-section
framework.
- Phase Z = runtime — this commit adds catalog contract + partial + smoke
fixture. Builder reuse, no new builder/parser.
Builder reuse (Codex round 47 secondary criterion under exhausted V4 tier) :
- `quadrant_flat_slots` reused (F16/F11/F20 pattern) with pad_to=3 +
`section_{n}_label/body` key patterns.
- `quadrant_item` parser reused.
- mapper.py unchanged.
3 file changes :
1. templates/phase_z2/families/info_management_what_how_when.html
- 3-column grid (What / How / When), each with header + body bullets.
- PROMOTED CSS : per-section accent color (blue #2563eb What / orange
#ea580c How / green #16a34a When), title gradient (#000 → #883700
zone-title family), bullet markers in per-section accent color.
- NOT PROMOTED (P1 case-by-case + preservation guardrail) : Figma
상단 banner / icon / 배경 텍스처 / 장식. figma_to_html source
evidence preserved for future fidelity review.
- ADAPTED : Figma 50px+ → token-fixed, absolute positioning → flex grid.
2. templates/phase_z2/catalog/frame_contracts.yaml — F8 contract appended
- frame_id=1171281179, family=cards, source_shape=top_bullets, strict 3,
role_order=[section_1 (What), section_2 (How), section_3 (When)].
- visual_hints.min_height_px = 320 (F11/F20 class — 3-column header+body).
- accepted_content_types = [text_block].
- 3 sub_zones (section_1/2/3 main_text).
- payload.builder = quadrant_flat_slots (reuse) with section_{n}_* keys.
3. scripts/smoke_frame_render.py — bundled fixture for F8 self-check.
Verification :
- python scripts/smoke_frame_render.py --self-check : PASS 9/9 (F8 added at
3577 chars CSS-only)
- python scripts/smoke_frame_render.py info_management_what_how_when
--render-to data/runs/imp04_f8_visual : PASS, R3 artifact, 0 raster refs
- python run_mdx03_pipeline.py --phase-z2 --run-id imp04_f8_regression :
PASS (MDX 03 V4 rank-1 unchanged; F8 V4 signal = 0 across 4 MDX sample,
so not selected for MDX 03 either — purely catalog completeness)
scope-lock honored (3-layer + 4-class) :
- V4 logic / V4 evidence yaml : unchanged
- Existing PAYLOAD_BUILDERS / ITEM_PARSERS : unchanged (reuse only)
- Existing 8 partials : unchanged
- Composition planner / production render / Phase R' / AI/Kei : unchanged
4-class status :
- class 1 readiness : ✅ contract + builder reuse + partial + smoke + R3
- 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
Refs Gitea #4 (IMP-04 Track A frame 6 — V4-zero catalog completeness)
This commit is contained in:
@@ -239,6 +239,28 @@ _MOCK_DX_SW_NECESSITY = {
|
||||
],
|
||||
}
|
||||
|
||||
# Track A frame 6 — info_management_what_how_when (frame 8).
|
||||
# V4-zero catalog-completeness activation (Codex round 47 guardrail).
|
||||
# Builder reuse = quadrant_flat_slots (F11/F20 pattern) — section_N keys.
|
||||
_MOCK_INFO_MGMT = {
|
||||
"title": "효율적인 정보의 관리와 활용 (What/How/When)",
|
||||
"section_1_label": "무슨 정보 (What)",
|
||||
"section_1_body": [
|
||||
{"text": "수량 / 단가 / 공사일정 등 계획 정보", "indent": 0},
|
||||
{"text": "일일 작업 / 자원 등 공사 실행 정보", "indent": 0},
|
||||
],
|
||||
"section_2_label": "어떻게 연계 (How)",
|
||||
"section_2_body": [
|
||||
{"text": "3D 형상 산출속성 연계", "indent": 0},
|
||||
{"text": "시방규정 + S/W 통합", "indent": 0},
|
||||
],
|
||||
"section_3_label": "언제 사용 (When)",
|
||||
"section_3_body": [
|
||||
{"text": "착수 전 공정/시공계획 수립", "indent": 0},
|
||||
{"text": "공사 후 실적 관리 + 문서 작성", "indent": 0},
|
||||
],
|
||||
}
|
||||
|
||||
SELF_CHECK_FIXTURES: dict[str, dict] = {
|
||||
"three_parallel_requirements": _MOCK_THREE_PARALLEL,
|
||||
"process_product_two_way": _MOCK_PROCESS_PRODUCT,
|
||||
@@ -248,6 +270,7 @@ SELF_CHECK_FIXTURES: dict[str, dict] = {
|
||||
"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,
|
||||
"info_management_what_how_when": _MOCK_INFO_MGMT,
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -515,3 +515,63 @@ dx_sw_necessity_three_perspectives:
|
||||
body_key_pattern: "perspective_{n}_body"
|
||||
empty_label: ""
|
||||
empty_body: []
|
||||
|
||||
|
||||
info_management_what_how_when:
|
||||
# Reason : V4 신호 0 (4 MDX sample 안). 32-frame all-in scope 채우는
|
||||
# **catalog-completeness activation** (NOT V4 endorsement, Codex round 47 guardrail).
|
||||
# V4 는 matching authority. 향후 다른 MDX section 에서 V4 가 이 frame 을 추천 시
|
||||
# backend 가 받을 수 있도록 등록.
|
||||
# Pattern : cards/3-section-framework (What/How/When 3 관점 framework).
|
||||
# Track A frame 6. Builder 재사용 = `quadrant_flat_slots` (F11/F20 pattern).
|
||||
template_id: info_management_what_how_when
|
||||
frame_id: 1171281179
|
||||
family: cards
|
||||
|
||||
source_shape: top_bullets
|
||||
cardinality:
|
||||
strict: 3 # 3 sections (What / How / When)
|
||||
overflow_policy: abort_or_review
|
||||
|
||||
role_order:
|
||||
- section_1 # What (무슨 정보)
|
||||
- section_2 # How (어떻게 연계)
|
||||
- section_3 # When (언제 사용)
|
||||
|
||||
# min_height_px : F20 와 동등 (3-column body + header). 320 = 3×(header 30 +
|
||||
# body bullets 75) + title 30 + padding 30 + buffer 125 / 195 base.
|
||||
visual_hints:
|
||||
min_height_px: 320
|
||||
|
||||
accepted_content_types:
|
||||
- text_block
|
||||
|
||||
sub_zones:
|
||||
- id: section_1
|
||||
role: main_text
|
||||
accepts: [text_block]
|
||||
cardinality: { strict: 1 }
|
||||
partial_target_path: ".f8b__cols > .f8b__col:nth-child(1)"
|
||||
- id: section_2
|
||||
role: main_text
|
||||
accepts: [text_block]
|
||||
cardinality: { strict: 1 }
|
||||
partial_target_path: ".f8b__cols > .f8b__col:nth-child(2)"
|
||||
- id: section_3
|
||||
role: main_text
|
||||
accepts: [text_block]
|
||||
cardinality: { strict: 1 }
|
||||
partial_target_path: ".f8b__cols > .f8b__col:nth-child(3)"
|
||||
|
||||
payload:
|
||||
title:
|
||||
source: section.title
|
||||
builder: quadrant_flat_slots # 재사용 (F16/F11/F20 pattern)
|
||||
builder_options:
|
||||
item_parser: quadrant_item # 재사용
|
||||
pad_to: 3
|
||||
truncate_at: 3
|
||||
label_key_pattern: "section_{n}_label"
|
||||
body_key_pattern: "section_{n}_body"
|
||||
empty_label: ""
|
||||
empty_body: []
|
||||
|
||||
152
templates/phase_z2/families/info_management_what_how_when.html
Normal file
152
templates/phase_z2/families/info_management_what_how_when.html
Normal file
@@ -0,0 +1,152 @@
|
||||
<!-- Phase Z-2 MVP-1.5b frame-derived adapted block.
|
||||
§17 룰 — Figma 시각 언어 promote, geometry 만 zone-compatible adapt. -->
|
||||
{#
|
||||
─────────────────────────────────────────────────────────────────────────────
|
||||
Visual Provenance — figma_to_html_agent/blocks/1171281179/ (frame 8)
|
||||
─────────────────────────────────────────────────────────────────────────────
|
||||
Frame 8 = "효율적인 정보의 관리와 활용 (What/How/When)" (cards/3-section-framework).
|
||||
3 sections framework — What (무슨 정보) / How (어떻게 연계) / When (언제 사용).
|
||||
정보 관리·활용 3관점 병렬 제시 디자인.
|
||||
|
||||
본 partial = Track A frame 6 (Codex round 47 V4-zero catalog-completeness
|
||||
activation guardrail). **V4 신호 0** (4 MDX sample 기준). 32-frame all-in
|
||||
scope 채우는 등록 — V4 가 다른 MDX 에서 본 frame 을 추천 시 backend 받음.
|
||||
*V4 endorsement 아님* — V4 = matching authority 보존, Phase Z 는 runtime
|
||||
availability 추가만.
|
||||
|
||||
3-layer architecture (matrix §0) :
|
||||
- V4 = matching authority — 본 frame 은 4 MDX 에서 미선택 (UAI/LE/RS = 0).
|
||||
단 V4 evidence 미 cover 의 MDX 가 추천 시 backend 가 받을 수 있게 등록.
|
||||
- figma_to_html (1171281179) = source/evidence — analysis + texts + index +
|
||||
flat + assets 모두 보유. 본 partial 의 visual base.
|
||||
- Phase Z = runtime — catalog + partial + smoke fixture 추가.
|
||||
|
||||
PROMOTED — CSS :
|
||||
- 3 section header color (W/H/W = What/How/When framework)
|
||||
- title gradient (zone-title family — F13/F14/F12/F11/F18/F20/F8 등 동일)
|
||||
- card border + bullet markers
|
||||
|
||||
NOT PROMOTED (P1 case-by-case + preservation guardrail) :
|
||||
- Figma 의 상단 banner / icon / 배경 텍스처 / 장식 image 등 — figma_to_html
|
||||
source evidence 보존, compact zone fit 위해 미 promote
|
||||
|
||||
ADAPTED :
|
||||
- Figma 50px+ → token-fixed
|
||||
- absolute positioning → Phase Z 3-column grid
|
||||
─────────────────────────────────────────────────────────────────────────────
|
||||
min_height_px = 320 (F11/F20 와 동등 — 3-column header + body)
|
||||
slots : title, section_1/2/3_label, section_1/2/3_body
|
||||
4-class status :
|
||||
- class 1 ready (builder reuse + partial + smoke)
|
||||
- class 2 watch (body 5+ bullets per column)
|
||||
#}
|
||||
|
||||
<style>
|
||||
.f8b {
|
||||
width: 100%; height: 100%;
|
||||
display: flex; flex-direction: column;
|
||||
gap: 6px;
|
||||
font-family: 'Noto Sans KR', 'Pretendard', sans-serif;
|
||||
word-break: keep-all;
|
||||
}
|
||||
.f8b__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));
|
||||
}
|
||||
|
||||
.f8b__cols {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
gap: 10px;
|
||||
flex: 1 1 auto;
|
||||
min-height: 0;
|
||||
}
|
||||
.f8b__col {
|
||||
display: flex; flex-direction: column;
|
||||
border: 2px solid;
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
background: #fff;
|
||||
min-height: 0;
|
||||
}
|
||||
/* per-section accent — W/H/W theme (다른 frame 들과 차별) */
|
||||
.f8b__col:nth-child(1) { border-color: #2563eb; } /* What — blue */
|
||||
.f8b__col:nth-child(2) { border-color: #ea580c; } /* How — orange */
|
||||
.f8b__col:nth-child(3) { border-color: #16a34a; } /* When — green */
|
||||
|
||||
.f8b__header {
|
||||
color: #fff;
|
||||
font-weight: 700;
|
||||
font-size: var(--font-sub-title);
|
||||
line-height: 1.15;
|
||||
padding: 6px 10px;
|
||||
text-align: center;
|
||||
flex-shrink: 0;
|
||||
letter-spacing: -0.02em;
|
||||
}
|
||||
.f8b__col:nth-child(1) .f8b__header { background: linear-gradient(180deg, #2563eb 0%, #1e40af 100%); }
|
||||
.f8b__col:nth-child(2) .f8b__header { background: linear-gradient(180deg, #ea580c 0%, #c2410c 100%); }
|
||||
.f8b__col:nth-child(3) .f8b__header { background: linear-gradient(180deg, #16a34a 0%, #15803d 100%); }
|
||||
|
||||
.f8b__body {
|
||||
flex: 1 1 auto;
|
||||
overflow: hidden;
|
||||
padding: 6px 10px 8px;
|
||||
color: #1a1a1a;
|
||||
min-height: 0;
|
||||
display: flex; flex-direction: column;
|
||||
gap: 3px;
|
||||
}
|
||||
.f8b__body .text-line {
|
||||
color: inherit;
|
||||
font-size: var(--font-body);
|
||||
line-height: var(--lh-body);
|
||||
position: relative;
|
||||
padding-left: 14px;
|
||||
}
|
||||
.f8b__body .text-line--bullet::before {
|
||||
content: "•";
|
||||
position: absolute;
|
||||
left: 2px; top: 0;
|
||||
font-weight: 700;
|
||||
}
|
||||
.f8b__col:nth-child(1) .f8b__body .text-line--bullet::before { color: #2563eb; }
|
||||
.f8b__col:nth-child(2) .f8b__body .text-line--bullet::before { color: #ea580c; }
|
||||
.f8b__col:nth-child(3) .f8b__body .text-line--bullet::before { color: #16a34a; }
|
||||
</style>
|
||||
|
||||
<div class="f8b" data-frame-id="1171281179" data-template-id="info_management_what_how_when">
|
||||
<div class="f8b__title">{{ slot_payload.title }}</div>
|
||||
<div class="f8b__cols">
|
||||
<div class="f8b__col">
|
||||
<div class="f8b__header">{{ slot_payload.section_1_label | safe }}</div>
|
||||
<div class="f8b__body">
|
||||
{% if slot_payload.section_1_body %}
|
||||
{% for line in slot_payload.section_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="f8b__col">
|
||||
<div class="f8b__header">{{ slot_payload.section_2_label | safe }}</div>
|
||||
<div class="f8b__body">
|
||||
{% if slot_payload.section_2_body %}
|
||||
{% for line in slot_payload.section_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="f8b__col">
|
||||
<div class="f8b__header">{{ slot_payload.section_3_label | safe }}</div>
|
||||
<div class="f8b__body">
|
||||
{% if slot_payload.section_3_body %}
|
||||
{% for line in slot_payload.section_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>
|
||||
</div>
|
||||
Reference in New Issue
Block a user