{% extends "base.html" %} {% block title %}게이트 · {{ p.name }}{% endblock %} {% block body %} {% if running %}{% endif %}

게이트 G1 → G5

게이트마다 G1부터 그 단계까지 새로 만들고, 저장한 파일을 다시 열어 검사합니다(재로드). PASS 조건: 계획 FAIL 외 FAIL 0 · 수평/수직 음성 시험 검출 · 재로드 객체 수 일치 · 앞 게이트 객체 불변. 다음 게이트는 앞 게이트가 승인되어야 실행할 수 있습니다.{% if running %} 실행 중 — 5초마다 새로 고칩니다.{% endif %}

{% if out_of_scope %}

이 교각의 범위 밖 게이트: {{ out_of_scope|join(', ') }} (실행·승인 대상 아님)

{% endif %}

일괄 승인 (필요하면 실행)

{% if batch %}

최근 일괄 실행: {{ batch.state }} · 판정자 {{ batch.by }} · {% if batch.started %}{{ batch.started }} 시작 · {% endif %}{{ batch.at }}{% if batch.state != '실행 중' %} 끝{% endif %}

{% if aborted %}{% endif %} {% endif %} {% if todo %}
판정자

최신 PASS 결과가 있는 게이트는 다시 실행하지 않고 바로 승인합니다. 결과가 없거나 입력이 바뀐 게이트는 실행한 뒤 PASS일 때만 승인합니다. FAIL·오류·실행 조건 미충족이면 그 게이트에서 멈추고 승인하지 않습니다. 승인 기록의 의견란에 '일괄 실행 자동 승인'이 남습니다. 결과는 아래 게이트별 표에서 확인하세요.

{% else %}

모든 게이트가 승인되어 있습니다.

{% endif %}

검토보고서 (초안)

작성자 MD 받기 · PDF 받기

게이트 결과·도면 표·승인 기록으로 자동 작성합니다. 승인되지 않은 게이트가 있으면 '미완료'로 표시됩니다. 판정 확정과 3~5장 서술은 담당자가 합니다.

{% for g in rows %}

{{ g.id }} {{ g.name }} — {% if g.report %}{% if g.stale %}입력 변경 · 재실행 필요{% elif g.report.verdict == 'PASS' %}PASS{% else %}FAIL{% endif %}{% else %}미실행{% endif %} {% if g.approved %}· 승인{% elif g.approval_stale %}· 승인 기록은 이전 입력 것(무효){% elif g.approval %}· {{ g.approval.decision }}{% endif %}

{% if g.report %}

결과 시각 {{ g.report_at or '-' }}{% if g.report.mode == 'batch' %} · 일괄 실행{% endif %} {% if g.older %}이전 실행 결과 — 이번 일괄 실행에서 갱신되지 않았습니다{% endif %}

{% endif %} {% if g.show_partial %}{% set pr = g.partial %}
중단된 실행의 임시 결과 ({{ 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 %}. 계획된 예외는 구분하지 않은 검사기 원본 결과이며 승인·보고서에는 쓰이지 않습니다.
{% endif %} {% if g.state in ('대기', '실행 중') %}

{{ g.state }}: {{ g.job.log[-1] if g.job.log else '' }}

{% elif g.state == '중단됨' %}

중단됨: 이전 실행이 끝나지 않은 채 서버가 멈췄습니다. 다시 실행하세요.

{% elif g.state == '오류' %}

오류

{{ g.job.error }}
{% endif %} {% if g.blockers %}

실행 조건 미충족: {% for b in g.blockers %}{{ b }}{% if not loop.last %}, {% endif %}{% endfor %}

{% else %}
{% endif %} {% if g.report %}{% set r = g.report %}
검사{{ r.summary.passed }} / {{ r.summary.total }} PASS ({{ r.checker }})
미계획 FAIL{% if r.unplanned_fails %}FAIL {{ r.unplanned_fails|length }}건
    {% for f in r.unplanned_fails %}
  • {{ f }}
  • {% endfor %}
{% else %}0건{% endif %}
계획 FAIL (승인된 예외){% if r.planned_fails %}계획 FAIL {{ r.planned_fails|length }}건
    {% for f in r.planned_fails %}
  • {{ f.item }} — {{ f.reason }}
  • {% endfor %}
{% else %}0건{% endif %}
음성 시험{% for k, v in r.negative.items() %}{{ '수평' if k == 'negH' else '수직' }} {{ v.move }} → {% if v.detected %}검출 ({{ v.new_fails|join(', ') }}){% else %}미검출{% endif %}
{% endfor %}
재로드{% if r.reload.ok is none %}생략 {{ r.reload.skipped }}{% elif r.reload.ok %}일치 생성 {{ r.reload.built }} / 다시 연 파일 {{ r.reload.reopened }}{% else %}불일치 생성 {{ r.reload.built }} / 다시 연 파일 {{ r.reload.reopened }}{% endif %}
앞 게이트 객체 불변{% if r.unchanged.ok is none %}생략 {{ r.unchanged.skipped }}{% elif r.unchanged.ok %}불변 {{ r.unchanged.compared }}개 비교{% if r.unchanged.against %} (기준 {{ r.unchanged.against }}){% endif %}{% else %}변경 {{ r.unchanged.compared }}개 비교{% endif %}
모델{% if r.model %}{{ p.name }}_{{ g.id }}.3dm 내려받기{% else %}일괄 실행 — 중간 모델 저장 안 함 (G5 모델에 포함){% endif %} · {{ r.secs }}초{% if r.mode == 'batch' %} (일괄 세션 {{ r.session_secs }}초){% endif %}
{% if not g.stale %}
판정자 의견
{% endif %} {% if g.approval %}

최근 판정: {{ g.approval.decision }} · {{ g.approval.by }} · {{ g.approval.at }}{% if g.approval.note %} · {{ g.approval.note }}{% endif %}

{% endif %} {% endif %} {% endfor %} {% endblock %}