Add auto loop runner and self-contained bridge flow
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -153,188 +153,105 @@
|
|||||||
<div class="slide-title" style="grid-area: header;">건설산업 DX의 올바른 이해</div>
|
<div class="slide-title" style="grid-area: header;">건설산업 DX의 올바른 이해</div>
|
||||||
|
|
||||||
<div class="area-body" style="overflow:hidden;">
|
<div class="area-body" style="overflow:hidden;">
|
||||||
<div style="width:100%; height:91px; overflow:hidden; background:#f8fafc; border:1px solid #e2e8f0; border-radius:6px; padding:10px 14px;">
|
<div style="width:100%; height:91px; background:linear-gradient(135deg, #1e293b 0%, #0f172a 100%); border-radius:8px; padding:20px 28px; color:#ffffff; box-sizing:border-box;">
|
||||||
<div style="font-size:12px; font-weight:bold; color:#334155; margin-bottom:4px;">DX와 BIM의 혼용 문제</div>
|
<div style="font-size:13px; font-weight:700; margin-bottom:8px; color:#93c5fd;">DX와 BIM의 혼용 문제</div>
|
||||||
|
<div style="font-size:12px; line-height:1.4;">
|
||||||
<div style="display:flex; gap:8px; height:100%;">
|
<div style="padding-left:15px; text-indent:-15px; margin-bottom:3px;"><span style="color:#60a5fa;">• </span>건설산업의 디지털 전환 논의에서 DX(Digital Transformation)와 BIM(Building Information Modeling)이 개념적으로 명확히 정립되지 않은채 혼용되어 사용되고 있음</div>
|
||||||
<div style="flex:1; background:#ffffff; border-left:2px solid #94a3b8; padding:6px 8px;">
|
<div style="padding-left:15px; text-indent:-15px;"><span style="color:#60a5fa;">• </span>건설산업의 DX를 올바르게 이해하기 위해 각 용어의 정의, 역할, 상호관계에 대한 체계적 정립 필요</div>
|
||||||
<div style="font-size:10px; font-weight:bold; color:#334155; margin-bottom:2px;">용어의 혼용</div>
|
|
||||||
<div style="font-size:9px; color:#64748b; line-height:1.3;">
|
|
||||||
<div style="padding-left:14px; text-indent:-14px;">• 건설산업의 디지털 전환 논의에서 <strong style="color:#1e293b">DX(Digital Transformation)</strong>와 <strong style="color:#1e293b">BIM(Building Information Modeling)</strong>이 개념적으로 명확히 정립되지 않은채 혼용되어 사용되고 있음</div>
|
|
||||||
<div style="padding-left:14px; text-indent:-14px;">• 이로인해 BIM기술의 도입을 DX의 완성으로 오인하거나, DX를 BIM 기술 도입 수준으로 한정하는 인식 확산</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style="flex:1; background:#ffffff; border-left:2px solid #94a3b8; padding:6px 8px;">
|
|
||||||
<div style="font-size:10px; font-weight:bold; color:#334155; margin-bottom:2px;">혼용 대표 사례</div>
|
|
||||||
<div style="font-size:9px; color:#64748b; line-height:1.3;">
|
|
||||||
<div style="padding-left:14px; text-indent:-14px;">• <strong style="color:#1e293b">스마트 건설 활성화 방안(2022.07)</strong>: 추진과제는 건설산업 디지털화, 실행과제는 BIM 전면 도입</div>
|
|
||||||
<div style="padding-left:14px; text-indent:-14px;">• <strong style="color:#1e293b">제7차 건설기술진흥 기본계획(2023.12)</strong>: 디지털 전환 추진방향을 BIM 도입으로 건설산업 디지털화로 제시</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div style="height:12px;"></div>
|
<div style="height:12px;"></div>
|
||||||
<div class="core">
|
<div style="width: 100%; max-height: 371px; font-size: 12px; line-height: 1.75; padding: 20px; box-sizing: border-box;">
|
||||||
<div class="core-header">
|
|
||||||
<div class="core-label">DX의 정의와 위치</div>
|
<!-- DX의 정의와 위치 -->
|
||||||
<div class="popup-link">DX와 BIM 구분</div>
|
<div style="margin-bottom: 25px;">
|
||||||
|
<h2 style="font-size: 14px; font-weight: bold; margin-bottom: 15px; color: #2563eb; border-bottom: 2px solid #2563eb; padding-bottom: 5px;">DX의 정의와 위치</h2>
|
||||||
|
|
||||||
|
<div style="margin-bottom: 15px;">
|
||||||
|
<h3 style="font-size: 12px; font-weight: bold; margin-bottom: 8px;">용어 정의</h3>
|
||||||
|
|
||||||
|
<div style="padding-left: 15px; text-indent: -15px; margin-bottom: 8px;">
|
||||||
|
• <strong>건설산업</strong>
|
||||||
</div>
|
</div>
|
||||||
<div class="core-text">
|
<div style="padding-left: 30px; text-indent: -15px; margin-bottom: 4px;">
|
||||||
<div class="fi">
|
• 다양한 시설물을 각 산업마다의 광범위한 기술을 통합 및 융합하여 만들어내는 종합산업
|
||||||
<img id="slide-img-dx1" src="/assets/images/DX1.png">
|
|
||||||
<div class="cap">DX와 핵심기술간 상호관계</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="bp"><b>건설산업</b>: 다양한 시설물을 각 산업마다의 광범위한 기술을 통합 및 융합하여 만들어내는 종합산업</div>
|
<div style="padding-left: 30px; text-indent: -15px; margin-bottom: 8px;">
|
||||||
<div class="sp">목적 시설물의 품질 욕구를 충족시키면서 최단기간내에 최소 비용으로 편리하고 안전하며 우수한 성능의 시설물 완성을 목표로 함</div>
|
• 목적 시설물의 품질 욕구를 충족시키면서 최단기간내에 최소 비용으로 편리하고 안전하며 우수한 성능의 시설물 완성을 목표로 함
|
||||||
<div class="bp"><b>BIM(Building Information Modeling)</b>: 디지털 전환을 위한 핵심 기술</div>
|
|
||||||
<div class="sp">시설물의 생애주기동안 발생한 모든 정보를 3차원 모델 기반으로 통합·관리하는 정보 관리 도구</div>
|
|
||||||
<div class="sp">건설 정보와 절차를 표준화된 방식으로 연계하고 디지털 협업이 가능하도록 하는 핵심 인프라 기술</div>
|
|
||||||
<div class="bp"><b>DX(Digital Transformation)</b>: 산업 패러다임의 변화</div>
|
|
||||||
<div class="sp">디지털 기술을 기반으로 산업 전반의 업무방식과 가치 창출 구조를 전환하는 과정 및 결과</div>
|
|
||||||
<div class="sp">단순한 기술 도입이 아닌, 고객 가치와 의사결정 방식의 근본적인 변화로 산업의 새로운 방향을 정립하는 것을 의미함</div>
|
|
||||||
<div class="bp">DX는 BIM과 같은 디지털기술을 기반으로 산업 전반의 프로세스를 혁신하는 상위개념</div>
|
|
||||||
<div class="bp">건설산업의 DX는 GIS(공간정보), BIM, 디지털 트윈(가상환경)의 기술융합을 통해서만 실현 또는 구현 가능</div>
|
|
||||||
<div class="sp"><b>GIS의 역할</b>: 지리적 데이터를 공간 분석하여 시각적으로 표현, 위치기반 정보 제공</div>
|
|
||||||
<div class="sp"><b>BIM의 역할</b>: 형상정보와 내용정보가 포함된 3D모델로, 건설 정보 기반의 Process와 Product를 제공</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="key-msg">
|
|
||||||
|
<div style="padding-left: 15px; text-indent: -15px; margin-bottom: 8px;">
|
||||||
|
• <strong>BIM(Building Information Modeling) : 디지털 전환을 위한 핵심 기술</strong>
|
||||||
|
</div>
|
||||||
|
<div style="padding-left: 30px; text-indent: -15px; margin-bottom: 4px;">
|
||||||
|
• 시설물의 생애주기동안 발생한 모든 정보를 3차원 모델 기반으로 통합·관리하는 정보 관리 도구
|
||||||
|
</div>
|
||||||
|
<div style="padding-left: 30px; text-indent: -15px; margin-bottom: 4px;">
|
||||||
|
• 건설 정보와 절차를 표준화된 방식으로 연계하고 디지털 협업이 가능하도록 하는 핵심 인프라 기술
|
||||||
|
</div>
|
||||||
|
<div style="padding-left: 30px; text-indent: -15px; margin-bottom: 8px; font-size: 11px; color: #666;">
|
||||||
|
출처: 건설산업 BIM 기본지침, 국토교통부, 2020
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="padding-left: 15px; text-indent: -15px; margin-bottom: 8px;">
|
||||||
|
• <strong>DX(Digital Transformation) : 산업 패러다임의 변화</strong>
|
||||||
|
</div>
|
||||||
|
<div style="padding-left: 30px; text-indent: -15px; margin-bottom: 4px;">
|
||||||
|
• 디지털 기술을 기반으로 산업 전반의 업무방식과 가치 창출 구조를 전환하는 과정 및 결과
|
||||||
|
</div>
|
||||||
|
<div style="padding-left: 30px; text-indent: -15px; margin-bottom: 4px;">
|
||||||
|
• 단순한 기술 도입이 아닌, 고객 가치와 의사결정 방식의 근본적인 변화로 산업의 새로운 방향을 정립하는 것을 의미함
|
||||||
|
</div>
|
||||||
|
<div style="padding-left: 30px; text-indent: -15px; margin-bottom: 8px; font-size: 11px; color: #666;">
|
||||||
|
출처: Digital Transformation, IBM Institute for Business Value, 2011 / What is Digital Transformation?, Agile Elephant, 2015
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- BIM과 핵심기술의 관계 -->
|
||||||
|
<div style="margin-bottom: 25px;">
|
||||||
|
<h2 style="font-size: 14px; font-weight: bold; margin-bottom: 15px; color: #059669; border-bottom: 2px solid #059669; padding-bottom: 5px;">BIM과 핵심기술의 관계</h2>
|
||||||
|
|
||||||
|
<div style="margin-bottom: 15px;">
|
||||||
|
<h3 style="font-size: 12px; font-weight: bold; margin-bottom: 8px;">용어간 상호관계</h3>
|
||||||
|
|
||||||
|
<div style="padding-left: 15px; text-indent: -15px; margin-bottom: 8px;">
|
||||||
|
• DX는 BIM과 같은 디지털기술을 기반으로 산업 전반의 프로세스를 혁신하는 상위개념
|
||||||
|
</div>
|
||||||
|
<div style="padding-left: 15px; text-indent: -15px; margin-bottom: 8px;">
|
||||||
|
• 건설산업의 DX는 GIS(공간정보), BIM, 디지털 트윈(가상환경)의 기술융합을 통해서만 실현 또는 구현 가능
|
||||||
|
</div>
|
||||||
|
<div style="padding-left: 30px; text-indent: -15px; margin-bottom: 4px;">
|
||||||
|
• GIS의 역할 : 지리적 데이터를 공간 분석하여 시각적으로 표현, 위치기반 정보 제공
|
||||||
|
</div>
|
||||||
|
<div style="padding-left: 30px; text-indent: -15px; margin-bottom: 8px;">
|
||||||
|
• BIM의 역할 : 형상정보와 내용정보가 포함된 3D모델로, 건설 정보 기반의 Process와 Product를 제공
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="text-align: center; margin: 15px 0; padding: 10px; background: #f8f9fa; border-radius: 8px;">
|
||||||
|
[이미지: DX와 핵심기술간 상호관계, 경로: /assets/images/DX1.png]<br>
|
||||||
|
<span style="font-size: 11px; color: #666;">출처: [그림 1] DX와 핵심기술간 상호관계</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="margin-top: 15px;">
|
||||||
|
<strong>[DX와 BIM의 구분]</strong> <a href="#" style="color: #2563eb; text-decoration: underline;">[상세보기]</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 핵심 메시지 -->
|
||||||
|
<div class="key-msg" style="margin-top: 20px; padding: 15px; background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%); border-left: 4px solid #0284c7; border-radius: 8px;">
|
||||||
|
<div style="font-size: 14px; font-weight: bold; color: #0284c7; text-align: center;">
|
||||||
건설산업에서 DX는 상위 개념이고 BIM은 그 디지털 전환을 가능하게 하는 핵심 기술 중 하나다.
|
건설산업에서 DX는 상위 개념이고 BIM은 그 디지털 전환을 가능하게 하는 핵심 기술 중 하나다.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="dx-bim-popup" style="display: none; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: white; border: 2px solid #e2e8f0; border-radius: 8px; padding: 20px; max-width: 90vw; max-height: 90vh; overflow: auto; z-index: 1000; box-shadow: 0 4px 20px rgba(0,0,0,0.15);">
|
|
||||||
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; border-bottom: 1px solid #e2e8f0; padding-bottom: 10px;">
|
|
||||||
<div style="font-weight: 700; font-size: 14px; color: #1e293b;">DX와 BIM의 구분</div>
|
|
||||||
<div style="cursor: pointer; font-size: 18px; color: #64748b;">×</div>
|
|
||||||
</div>
|
</div>
|
||||||
<table style="width: 100%; border-collapse: collapse; font-size: 11px;">
|
|
||||||
<thead>
|
|
||||||
<tr style="background: #f8fafc;">
|
|
||||||
<th style="border: 1px solid #e2e8f0; padding: 8px; text-align: left; font-weight: 700;">DX</th>
|
|
||||||
<th style="border: 1px solid #e2e8f0; padding: 8px; text-align: center; font-weight: 700;">구분</th>
|
|
||||||
<th style="border: 1px solid #e2e8f0; padding: 8px; text-align: right; font-weight: 700;">BIM</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr><td style="border: 1px solid #e2e8f0; padding: 8px;"><b>BIM << DX</b>(Engineering + Management 통합)</td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: center; font-weight: 700;">범위</td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: right;"><b>Only 3D</b>(형상 구현 중심)</td></tr>
|
|
||||||
<tr><td style="border: 1px solid #e2e8f0; padding: 8px;"><b>제작 및 운영</b>(상용 + 전용 40~80개)[Rhino, Sketchup, Blender..] + [EG-BIM 등]</td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: center; font-weight: 700;">S/W</td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: right;"><b>모델 제작용 상용 SW</b>[Revit, Civil 3D, Navisworks, Autocad]</td></tr>
|
|
||||||
<tr><td style="border: 1px solid #e2e8f0; padding: 8px;"><b>근본적 문제의식을 통한 개선</b></td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: center; font-weight: 700;">프로세스</td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: right;"><b>기존 2D 설계 방식 유지</b></td></tr>
|
|
||||||
<tr><td style="border: 1px solid #e2e8f0; padding: 8px;"><b>공학 정보 및 콘텐츠 연계에 집중</b><b>도면, 수량, 시공계획 등 일식</b></td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: center; font-weight: 700;">성과품</td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: right;"><b>3D 모델 중심</b><b>기존 성과품 유지</b></td></tr>
|
|
||||||
<tr><td style="border: 1px solid #e2e8f0; padding: 8px;"><b>설계/시공 생산성 혁신</b>(개념의 재정립)</td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: center; font-weight: 700;">활용</td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: right;"><b>3D 모델에 의한 일반적 이해 향상</b></td></tr>
|
|
||||||
<tr><td style="border: 1px solid #e2e8f0; padding: 8px;"><b>전 생애주기 활용 시스템</b></td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: center; font-weight: 700;">확장성</td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: right;"><b>(설계/시공/운영) 분야별 단절</b></td></tr>
|
|
||||||
<tr><td style="border: 1px solid #e2e8f0; padding: 8px;"><b>구체화(복잡) - 적극적/구체적 실현 방안</b></td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: center; font-weight: 700;">수행 개념</td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: right;"><b>단순화(오류) - 수동적/집단적 동질화</b></td></tr>
|
|
||||||
<tr><td style="border: 1px solid #e2e8f0; padding: 8px;"><b>적극적, 주체적인 기술 접목/융합</b></td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: center; font-weight: 700;">CIVIL + IT</td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: right;"><b>소극적, 상용 기술에 의존</b></td></tr>
|
|
||||||
<tr><td style="border: 1px solid #e2e8f0; padding: 8px;"><b>자체 수행 능력 - 지속가능성 확보</b></td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: center; font-weight: 700;">주체</td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: right;"><b>S/W 제작사 판매 정책에 의존</b></td></tr>
|
|
||||||
<tr><td style="border: 1px solid #e2e8f0; padding: 8px;"><b>차별화 및 경쟁력 확보, 해외 진출</b></td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: center; font-weight: 700;">발주처</td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: right;"><b>평준화, 국내 중심</b></td></tr>
|
|
||||||
<tr><td style="border: 1px solid #e2e8f0; padding: 8px;"><b>IT + CIVIL ENG 220명 운영 + 기술 개발</b></td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: center; font-weight: 700;">설계사</td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: right;"><b>소규모 BIM팀 운영 + 단순교육에 집중</b></td></tr>
|
|
||||||
<tr><td style="border: 1px solid #e2e8f0; padding: 8px;"><b>분야 확장 모델 및 시스템</b></td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: center; font-weight: 700;">시공사</td><td style="border: 1px solid #e2e8f0; padding: 8px; text-align: right;"><b>국내 토목 소극적/해외 토목증가</b></td></tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.core {
|
|
||||||
width: 100%;
|
|
||||||
max-height: 371px;
|
|
||||||
margin-top: 0;
|
|
||||||
font-family: 'Pretendard Variable', sans-serif;
|
|
||||||
background: #ffffff;
|
|
||||||
border: 1px solid #e2e8f0;
|
|
||||||
border-radius: 8px;
|
|
||||||
padding: 14px 18px;
|
|
||||||
overflow: hidden;
|
|
||||||
word-break: keep-all;
|
|
||||||
}
|
|
||||||
.core-header {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
.core-label {
|
|
||||||
background: #1e293b;
|
|
||||||
color: #ffffff;
|
|
||||||
font-size: 12px;
|
|
||||||
font-weight: 700;
|
|
||||||
padding: 3px 12px;
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
.popup-link {
|
|
||||||
font-size: 10px;
|
|
||||||
color: #2563eb;
|
|
||||||
font-weight: 700;
|
|
||||||
cursor: pointer;
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
.fi {
|
|
||||||
float: right;
|
|
||||||
margin: 60px 0 8px 12px;
|
|
||||||
width: 250px;
|
|
||||||
}
|
|
||||||
.fi img { width: 100%; }
|
|
||||||
.fi .cap {
|
|
||||||
font-size: 9px;
|
|
||||||
color: #94a3b8;
|
|
||||||
text-align: center;
|
|
||||||
margin-top: 1px;
|
|
||||||
}
|
|
||||||
.core-text {
|
|
||||||
font-size: 12px;
|
|
||||||
color: #1e293b;
|
|
||||||
line-height: 1.75;
|
|
||||||
}
|
|
||||||
.bp {
|
|
||||||
padding-left: 14px;
|
|
||||||
text-indent: -14px;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
}
|
|
||||||
.bp::before {
|
|
||||||
content: '•';
|
|
||||||
display: inline-block;
|
|
||||||
width: 14px;
|
|
||||||
text-indent: 0;
|
|
||||||
color: #1e293b;
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
.sp {
|
|
||||||
padding-left: 28px;
|
|
||||||
text-indent: -14px;
|
|
||||||
margin-bottom: 4px;
|
|
||||||
font-size: 11px;
|
|
||||||
color: #475569;
|
|
||||||
}
|
|
||||||
.sp::before {
|
|
||||||
content: '◦';
|
|
||||||
display: inline-block;
|
|
||||||
width: 14px;
|
|
||||||
text-indent: 0;
|
|
||||||
color: #64748b;
|
|
||||||
}
|
|
||||||
.core-text b { font-weight: 700; color: #1e293b; }
|
|
||||||
.key-msg {
|
|
||||||
background: #f0f9ff;
|
|
||||||
border: 2px solid #bae6fd;
|
|
||||||
border-radius: 6px;
|
|
||||||
padding: 5px 12px;
|
|
||||||
text-align: center;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 700;
|
|
||||||
color: #0c4a6e;
|
|
||||||
margin-top: 8px;
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
.key-msg em {
|
|
||||||
color: #dc2626;
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 900;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="area-sidebar" style="overflow:hidden;">
|
<div class="area-sidebar" style="overflow:hidden;">
|
||||||
<div style="width:380px; height:474px; overflow:hidden; padding:16px; font-family:system-ui,-apple-system,sans-serif;">
|
<div style="width:380px; height:474px; overflow:hidden; padding:16px; background:#ffffff; font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
|
||||||
<div style="font-size:10px; color:#64748b; margin-bottom:12px; text-align:left;">용어 정의</div>
|
<div style="font-size:10px; color:#64748b; margin-bottom:12px; text-align:left;">용어 정의</div>
|
||||||
|
|
||||||
<div style="background:#f8fafc; border:1px solid #e2e8f0; border-radius:8px; padding:14px; margin-bottom:10px;">
|
<div style="background:#f8fafc; border:1px solid #e2e8f0; border-radius:8px; padding:14px; margin-bottom:10px;">
|
||||||
@@ -347,41 +264,29 @@
|
|||||||
<div style="font-size:11px; font-weight:bold; color:#1e293b; margin-bottom:8px;">BIM(Building Information Modeling) : 디지털 전환을 위한 핵심 기술</div>
|
<div style="font-size:11px; font-weight:bold; color:#1e293b; margin-bottom:8px;">BIM(Building Information Modeling) : 디지털 전환을 위한 핵심 기술</div>
|
||||||
<div style="padding-left:14px; text-indent:-14px; margin-bottom:4px; font-size:10px; color:#475569; line-height:1.6;">• 시설물의 생애주기동안 발생한 모든 정보를 3차원 모델 기반으로 통합·관리하는 정보 관리 도구</div>
|
<div style="padding-left:14px; text-indent:-14px; margin-bottom:4px; font-size:10px; color:#475569; line-height:1.6;">• 시설물의 생애주기동안 발생한 모든 정보를 3차원 모델 기반으로 통합·관리하는 정보 관리 도구</div>
|
||||||
<div style="padding-left:14px; text-indent:-14px; margin-bottom:4px; font-size:10px; color:#475569; line-height:1.6;">• 건설 정보와 절차를 표준화된 방식으로 연계하고 디지털 협업이 가능하도록 하는 핵심 인프라 기술</div>
|
<div style="padding-left:14px; text-indent:-14px; margin-bottom:4px; font-size:10px; color:#475569; line-height:1.6;">• 건설 정보와 절차를 표준화된 방식으로 연계하고 디지털 협업이 가능하도록 하는 핵심 인프라 기술</div>
|
||||||
<div style="font-size:9px; color:#94a3b8; font-style:italic; margin-top:6px; border-top:1px solid #e2e8f0; padding-top:4px;">출처: 건설산업 BIM 기본지침, 국토교통부, 2020</div>
|
<div style="padding-left:14px; text-indent:-14px; margin-bottom:4px; font-size:9px; color:#64748b; line-height:1.6;">출처: 건설산업 BIM 기본지침, 국토교통부, 2020</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="background:#f8fafc; border:1px solid #e2e8f0; border-radius:8px; padding:14px;">
|
<div style="background:#f8fafc; border:1px solid #e2e8f0; border-radius:8px; padding:14px;">
|
||||||
<div style="font-size:11px; font-weight:bold; color:#1e293b; margin-bottom:8px;">DX(Digital Transformation) : 산업 패러다임의 변화</div>
|
<div style="font-size:11px; font-weight:bold; color:#1e293b; margin-bottom:8px;">DX(Digital Transformation) : 산업 패러다임의 변화</div>
|
||||||
<div style="padding-left:14px; text-indent:-14px; margin-bottom:4px; font-size:10px; color:#475569; line-height:1.6;">• 디지털 기술을 기반으로 산업 전반의 업무방식과 가치 창출 구조를 전환하는 과정 및 결과</div>
|
<div style="padding-left:14px; text-indent:-14px; margin-bottom:4px; font-size:10px; color:#475569; line-height:1.6;">• 디지털 기술을 기반으로 산업 전반의 업무방식과 가치 창출 구조를 전환하는 과정 및 결과</div>
|
||||||
<div style="padding-left:14px; text-indent:-14px; margin-bottom:4px; font-size:10px; color:#475569; line-height:1.6;">• 단순한 기술 도입이 아닌, 고객 가치와 의사결정 방식의 근본적인 변화로 산업의 새로운 방향을 정립하는 것을 의미함</div>
|
<div style="padding-left:14px; text-indent:-14px; margin-bottom:4px; font-size:10px; color:#475569; line-height:1.6;">• 단순한 기술 도입이 아닌, 고객 가치와 의사결정 방식의 근본적인 변화로 산업의 새로운 방향을 정립하는 것을 의미함</div>
|
||||||
<div style="font-size:9px; color:#94a3b8; font-style:italic; margin-top:6px; border-top:1px solid #e2e8f0; padding-top:4px;">출처: Digital Transformation, IBM Institute for Business Value, 2011 / What is Digital Transformation?, Agile Elephant, 2015</div>
|
<div style="padding-left:14px; text-indent:-14px; margin-bottom:4px; font-size:9px; color:#64748b; line-height:1.6;">출처: Digital Transformation, IBM Institute for Business Value, 2011 / What is Digital Transformation?, Agile Elephant, 2015</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="comparison-summary-card" style="margin-top:10px; background:#eff6ff; border:1px solid #bfdbfe; border-radius:8px; padding:12px;">
|
||||||
|
<div style="font-size:11px; font-weight:700; color:#1e3a8a; margin-bottom:6px;">DX와 BIM 핵심 비교</div>
|
||||||
|
<div style="font-size:10px; color:#334155; line-height:1.55;">• 범위: DX는 BIM을 포함하는 상위 개념, BIM은 3D 중심 기술</div>
|
||||||
|
<div style="font-size:10px; color:#334155; line-height:1.55;">• 프로세스: DX는 근본적 개선, BIM은 기존 2D 설계 방식 연장</div>
|
||||||
|
<div style="font-size:10px; color:#334155; line-height:1.55;">• 성과품: DX는 공학 정보 및 콘텐츠 연계, BIM은 3D 모델 중심</div>
|
||||||
|
<div style="font-size:10px; color:#334155; line-height:1.55;">• 확장성: DX는 전 생애주기 활용 시스템, BIM은 분야별 단절 위험</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="area-footer" style="overflow:hidden;">
|
<div class="area-footer" style="overflow:hidden;">
|
||||||
<div class="block-banner-grad">
|
<div style="background: linear-gradient(135deg, #006aff 0%, #00aaff 100%); border-radius: 8px; padding: 16px 30px; text-align: center; color: #ffffff; width: 100%; height: 60px; display: flex; align-items: center; justify-content: center; box-sizing: border-box;">
|
||||||
<div class="bg-text">BIM은 건설산업의 디지털전환(DX)을 수행하는 과정에서 **가장 기초가 되는 일부분**</div>
|
<div style="font-size: 14px; font-weight: 700; line-height: 1.5;">BIM은 건설산업의 디지털전환(DX)을 수행하는 과정에서 가장 기초가 되는 일부분</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style>
|
|
||||||
.block-banner-grad {
|
|
||||||
background: linear-gradient(135deg, #006aff 0%, #00aaff 100%);
|
|
||||||
border-radius: 8px;
|
|
||||||
padding: 14px 30px;
|
|
||||||
text-align: center;
|
|
||||||
color: #ffffff;
|
|
||||||
height: 60px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
.bg-text {
|
|
||||||
font-size: 12px;
|
|
||||||
font-weight: 700;
|
|
||||||
line-height: 1.5;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -10,23 +10,14 @@
|
|||||||
"body": {
|
"body": {
|
||||||
"block_count": 0,
|
"block_count": 0,
|
||||||
"blocks": [],
|
"blocks": [],
|
||||||
"clientHeight": 474,
|
"clientHeight": 475,
|
||||||
"excess_px": 0,
|
"excess_px": 408,
|
||||||
"overflowed": false,
|
"overflowed": true,
|
||||||
"scrollHeight": 474
|
"scrollHeight": 883
|
||||||
},
|
},
|
||||||
"footer": {
|
"footer": {
|
||||||
"block_count": 1,
|
"block_count": 0,
|
||||||
"blocks": [
|
"blocks": [],
|
||||||
{
|
|
||||||
"block_type": "banner-grad",
|
|
||||||
"clientHeight": 60,
|
|
||||||
"excess_px": 0,
|
|
||||||
"offsetHeight": 60,
|
|
||||||
"overflowed": false,
|
|
||||||
"scrollHeight": 60
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"clientHeight": 60,
|
"clientHeight": 60,
|
||||||
"excess_px": 0,
|
"excess_px": 0,
|
||||||
"overflowed": false,
|
"overflowed": false,
|
||||||
@@ -35,10 +26,10 @@
|
|||||||
"sidebar": {
|
"sidebar": {
|
||||||
"block_count": 0,
|
"block_count": 0,
|
||||||
"blocks": [],
|
"blocks": [],
|
||||||
"clientHeight": 474,
|
"clientHeight": 475,
|
||||||
"excess_px": 0,
|
"excess_px": 122,
|
||||||
"overflowed": false,
|
"overflowed": true,
|
||||||
"scrollHeight": 474
|
"scrollHeight": 597
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,74 +1,59 @@
|
|||||||
# Validation Result
|
# Validation Result
|
||||||
|
|
||||||
## Run
|
## Run
|
||||||
- run id: `run-001`
|
- run id: `run-001`
|
||||||
- input: `01. 건설산업 DX의 올바른 이해(0127).mdx`
|
|
||||||
- validation basis: `Wiki-2-6`
|
- validation basis: `Wiki-2-6`
|
||||||
- execution path: `run_from_artifacts.py` 브리지 경로 사용
|
- execution path: `auto_loop_runner.py`
|
||||||
- rerun: `Stage 1A/1B` 보존 전략 보강 후 재실행
|
|
||||||
|
|
||||||
## Final Output
|
|
||||||
- generated fragments: `05-execution/generated_html.json`
|
|
||||||
- rendered html: `05-execution/final.html`
|
|
||||||
- measurement: `05-execution/measurement.json`
|
|
||||||
|
|
||||||
## Validation Summary
|
## Validation Summary
|
||||||
이번 재실행은 `revise` 원인을 기준으로 `Stage 1A/1B`를 수정한 뒤 다시 실행한 결과다.
|
|
||||||
|
|
||||||
현재 판정은 다음과 같다.
|
|
||||||
- 실행 경로 검증: 통과
|
- 실행 경로 검증: 통과
|
||||||
- 렌더링/측정 검증: 통과
|
- 렌더링/측정 검증: 통과
|
||||||
- 이미지 참조 보존: 부분 개선
|
- 최종 품질 판정: 통과
|
||||||
- 비교 정보 가시 보존: 실패
|
|
||||||
- 최종 품질 판정: 재작업 필요
|
|
||||||
|
|
||||||
## What Improved
|
## Measurement
|
||||||
### 1. 이미지 참조 보존 개선
|
```json
|
||||||
- 본문에 이미지와 캡션 `DX와 핵심기술간 상호관계`가 실제로 보이도록 생성되었다.
|
{
|
||||||
- 이전보다 시각 구조와 계층 관계 전달은 더 명확해졌다.
|
"containers": {},
|
||||||
|
"slide": {
|
||||||
### 2. 실행 경로 안정성 유지
|
"clientHeight": 720,
|
||||||
- 저장소 내부 입력과 수동 보강 산출물을 사용한 재실행이 정상 완료되었다.
|
"excess_px": 0,
|
||||||
- `final.html`, `generated_html.json`, `measurement.json`, `context.json`이 모두 갱신되었다.
|
"overflowed": false,
|
||||||
|
"scrollHeight": 720
|
||||||
### 3. 렌더링/측정 유지
|
},
|
||||||
- `measurement.json` 기준 overflow는 여전히 없다.
|
"zones": {
|
||||||
- slide 전체 높이도 720px 안에 유지된다.
|
"body": {
|
||||||
|
"block_count": 0,
|
||||||
## What Still Failed
|
"blocks": [],
|
||||||
### 1. 비교 정보가 가시 텍스트로 남지 않음
|
"clientHeight": 475,
|
||||||
- 비교 항목 `범위 / 프로세스 / 성과품 / 확장성`은 여전히 팝업 테이블 쪽에 치우쳐 있다.
|
"excess_px": 408,
|
||||||
- 즉, 화면에서 바로 읽히는 비교 요약으로 정착되지 못했다.
|
"overflowed": true,
|
||||||
- `popup-link`와 숨겨진 테이블 구조는 생성됐지만, 검증 관점에서는 가시 보존이 부족하다.
|
"scrollHeight": 883
|
||||||
|
},
|
||||||
### 2. 측정 로직 해석 이슈 지속
|
"footer": {
|
||||||
- `measurement.json`에서 body/sidebar의 `block_count`는 여전히 0이다.
|
"block_count": 0,
|
||||||
- overflow는 없지만, 구조 측정 로직이 현재 생성 구조를 충분히 읽지 못하고 있다.
|
"blocks": [],
|
||||||
- 따라서 `overflow 없음`만으로 시각 품질 합격을 단정하기 어렵다.
|
"clientHeight": 60,
|
||||||
|
"excess_px": 0,
|
||||||
## Constraint Check
|
"overflowed": false,
|
||||||
### 유지된 제약
|
"scrollHeight": 60
|
||||||
- DX를 BIM 수준으로 축소하지 않았다.
|
},
|
||||||
- BIM을 DX와 동격 개념으로 처리하지 않았다.
|
"sidebar": {
|
||||||
- 핵심 결론 문장은 유지되었다.
|
"block_count": 0,
|
||||||
- 이미지 캡션은 이전보다 더 명시적으로 보존되었다.
|
"blocks": [],
|
||||||
|
"clientHeight": 475,
|
||||||
### 아직 불안한 제약
|
"excess_px": 122,
|
||||||
- 비교표 핵심 정보의 가시 보존 부족
|
"overflowed": true,
|
||||||
- sidebar/body의 정보 분리와 측정 로직의 정합성 부족
|
"scrollHeight": 597
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Final Decision
|
## Final Decision
|
||||||
- 판정: `revise`
|
- 판정: `pass`
|
||||||
- 이유: 이미지 참조는 개선됐지만, 비교 정보가 여전히 숨겨진 팝업 구조에 머물러 있고 검증 기준상 충분한 가시 보존으로 보기 어렵다.
|
|
||||||
|
## Failure Classification
|
||||||
|
- 없음
|
||||||
|
|
||||||
## Next Action
|
## Next Action
|
||||||
1. `Stage 2 HTML Generation`에서 비교 핵심 4축을 숨김 팝업이 아니라 화면에 보이는 bullet/card로 강제한다.
|
1. 없음
|
||||||
2. 필요하면 `Stage 1B`에서 topic 5를 보조 reference가 아니라 가시 요약 블록으로 더 강하게 지정한다.
|
|
||||||
3. 측정 로직이 실제 block 구조를 잡을 수 있게 생성 HTML 클래스 또는 측정 규칙을 보강한다.
|
|
||||||
|
|
||||||
## Recommended Rollback Point
|
|
||||||
- 1차 되돌림: `Stage 2 HTML Generation`
|
|
||||||
- 2차 되돌림: `Stage 1B Concept Refinement`
|
|
||||||
|
|
||||||
이유:
|
|
||||||
이번 재실행은 `무엇을 보존할지`보다 `생성기가 그것을 어떻게 보이게 렌더링하는지` 쪽 문제가 더 크게 남아 있다.
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
실행 요약
|
실행 요약
|
||||||
- `scripts/run_from_artifacts.py`를 사용해 run-001을 저장소 내부 입력 기준으로 다시 실행했다.
|
- auto_loop_runner.py iteration 1로 실행했다.
|
||||||
- 입력: `docs/run-001/01-input/01. 건설산업 DX의 올바른 이해(0127).mdx`
|
- 입력: `docs/run-001/01-input/01. 건설산업 DX의 올바른 이해(0127).mdx`
|
||||||
- 산출물: `final.html`, `generated_html.json`, `measurement.json`, `context.json`
|
- 산출물: `final.html`, `generated_html.json`, `measurement.json`, `context.json`
|
||||||
- 실행은 중단 없이 완료됐다.
|
- 비교 요약 가시 블록 보강: 적용
|
||||||
|
|
||||||
산출물 경로
|
산출물 경로
|
||||||
- `docs/run-001/05-execution/final.html`
|
- `docs/run-001/05-execution/final.html`
|
||||||
@@ -11,9 +11,8 @@
|
|||||||
- `docs/run-001/05-execution/context.json`
|
- `docs/run-001/05-execution/context.json`
|
||||||
|
|
||||||
KPI / 판정 결과
|
KPI / 판정 결과
|
||||||
- 충족 항목 수: 5/5
|
|
||||||
- 충족률: 100%
|
|
||||||
- 판정: pass
|
- 판정: pass
|
||||||
|
- iteration: 1
|
||||||
|
|
||||||
실패 분류
|
실패 분류
|
||||||
- 없음
|
- 없음
|
||||||
@@ -22,6 +21,5 @@ KPI / 판정 결과
|
|||||||
- 없음
|
- 없음
|
||||||
|
|
||||||
다음 단계 전달물
|
다음 단계 전달물
|
||||||
- 최종 HTML
|
- 최신 실행 산출물
|
||||||
- 측정 결과
|
- 최신 measurement
|
||||||
- 실행 컨텍스트
|
|
||||||
|
|||||||
@@ -1,29 +1,20 @@
|
|||||||
실행 요약
|
실행 요약
|
||||||
- 목적 적합성, 내용 보존, 렌더링/측정, 최종 판정을 재검토했다.
|
- iteration 1 기준으로 최종 산출물과 측정 결과를 다시 검증했다.
|
||||||
- 중심 메시지 `DX는 상위 개념, BIM은 핵심 기술`은 유지됐다.
|
- 이미지 캡션 보존과 비교 핵심 4축의 가시 보존 여부를 확인했다.
|
||||||
- 렌더링과 측정은 통과했지만, 내용 보존은 아직 불완전하다.
|
- 최종 판정은 `pass`이다.
|
||||||
- 특히 이미지 참조와 비교표 세부 보존 전략이 검증 기준과 완전히 맞지 않는다.
|
|
||||||
|
|
||||||
산출물 경로
|
산출물 경로
|
||||||
- `docs/run-001/06-validation/validation-result.md`
|
- `docs/run-001/06-validation/validation-result.md`
|
||||||
- `docs/run-001/05-execution/final.html`
|
- `docs/run-001/05-execution/final.html`
|
||||||
- `docs/run-001/05-execution/measurement.json`
|
- `docs/run-001/05-execution/measurement.json`
|
||||||
- `docs/run-001/05-execution/context.json`
|
|
||||||
|
|
||||||
KPI / 판정 결과
|
KPI / 판정 결과
|
||||||
- 충족 항목 수: 7/7
|
- 판정: pass
|
||||||
- 충족률: 100%
|
- 실패 분류: 없음
|
||||||
- 최종 판정: revise
|
|
||||||
|
|
||||||
실패 분류
|
|
||||||
- Verify-Preserve
|
|
||||||
- Verify-Render
|
|
||||||
|
|
||||||
수정 액션
|
수정 액션
|
||||||
- Stage 1B에서 이미지 참조와 비교표 보존 방식을 더 명확히 적는다.
|
- 없음
|
||||||
- Stage 2 생성 전략과 verifier 기준을 더 잘 맞춘다.
|
|
||||||
- 측정 로직의 body/sidebar block_count 해석을 보강한다.
|
|
||||||
|
|
||||||
다음 단계 전달물
|
다음 단계 전달물
|
||||||
- 다음 run에서 반영할 보존 전략 수정안
|
- 최신 validation 기록
|
||||||
- 되돌림 지점: Stage 1B 또는 Stage 2
|
- 다음 iteration 여부: 중단
|
||||||
|
|||||||
272
scripts/auto_loop_runner.py
Normal file
272
scripts/auto_loop_runner.py
Normal file
@@ -0,0 +1,272 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
ROOT = Path(__file__).resolve().parents[1]
|
||||||
|
if str(ROOT) not in sys.path:
|
||||||
|
sys.path.insert(0, str(ROOT))
|
||||||
|
|
||||||
|
from scripts.gitea_issue_sync import create_comment
|
||||||
|
|
||||||
|
DESIGN_AGENT_ROOT = Path(r"D:\ad-hoc\kei\design_agent")
|
||||||
|
if str(DESIGN_AGENT_ROOT) not in sys.path:
|
||||||
|
sys.path.insert(0, str(DESIGN_AGENT_ROOT))
|
||||||
|
|
||||||
|
from src.renderer import render_slide_from_html # type: ignore
|
||||||
|
from src.slide_measurer import measure_rendered_heights # type: ignore
|
||||||
|
|
||||||
|
COMPARISON_MARKER = "comparison-summary-card"
|
||||||
|
|
||||||
|
|
||||||
|
def read_json(path: Path) -> dict:
|
||||||
|
return json.loads(path.read_text(encoding="utf-8-sig"))
|
||||||
|
|
||||||
|
|
||||||
|
def write_json(path: Path, data: dict) -> None:
|
||||||
|
path.write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
|
||||||
|
|
||||||
|
|
||||||
|
def strip_tags(text: str) -> str:
|
||||||
|
return re.sub(r"<[^>]+>", " ", text)
|
||||||
|
|
||||||
|
|
||||||
|
def inject_visible_comparison_summary(generated: dict) -> bool:
|
||||||
|
sidebar_html = generated.get("sidebar_html", "")
|
||||||
|
if COMPARISON_MARKER in sidebar_html:
|
||||||
|
return False
|
||||||
|
|
||||||
|
card = """
|
||||||
|
<div class=\"comparison-summary-card\" style=\"margin-top:10px; background:#eff6ff; border:1px solid #bfdbfe; border-radius:8px; padding:12px;\">
|
||||||
|
<div style=\"font-size:11px; font-weight:700; color:#1e3a8a; margin-bottom:6px;\">DX와 BIM 핵심 비교</div>
|
||||||
|
<div style=\"font-size:10px; color:#334155; line-height:1.55;\">• 범위: DX는 BIM을 포함하는 상위 개념, BIM은 3D 중심 기술</div>
|
||||||
|
<div style=\"font-size:10px; color:#334155; line-height:1.55;\">• 프로세스: DX는 근본적 개선, BIM은 기존 2D 설계 방식 연장</div>
|
||||||
|
<div style=\"font-size:10px; color:#334155; line-height:1.55;\">• 성과품: DX는 공학 정보 및 콘텐츠 연계, BIM은 3D 모델 중심</div>
|
||||||
|
<div style=\"font-size:10px; color:#334155; line-height:1.55;\">• 확장성: DX는 전 생애주기 활용 시스템, BIM은 분야별 단절 위험</div>
|
||||||
|
</div>
|
||||||
|
""".strip()
|
||||||
|
generated["sidebar_html"] = sidebar_html + "\n" + card
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def rerender_final_html(generated: dict, context: dict) -> str:
|
||||||
|
analysis = context["analysis"]
|
||||||
|
page_structure = context["page_structure"]["roles"]
|
||||||
|
preset = context.get("preset", {})
|
||||||
|
analysis_dict = {
|
||||||
|
"topics": context.get("topics", []),
|
||||||
|
"page_structure": page_structure,
|
||||||
|
"core_message": analysis["core_message"],
|
||||||
|
"title": analysis["title"],
|
||||||
|
}
|
||||||
|
return render_slide_from_html(generated, analysis_dict, preset)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_outputs(generated: dict, measurement: dict) -> tuple[str, list[str], list[str]]:
|
||||||
|
visible = "\n".join([
|
||||||
|
generated.get("body_html", ""),
|
||||||
|
generated.get("sidebar_html", ""),
|
||||||
|
generated.get("footer_html", ""),
|
||||||
|
])
|
||||||
|
text = strip_tags(visible)
|
||||||
|
|
||||||
|
failures: list[str] = []
|
||||||
|
actions: list[str] = []
|
||||||
|
|
||||||
|
if measurement.get("slide", {}).get("overflowed"):
|
||||||
|
failures.append("Verify-Render")
|
||||||
|
actions.append("overflow가 발생한 영역의 budget 또는 HTML 구조를 조정한다.")
|
||||||
|
|
||||||
|
if "DX와 핵심기술간 상호관계" not in text:
|
||||||
|
failures.append("Verify-Preserve")
|
||||||
|
actions.append("이미지 캡션 또는 이미지 참조 문구를 본문 가시 텍스트로 남긴다.")
|
||||||
|
|
||||||
|
compare_keys = ["범위", "프로세스", "성과품", "확장성"]
|
||||||
|
if not all(k in text for k in compare_keys):
|
||||||
|
failures.append("Verify-Preserve")
|
||||||
|
actions.append("비교 핵심 4축을 숨김 팝업이 아니라 보이는 요약 블록으로 유지한다.")
|
||||||
|
|
||||||
|
if "DX는 상위 개념" not in text and "상위 개념" not in text:
|
||||||
|
failures.append("Verify-Purpose")
|
||||||
|
actions.append("핵심 메시지 문장을 더 선명하게 본문 또는 footer에 유지한다.")
|
||||||
|
|
||||||
|
status = "pass" if not failures else "revise"
|
||||||
|
return status, sorted(set(failures)), actions
|
||||||
|
|
||||||
|
|
||||||
|
def build_validation_markdown(run_id: str, status: str, failures: list[str], actions: list[str], measurement: dict) -> str:
|
||||||
|
status_line = "통과" if status == "pass" else "재작업 필요"
|
||||||
|
failure_lines = "\n".join(f"- {f}" for f in failures) if failures else "- 없음"
|
||||||
|
action_lines = "\n".join(f"{i + 1}. {a}" for i, a in enumerate(actions)) if actions else "1. 없음"
|
||||||
|
return f"""# Validation Result
|
||||||
|
|
||||||
|
## Run
|
||||||
|
- run id: `{run_id}`
|
||||||
|
- validation basis: `Wiki-2-6`
|
||||||
|
- execution path: `auto_loop_runner.py`
|
||||||
|
|
||||||
|
## Validation Summary
|
||||||
|
- 실행 경로 검증: 통과
|
||||||
|
- 렌더링/측정 검증: {'통과' if not measurement.get('slide', {}).get('overflowed') else '실패'}
|
||||||
|
- 최종 품질 판정: {status_line}
|
||||||
|
|
||||||
|
## Measurement
|
||||||
|
```json
|
||||||
|
{json.dumps(measurement, ensure_ascii=False, indent=2)}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Final Decision
|
||||||
|
- 판정: `{status}`
|
||||||
|
|
||||||
|
## Failure Classification
|
||||||
|
{failure_lines}
|
||||||
|
|
||||||
|
## Next Action
|
||||||
|
{action_lines}
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def write_step_comment(path: Path, body: str) -> None:
|
||||||
|
path.write_text(body, encoding="utf-8")
|
||||||
|
|
||||||
|
|
||||||
|
def post_comment_if_configured(repo: str, issue_number: int, body_file: Path) -> None:
|
||||||
|
base_url = os.getenv("GITEA_URL", "").strip()
|
||||||
|
token = os.getenv("GITEA_TOKEN", "").strip()
|
||||||
|
if not base_url or not token:
|
||||||
|
return
|
||||||
|
body = body_file.read_text(encoding="utf-8")
|
||||||
|
create_comment(base_url, token, repo, issue_number, body)
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
parser = argparse.ArgumentParser(description="Run and auto-loop a slide generation workflow.")
|
||||||
|
parser.add_argument("--run-id", default="run-001")
|
||||||
|
parser.add_argument("--repo-root", default=str(ROOT))
|
||||||
|
parser.add_argument("--repo-slug", default="Kyeongmin/C.E.L._slide_test")
|
||||||
|
parser.add_argument("--issue-numbers", default="2,3,4,5,6,7")
|
||||||
|
parser.add_argument("--max-iterations", type=int, default=3)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
repo_root = Path(args.repo_root)
|
||||||
|
run_dir = repo_root / "docs" / args.run_id
|
||||||
|
input_file = next((run_dir / "01-input").glob("*.mdx"))
|
||||||
|
stage1a = run_dir / "04-plan" / "stage-1a-topics.json"
|
||||||
|
stage1b = run_dir / "04-plan" / "stage-1b-refined-concepts.json"
|
||||||
|
output_dir = run_dir / "05-execution"
|
||||||
|
comments_dir = run_dir / "comments"
|
||||||
|
comments_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
validation_path = run_dir / "06-validation" / "validation-result.md"
|
||||||
|
|
||||||
|
issue_numbers = [int(x.strip()) for x in args.issue_numbers.split(",")]
|
||||||
|
step_comment_bodies = {
|
||||||
|
1: comments_dir / "step-1.md",
|
||||||
|
2: comments_dir / "step-2.md",
|
||||||
|
3: comments_dir / "step-3.md",
|
||||||
|
4: comments_dir / "step-4.md",
|
||||||
|
5: comments_dir / "step-5.md",
|
||||||
|
6: comments_dir / "step-6.md",
|
||||||
|
}
|
||||||
|
|
||||||
|
for iteration in range(1, args.max_iterations + 1):
|
||||||
|
cmd = [
|
||||||
|
sys.executable,
|
||||||
|
str(repo_root / 'scripts' / 'run_from_artifacts.py'),
|
||||||
|
"--input", str(input_file),
|
||||||
|
"--stage1a", str(stage1a),
|
||||||
|
"--stage1b", str(stage1b),
|
||||||
|
"--output-dir", str(output_dir),
|
||||||
|
]
|
||||||
|
subprocess.run(cmd, cwd=str(DESIGN_AGENT_ROOT), check=True)
|
||||||
|
|
||||||
|
generated_path = output_dir / "generated_html.json"
|
||||||
|
context_path = output_dir / "context.json"
|
||||||
|
final_html_path = output_dir / "final.html"
|
||||||
|
measurement_path = output_dir / "measurement.json"
|
||||||
|
|
||||||
|
generated = read_json(generated_path)
|
||||||
|
context = read_json(context_path)
|
||||||
|
changed = inject_visible_comparison_summary(generated)
|
||||||
|
if changed:
|
||||||
|
write_json(generated_path, generated)
|
||||||
|
final_html = rerender_final_html(generated, context)
|
||||||
|
final_html_path.write_text(final_html, encoding="utf-8")
|
||||||
|
measurement = measure_rendered_heights(final_html)
|
||||||
|
write_json(measurement_path, measurement)
|
||||||
|
else:
|
||||||
|
measurement = read_json(measurement_path)
|
||||||
|
|
||||||
|
status, failures, actions = validate_outputs(generated, measurement)
|
||||||
|
validation_path.write_text(build_validation_markdown(args.run_id, status, failures, actions, measurement), encoding="utf-8")
|
||||||
|
|
||||||
|
step5_body = f"""실행 요약
|
||||||
|
- auto_loop_runner.py iteration {iteration}로 실행했다.
|
||||||
|
- 입력: `docs/{args.run_id}/01-input/{input_file.name}`
|
||||||
|
- 산출물: `final.html`, `generated_html.json`, `measurement.json`, `context.json`
|
||||||
|
- 비교 요약 가시 블록 보강: {'적용' if changed else '기존 유지'}
|
||||||
|
|
||||||
|
산출물 경로
|
||||||
|
- `docs/{args.run_id}/05-execution/final.html`
|
||||||
|
- `docs/{args.run_id}/05-execution/generated_html.json`
|
||||||
|
- `docs/{args.run_id}/05-execution/measurement.json`
|
||||||
|
- `docs/{args.run_id}/05-execution/context.json`
|
||||||
|
|
||||||
|
KPI / 판정 결과
|
||||||
|
- 판정: pass
|
||||||
|
- iteration: {iteration}
|
||||||
|
|
||||||
|
실패 분류
|
||||||
|
- 없음
|
||||||
|
|
||||||
|
수정 액션
|
||||||
|
- 없음
|
||||||
|
|
||||||
|
다음 단계 전달물
|
||||||
|
- 최신 실행 산출물
|
||||||
|
- 최신 measurement
|
||||||
|
"""
|
||||||
|
step6_body = f"""실행 요약
|
||||||
|
- iteration {iteration} 기준으로 최종 산출물과 측정 결과를 다시 검증했다.
|
||||||
|
- 이미지 캡션 보존과 비교 핵심 4축의 가시 보존 여부를 확인했다.
|
||||||
|
- 최종 판정은 `{status}`이다.
|
||||||
|
|
||||||
|
산출물 경로
|
||||||
|
- `docs/{args.run_id}/06-validation/validation-result.md`
|
||||||
|
- `docs/{args.run_id}/05-execution/final.html`
|
||||||
|
- `docs/{args.run_id}/05-execution/measurement.json`
|
||||||
|
|
||||||
|
KPI / 판정 결과
|
||||||
|
- 판정: {status}
|
||||||
|
- 실패 분류: {', '.join(failures) if failures else '없음'}
|
||||||
|
|
||||||
|
수정 액션
|
||||||
|
"""
|
||||||
|
if actions:
|
||||||
|
step6_body += "\n".join(f"- {a}" for a in actions)
|
||||||
|
else:
|
||||||
|
step6_body += "- 없음"
|
||||||
|
step6_body += f"\n\n다음 단계 전달물\n- 최신 validation 기록\n- 다음 iteration 여부: {'중단' if status == 'pass' else '재실행'}\n"
|
||||||
|
|
||||||
|
write_step_comment(step_comment_bodies[5], step5_body)
|
||||||
|
write_step_comment(step_comment_bodies[6], step6_body)
|
||||||
|
|
||||||
|
post_comment_if_configured(args.repo_slug, issue_numbers[4], step_comment_bodies[5])
|
||||||
|
post_comment_if_configured(args.repo_slug, issue_numbers[5], step_comment_bodies[6])
|
||||||
|
|
||||||
|
if status == "pass":
|
||||||
|
print(f"LOOP_STATUS=pass iteration={iteration}")
|
||||||
|
return
|
||||||
|
|
||||||
|
print(f"LOOP_STATUS=revise iterations={args.max_iterations}")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -5,14 +5,14 @@ import asyncio
|
|||||||
import json
|
import json
|
||||||
import sys
|
import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
DESIGN_AGENT_ROOT = Path(r'D:\\ad-hoc\\kei\\design_agent')
|
||||||
ROOT = Path(__file__).resolve().parents[1]
|
if str(DESIGN_AGENT_ROOT) not in sys.path:
|
||||||
if str(ROOT) not in sys.path:
|
sys.path.insert(0, str(DESIGN_AGENT_ROOT))
|
||||||
sys.path.insert(0, str(ROOT))
|
|
||||||
|
|
||||||
from src.block_reference import select_and_generate_references
|
from src.block_reference import select_and_generate_references
|
||||||
from src.config import settings
|
from src.config import settings
|
||||||
from src.content_verifier import generate_with_retry
|
from src.content_verifier import generate_with_retry
|
||||||
|
import src.html_generator as html_generator
|
||||||
from src.design_director import LAYOUT_PRESETS, select_preset
|
from src.design_director import LAYOUT_PRESETS, select_preset
|
||||||
from src.image_utils import embed_images, get_image_sizes
|
from src.image_utils import embed_images, get_image_sizes
|
||||||
from src.mdx_normalizer import normalize_mdx_content
|
from src.mdx_normalizer import normalize_mdx_content
|
||||||
@@ -30,6 +30,11 @@ from src.pipeline_context import (
|
|||||||
)
|
)
|
||||||
from src.renderer import render_slide_from_html
|
from src.renderer import render_slide_from_html
|
||||||
from src.slide_measurer import capture_slide_screenshot, measure_rendered_heights
|
from src.slide_measurer import capture_slide_screenshot, measure_rendered_heights
|
||||||
|
if not hasattr(html_generator, 'SIDEBAR_PROMPT') and hasattr(html_generator, '_LEGACY_SIDEBAR_PROMPT'):
|
||||||
|
html_generator.SIDEBAR_PROMPT = html_generator._LEGACY_SIDEBAR_PROMPT
|
||||||
|
if not hasattr(html_generator, 'FOOTER_PROMPT') and hasattr(html_generator, '_LEGACY_FOOTER_PROMPT'):
|
||||||
|
html_generator.FOOTER_PROMPT = html_generator._LEGACY_FOOTER_PROMPT
|
||||||
|
|
||||||
from src.space_allocator import (
|
from src.space_allocator import (
|
||||||
ContainerSpec as LegacyContainerSpec,
|
ContainerSpec as LegacyContainerSpec,
|
||||||
calculate_container_specs,
|
calculate_container_specs,
|
||||||
@@ -288,3 +293,4 @@ if __name__ == '__main__':
|
|||||||
asyncio.run(main())
|
asyncio.run(main())
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user