- src: phase_z2 composition/mapper/pipeline/placement_planner/retry, ai_fallback(prompts/schema/validate), mdx_text_atoms 신규 - Front: PipelineTracePanel 신규, FramePanel/SlideCanvas/Home/designAgentApi 등 갱신 + 테스트 4종 추가 - templates/phase_z2: catalog(component_expansion_registry, node_slot_mapping 신규), frames, families, slide_base 갱신 - tests/matching: phase2~26 매칭 실험 스크립트·리포트·온톨로지 전체 (미커밋 진행분) - tests: b4_v4 evidence, task5~28.5 시리즈, regression(imp95 baseline) 등 신규 테스트 대량 추가 - docs/reference: MDX 구조 인벤토리, MDX→Frame 구조 계약 문서 - scripts: mdx 계약/parity/coverage/viewport 체크, gitea comment, run sync 유틸 - .gitignore: tmp*.json, chromedriver, .orchestrator, *.pkl, Front_test* 등 임시/스냅샷 제외 미완성 작업의 보존용 스냅샷 커밋 (2026-07-02) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
79 lines
11 KiB
HTML
79 lines
11 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="ko"><head><meta charset="utf-8"><title>첨부 4 — 구조 매칭 키워드</title>
|
||
<style>
|
||
@page { size: A4 portrait; margin: 14mm 14mm 16mm 14mm; }
|
||
* { box-sizing: border-box; }
|
||
body {
|
||
font-family: -apple-system, "Segoe UI", Pretendard, "Malgun Gothic", "Apple SD Gothic Neo", sans-serif;
|
||
background: white; color: #1e293b; margin: 0;
|
||
font-size: 10pt; line-height: 1.45;
|
||
}
|
||
@media print {
|
||
body { margin: 0; }
|
||
.avoid-break { page-break-inside: avoid; }
|
||
.page-break { page-break-before: always; }
|
||
}
|
||
@media screen {
|
||
body { max-width: 210mm; margin: 10mm auto; box-shadow: 0 4px 24px rgba(0,0,0,0.12); padding: 14mm; background: #fff; }
|
||
}
|
||
h1 { font-size: 15pt; border-bottom: 2pt solid #2563eb; padding-bottom: 4pt; margin: 0 0 6pt 0; color: #0f172a; }
|
||
h2 { font-size: 11pt; color: #1e293b; margin: 10pt 0 5pt; padding: 3pt 6pt; background: #e0e7ff; border-left: 3pt solid #0a6; border-radius: 2pt; }
|
||
h3 { font-size: 10pt; margin: 6pt 0 3pt; color: #1a365d; font-weight: 700; }
|
||
p { margin: 4pt 0; }
|
||
.meta-bar { color: #64748b; font-size: 8.5pt; margin: -3pt 0 8pt; font-style: italic; }
|
||
.note { background: #fef3c7; border-left: 3pt solid #f59e0b; padding: 4pt 8pt; margin: 6pt 0; font-size: 9pt; color: #78350f; border-radius: 2pt; }
|
||
.fail-note { background: #fee2e2; border-left: 3pt solid #dc2626; padding: 4pt 8pt; margin: 4pt 0; font-size: 9pt; color: #991b1b; border-radius: 2pt; }
|
||
.ok-note { background: #d1fae5; border-left: 3pt solid #059669; padding: 4pt 8pt; margin: 4pt 0; font-size: 9pt; color: #065f46; border-radius: 2pt; }
|
||
.mdx-card { background: #f8fafc; border: 0.5pt solid #cbd5e1; border-radius: 4pt; padding: 6pt 8pt; margin: 4pt 0; }
|
||
.mdx-title { font-weight: 700; color: #0f172a; font-size: 10.5pt; margin-bottom: 2pt; }
|
||
.mdx-excerpt { color: #475569; font-size: 9pt; margin: 2pt 0 4pt; line-height: 1.4; }
|
||
.kw-chip { display: inline-block; padding: 1pt 6pt; background: #dbeafe; color: #1e40af; border-radius: 8pt; font-size: 8pt; margin: 1pt 2pt 1pt 0; font-family: ui-monospace, monospace; }
|
||
.kw-set-chip { background: #fce7f3; color: #9f1239; }
|
||
.kw-rel-chip { background: #e0e7ff; color: #3730a3; }
|
||
table { border-collapse: collapse; width: 100%; font-size: 9pt; margin: 4pt 0; }
|
||
th, td { border: 0.5pt solid #cbd5e1; padding: 3pt 5pt; text-align: left; vertical-align: top; }
|
||
th { background: #1e293b; color: white; font-weight: 700; font-size: 8.5pt; }
|
||
code { background: #f1f5f9; padding: 0 3pt; border-radius: 2pt; font-family: ui-monospace, Menlo, monospace; font-size: 8.5pt; color: #0f172a; }
|
||
.frame-thumb { max-width: 100%; height: auto; border: 0.5pt solid #94a3b8; border-radius: 3pt; display: block; }
|
||
.frame-cell { text-align: center; vertical-align: top; padding: 3pt; }
|
||
.frame-label { font-size: 8.5pt; color: #0f172a; font-weight: 600; margin-top: 2pt; }
|
||
.frame-score { font-family: ui-monospace, monospace; font-size: 8pt; color: #059669; }
|
||
.frame-desc { font-size: 7.5pt; color: #64748b; line-height: 1.25; margin-top: 1pt; }
|
||
.label-badge { display: inline-block; padding: 1pt 5pt; border-radius: 2pt; font-size: 7.5pt; font-weight: 700; }
|
||
.label-use_as_is { background: #d1fae5; color: #065f46; }
|
||
.label-light_edit { background: #dbeafe; color: #1e40af; }
|
||
.label-restructure { background: #fef3c7; color: #92400e; }
|
||
.label-reject { background: #fee2e2; color: #991b1b; }
|
||
.answer-box { background: #fff3cd; border: 1.5pt solid #dc2626; border-radius: 3pt; padding: 2pt; }
|
||
.flex-grid { display: table; width: 100%; border-spacing: 0; }
|
||
.flex-row { display: table-row; }
|
||
.flex-cell { display: table-cell; vertical-align: top; padding: 2pt; }
|
||
ol.steps { margin: 4pt 0; padding-left: 16pt; }
|
||
ol.steps li { margin: 3pt 0; line-height: 1.5; }
|
||
.step-title { font-weight: 700; color: #1e293b; }
|
||
.step-fail { color: #991b1b; font-size: 8.5pt; font-style: italic; }
|
||
.step-ok { color: #065f46; font-size: 8.5pt; }
|
||
|
||
/* V1 매칭 상세 (ATTACH_01) 전용 */
|
||
.page-header-small { font-size: 8pt; color: #64748b; text-align: right; margin: 0 0 2pt 0; }
|
||
.frame-match { border: 0.5pt solid #cbd5e1; border-radius: 4pt; padding: 6pt 8pt; margin: 4pt 0; background: #fafafa; }
|
||
.frame-match.answer { border: 1pt solid #dc2626; background: #fffbeb; }
|
||
.frame-match h3 { margin: 0 0 3pt 0; font-size: 10pt; }
|
||
.fm-body { display: table; width: 100%; }
|
||
.fm-thumb { display: table-cell; width: 32mm; vertical-align: top; padding-right: 6pt; }
|
||
.fm-thumb img { max-width: 30mm; height: auto; border: 0.5pt solid #94a3b8; border-radius: 2pt; display: block; }
|
||
.fm-thumb .frame-desc { font-size: 7pt; color: #64748b; margin-top: 2pt; line-height: 1.25; }
|
||
.fm-detail { display: table-cell; vertical-align: top; }
|
||
.kw-line { margin: 3pt 0; font-size: 8.5pt; line-height: 1.4; }
|
||
.kw-line strong { color: #0f172a; font-weight: 700; }
|
||
.hit-chip { color: #065f46; background: #d1fae5; padding: 1pt 5pt; border-radius: 2pt; font-size: 8pt; display: inline-block; margin: 0 2pt; }
|
||
.miss-chip { color: #991b1b; background: #fee2e2; padding: 1pt 5pt; border-radius: 2pt; font-size: 8pt; display: inline-block; margin: 0 2pt; }
|
||
.hit-inline { color: #065f46; font-weight: 600; }
|
||
.miss-inline { color: #991b1b; }
|
||
.ratio { color: #64748b; font-family: ui-monospace, monospace; font-size: 7.5pt; }
|
||
.frame-match ul { margin: 2pt 0; padding-left: 14pt; font-size: 8.5pt; }
|
||
.frame-match li { line-height: 1.4; margin: 1pt 0; }
|
||
.section-tag { display: inline-block; padding: 2pt 6pt; border-radius: 2pt; font-size: 8pt; font-weight: 700; margin-left: 4pt; vertical-align: middle; }
|
||
.tag-matched { background: #d1fae5; color: #065f46; }
|
||
.tag-unmatched { background: #fee2e2; color: #991b1b; }
|
||
</style></head><body><h1>첨부 4 — 구조 매칭 키워드 (controlled vocabulary)</h1><div class="meta-bar">V3 구조 매칭이 단순 layout 일치가 아니라 <strong>의미 + 시각 의도</strong>로 프레임을 구분하도록 하는 어휘 정의. 이 vocab 이 없으면 "3열 병렬" 같은 같은 layout 안에서 다른 콘텐츠의 프레임이 뒤섞여 구분 불가.</div><h2>content_affinity — 12종 (의미 축, 콘텐츠 성격)</h2><table><thead><tr><th style="width:22%">값</th><th style="width:32%">의미</th><th>예시 (MDX 또는 Frame)</th></tr></thead><tbody><tr><td><code>concept_definition</code></td><td>용어/개념의 정의</td><td>"BIM이란", "DX란" · Frame 11 (BIM 활용 3분류 정의)</td></tr><tr><td><code>concept_comparison</code></td><td>2+ 개념의 차이점 비교</td><td>"BIM vs DX" · Frame 18</td></tr><tr><td><code>goal_axes</code></td><td>목표의 핵심 축 나열 (N개)</td><td>"DX의 궁극적 목표 3축" · Frame 12 (안전/품질/생산성)</td></tr><tr><td><code>persona_benefit</code></td><td>주체별 혜택/기대효과</td><td>"발주자/설계자/시공자 기대효과" · Frame 14</td></tr><tr><td><code>process_steps</code></td><td>순서 있는 단계 (1→2→3)</td><td>"1단계 계획 → 2단계 설계"</td></tr><tr><td><code>before_after_change</code></td><td>전/후 상태 전환</td><td>"AS-IS → TO-BE" · Frame 29</td></tr><tr><td><code>capability_requirements</code></td><td>요구 역량/조건/도구</td><td>"필수조건", "S/W 필수" · Frame 13, 20</td></tr><tr><td><code>comparative_matrix</code></td><td>N개 × M축 비교표</td><td>"관점별 다축 대비" · Frame 18, 23</td></tr><tr><td><code>stakeholder_roles</code></td><td>주체별 역할/책임/관계</td><td>"정부 주도 / 민간 수행"</td></tr><tr><td><code>policy_requirements</code></td><td>정책/제도/거버넌스 틀</td><td>"정부주도 BIM 도입" · Frame 27</td></tr><tr><td><code>tool_ecosystem</code></td><td>도구/SW 생태계</td><td>"Revit, Navisworks 등"</td></tr><tr><td><code>interrelation</code></td><td>N개 요소의 상호관계/순환</td><td>"용어간 상호관계" · Frame 12 cycle-3way</td></tr></tbody></table><h2>structure_intent — 9종 (시각 의도, 레이아웃이 전달하는 방식)</h2><table><thead><tr><th style="width:22%">값</th><th style="width:32%">의미</th><th>대표 layout</th></tr></thead><tbody><tr><td><code>binary_compare</code></td><td>2개 항목 대비</td><td><code>compare-2col, table-2col, cards-3-compare</code></td></tr><tr><td><code>multi_parallel</code></td><td>N개 항목 병렬 나열</td><td><code>3col-parallel, cards-3-header, cards-4-grid</code></td></tr><tr><td><code>hierarchy</code></td><td>상위-하위 관계 (계층)</td><td><code>central-5-goals, radial-diagram-5</code></td></tr><tr><td><code>sequence</code></td><td>순서 있는 흐름</td><td><code>list-numbered, split-panel-numbered</code></td></tr><tr><td><code>state_transition</code></td><td>전/후 상태 전환 대비</td><td><code>compare-2banner-top-2col-bottom</code></td></tr><tr><td><code>cycle_interrelation</code></td><td>순환/상호관계</td><td><code>cycle-3way, circular-nodes</code></td></tr><tr><td><code>matrix_coverage</code></td><td>다차원 커버리지</td><td><code>compare-rows, table-3col, paired-rows-2x2</code></td></tr><tr><td><code>persona_mapping</code></td><td>주체별 매핑</td><td><code>persona-3col, 2col-paired</code></td></tr><tr><td><code>singleton_emphasis</code></td><td>단일 강조</td><td><code>diagram-labels, side-card</code></td></tr></tbody></table><h2>alternative_patterns — 대안 레이아웃 관계</h2><p style="font-size:9pt">각 프레임이 "이 내용을 못 담을 때 어떤 다른 layout 이 대체 가능한가" 를 명시. 기존 방식은 수작업 호환도 테이블(<code>_COMPAT</code>, 커버리지 26%)이었고, 새 스키마는 프레임별 <code>alternative_patterns</code> 필드로 파생.</p><table><thead><tr><th style="width:25%">예시 프레임</th><th style="width:25%">기본 layout</th><th>대안 패턴</th></tr></thead><tbody><tr><td>Frame 12 · 건설산업 목표</td><td><code>cycle-3way</code></td><td><code>3col-parallel</code> (0.7, 수동 시드 — 순환 대신 평면 병렬), <code>circular-nodes</code> (0.6, 수동 시드 — radial 대안)</td></tr><tr><td>Frame 18 · BIM vs DX</td><td><code>compare-rows</code></td><td><code>table-2col</code>, <code>compare-2col</code>, <code>2col-paired</code> (파생 — 2-way 비교 계열)</td></tr><tr><td>Frame 29 · Process 혁신</td><td><code>compare-2banner-top-2col-bottom</code></td><td><code>compare-2col</code>, <code>table-2col</code>, <code>2col-paired</code> (파생)</td></tr></tbody></table><h2>왜 이 vocab 이 필요한가 — 원인/효과</h2><table><thead><tr><th style="width:40%">이 축이 없으면 발생하는 문제</th><th>이 축이 해결하는 것</th></tr></thead><tbody><tr><td>"3열 병렬" 프레임끼리 구분 불가 — Frame 12 (목표 3축) 와 Frame 20 (S/W 필수 3관점) 둘 다 3열인데 의미 다름</td><td><code>content_affinity</code> 가 <code>goal_axes</code> vs <code>capability_requirements</code> 로 구분</td></tr><tr><td>"compare-rows" 와 "table-2col" 이 다른 layout 처럼 보이지만 실제론 같은 2-way 비교</td><td><code>alternative_patterns</code> 에 명시 — 자동 대체 가능</td></tr><tr><td>"혁신", "전환" 같은 단어가 과매칭 — 거의 모든 MDX 에 <code>state_transition</code> 붙음</td><td>STRONG 패턴(AS-IS/TO-BE/이중 변환) 없이는 인정 안 함 — validator 강화</td></tr></tbody></table></body></html> |