chore(rebar): Pier_T_rebar 작업 폴더 초기 구성 및 외부 의존 파일 통합
- Code\rebar_pipeline, review_pipeline, pier-program을 정션에서 실제 폴더로 전환 - Code\rhino_mcp 및 CLAUDE_rhino배경.md 추가, .mcp.json은 PYTHONPATH로 새 위치 사용 - pier-program 내부 .git 제거(이력은 backup\pier-program_20261028.bundle에 보관) - worktree 가이드 반영(CLAUDE.local.md, HANDOFF.md) - D:\Rhino-MCP 경로 참조를 새 위치로 치환 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
commit
964a841de1
3978 files changed
+58013356
No files matched your search
@@ -0,0 +1,81 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}게이트 · {{ p.name }}{% endblock %}
|
||||
{% block body %}
|
||||
{% if running %}<meta http-equiv="refresh" content="5">{% endif %}
|
||||
<h1>게이트 G1 → G5</h1>
|
||||
<p class="muted">게이트마다 G1부터 그 단계까지 새로 만들고, 저장한 파일을 다시 열어 검사합니다(재로드).
|
||||
PASS 조건: 계획 FAIL 외 FAIL 0 · 수평/수직 음성 시험 검출 · 재로드 객체 수 일치 · 앞 게이트 객체 불변.
|
||||
다음 게이트는 앞 게이트가 승인되어야 실행할 수 있습니다.{% if running %} <b>실행 중 — 5초마다 새로 고칩니다.</b>{% endif %}</p>
|
||||
|
||||
{% if out_of_scope %}<p class="muted">이 교각의 범위 밖 게이트: {{ out_of_scope|join(', ') }} (실행·승인 대상 아님)</p>{% endif %}
|
||||
<h2>일괄 승인 (필요하면 실행)</h2>
|
||||
{% if batch %}<p>최근 일괄 실행: <b class="{{ 'ok' if batch.state == '완료' else ('warn' if batch.state in ('실행 중', '중단됨') else 'fail') }}">{{ batch.state }}</b>
|
||||
· 판정자 {{ batch.by }} · {% if batch.started %}{{ batch.started }} 시작 · {% endif %}{{ batch.at }}{% if batch.state != '실행 중' %} 끝{% endif %}</p>
|
||||
{% if aborted %}<div class="flash fail" role="alert" id="batch-aborted">
|
||||
<b>이 일괄 실행은 끝까지 가지 못했습니다.</b>
|
||||
{% if batch.reason == 'error' %}모델을 만들거나 검사하는 도중 <b>오류</b>가 나서 멈췄습니다{% if batch.error %}: <code>{{ batch.error }}</code>{% endif %}.
|
||||
{% elif batch.reason == 'fail' %}<b>{{ batch.gate }}</b>가 FAIL이라 승인하지 않고 멈췄습니다.
|
||||
{% elif batch.reason == 'blocked' %}실행 조건이 맞지 않아 시작하지 못했습니다.
|
||||
{% elif batch.reason == 'killed' %}서버가 멈추거나 다시 켜져서 끝나지 못했습니다.
|
||||
{% else %}이유가 기록되지 않았습니다.{% endif %}
|
||||
<ul>
|
||||
<li>아래 게이트별 표에서 <b>"이전 실행 결과"</b>로 표시된 것은 이번 실행에서 갱신되지 않은 옛 결과입니다. 그 결과나 승인 기록을 이번 입력의 결과로 읽지 마세요.</li>
|
||||
<li>중단되기 전에 계산된 <b>임시 결과</b>가 있으면 해당 게이트 표 위에 따로 표시합니다. 승인과 보고서에는 쓰이지 않습니다.</li>
|
||||
<li>원인을 해결한 뒤 일괄 승인을 다시 실행하세요.</li>
|
||||
</ul></div>{% endif %}
|
||||
<ul>{% for m in batch.log %}<li>{{ m }}</li>{% endfor %}</ul>{% endif %}
|
||||
{% if todo %}
|
||||
<form method="post" action="{{ url_for('gates_run_all', name=p.name) }}"
|
||||
onsubmit="return confirm('{{ todo[0] }}~{{ todo[-1] }}를 차례로 승인합니다. 최신 PASS 결과가 있는 게이트는 바로 승인하고, 결과가 없으면 실행한 뒤 PASS일 때만 승인합니다. 진행할까요?');">
|
||||
판정자 <input type="text" name="by" required>
|
||||
<button {% if running %}disabled{% endif %}>{{ todo[0] if todo|length == 1 else todo[0] ~ '~' ~ todo[-1] }} 일괄 승인</button>
|
||||
</form>
|
||||
<p class="muted">최신 PASS 결과가 있는 게이트는 다시 실행하지 않고 바로 승인합니다. 결과가 없거나 입력이 바뀐 게이트는 실행한 뒤 PASS일 때만 승인합니다. FAIL·오류·실행 조건 미충족이면 그 게이트에서 멈추고 승인하지 않습니다.
|
||||
승인 기록의 의견란에 '일괄 실행 자동 승인'이 남습니다. 결과는 아래 게이트별 표에서 확인하세요.</p>
|
||||
{% else %}<p class="ok">모든 게이트가 승인되어 있습니다.</p>{% endif %}
|
||||
|
||||
<h2>검토보고서 (초안)</h2>
|
||||
<form method="post" action="{{ url_for('report_make', name=p.name) }}">
|
||||
작성자 <input type="text" name="by"> <button {% if running %}disabled{% endif %}>보고서 초안 생성 (MD + PDF)</button>
|
||||
<a href="{{ url_for('report_get', name=p.name, kind='md') }}">MD 받기</a> · <a href="{{ url_for('report_get', name=p.name, kind='pdf') }}">PDF 받기</a>
|
||||
</form>
|
||||
<p class="muted">게이트 결과·도면 표·승인 기록으로 자동 작성합니다. 승인되지 않은 게이트가 있으면 '미완료'로 표시됩니다. 판정 확정과 3~5장 서술은 담당자가 합니다.</p>
|
||||
|
||||
{% for g in rows %}
|
||||
<h2>{{ g.id }} {{ g.name }} —
|
||||
{% if g.report %}{% if g.stale %}<span class="warn">입력 변경 · 재실행 필요</span>{% elif g.report.verdict == 'PASS' %}<span class="ok">PASS</span>{% else %}<span class="fail">FAIL</span>{% endif %}{% else %}<span class="muted">미실행</span>{% endif %}
|
||||
{% if g.approved %}· <span class="ok">승인</span>{% elif g.approval_stale %}· <span class="warn">승인 기록은 이전 입력 것(무효)</span>{% elif g.approval %}· {{ g.approval.decision }}{% endif %}</h2>
|
||||
{% if g.report %}<p class="muted">결과 시각 {{ g.report_at or '-' }}{% if g.report.mode == 'batch' %} · 일괄 실행{% endif %}
|
||||
{% if g.older %}<b class="warn">이전 실행 결과 — 이번 일괄 실행에서 갱신되지 않았습니다</b>{% endif %}</p>{% endif %}
|
||||
{% if g.show_partial %}{% set pr = g.partial %}<div class="flash warn" id="partial-{{ g.id }}"><b>중단된 실행의 임시 결과</b> ({{ pr.at }}) — 검사 {{ pr.passed }} / {{ pr.total }} PASS,
|
||||
FAIL {{ pr.fails|length }}건{% if pr.fails %}: {{ pr.fails[:6]|join(' · ') }}{% if pr.fails|length > 6 %} 외 {{ pr.fails|length - 6 }}건{% endif %}{% endif %}.
|
||||
계획된 예외는 구분하지 않은 검사기 원본 결과이며 승인·보고서에는 쓰이지 않습니다.</div>{% endif %}
|
||||
|
||||
{% if g.state in ('대기', '실행 중') %}<p class="warn">{{ g.state }}: {{ g.job.log[-1] if g.job.log else '' }}</p>
|
||||
{% elif g.state == '중단됨' %}<p class="warn">중단됨: 이전 실행이 끝나지 않은 채 서버가 멈췄습니다. 다시 실행하세요.</p>
|
||||
{% elif g.state == '오류' %}<p class="fail">오류</p><pre>{{ g.job.error }}</pre>{% endif %}
|
||||
|
||||
{% if g.blockers %}<p>실행 조건 미충족: {% for b in g.blockers %}<span class="fail">{{ b }}</span>{% if not loop.last %}, {% endif %}{% endfor %}</p>
|
||||
{% else %}<form method="post" action="{{ url_for('gate_run', name=p.name, gate=g.id) }}"><button {% if running %}disabled{% endif %}>{{ g.id }} 실행</button></form>{% endif %}
|
||||
|
||||
{% if g.report %}{% set r = g.report %}
|
||||
<table>
|
||||
<tr><th>검사</th><td>{{ r.summary.passed }} / {{ r.summary.total }} PASS ({{ r.checker }})</td></tr>
|
||||
<tr><th>미계획 FAIL</th><td>{% if r.unplanned_fails %}<span class="fail">FAIL {{ r.unplanned_fails|length }}건</span><ul>{% for f in r.unplanned_fails %}<li>{{ f }}</li>{% endfor %}</ul>{% else %}<span class="ok">0건</span>{% endif %}</td></tr>
|
||||
<tr><th>계획 FAIL (승인된 예외)</th><td>{% if r.planned_fails %}<span class="warn">계획 FAIL {{ r.planned_fails|length }}건</span><ul>{% for f in r.planned_fails %}<li>{{ f.item }} — {{ f.reason }}</li>{% endfor %}</ul>{% else %}0건{% endif %}</td></tr>
|
||||
<tr><th>음성 시험</th><td>{% for k, v in r.negative.items() %}{{ '수평' if k == 'negH' else '수직' }} {{ v.move }} →
|
||||
{% if v.detected %}<span class="ok">검출</span> ({{ v.new_fails|join(', ') }}){% else %}<span class="fail">미검출</span>{% endif %}<br>{% endfor %}</td></tr>
|
||||
<tr><th>재로드</th><td>{% if r.reload.ok is none %}<span class="muted">생략</span> {{ r.reload.skipped }}{% elif r.reload.ok %}<span class="ok">일치</span> 생성 {{ r.reload.built }} / 다시 연 파일 {{ r.reload.reopened }}{% else %}<span class="fail">불일치</span> 생성 {{ r.reload.built }} / 다시 연 파일 {{ r.reload.reopened }}{% endif %}</td></tr>
|
||||
<tr><th>앞 게이트 객체 불변</th><td>{% if r.unchanged.ok is none %}<span class="muted">생략</span> {{ r.unchanged.skipped }}{% elif r.unchanged.ok %}<span class="ok">불변</span> {{ r.unchanged.compared }}개 비교{% if r.unchanged.against %} (기준 {{ r.unchanged.against }}){% endif %}{% else %}<span class="fail">변경</span> {{ r.unchanged.compared }}개 비교{% endif %}</td></tr>
|
||||
<tr><th>모델</th><td>{% if r.model %}<a href="{{ url_for('download', name=p.name, gate=g.id) }}">{{ p.name }}_{{ g.id }}.3dm 내려받기</a>{% else %}<span class="muted">일괄 실행 — 중간 모델 저장 안 함 (G5 모델에 포함)</span>{% endif %} · {{ r.secs }}초{% if r.mode == 'batch' %} (일괄 세션 {{ r.session_secs }}초){% endif %}</td></tr>
|
||||
</table>
|
||||
{% if not g.stale %}
|
||||
<form method="post" action="{{ url_for('gate_decide', name=p.name, gate=g.id) }}">
|
||||
판정자 <input type="text" name="by" required> 의견 <input type="text" name="note" size="40" placeholder="반려 시 필수">
|
||||
<button name="decision" value="승인" {% if r.verdict != 'PASS' %}disabled{% endif %}>승인</button>
|
||||
<button name="decision" value="반려">반려</button>
|
||||
</form>{% endif %}
|
||||
{% if g.approval %}<p class="muted">최근 판정: {{ g.approval.decision }} · {{ g.approval.by }} · {{ g.approval.at }}{% if g.approval.note %} · {{ g.approval.note }}{% endif %}</p>{% endif %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endblock %}
|
||||
Reference in new issue
Block a user