- 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>
71 KiB
교각 모델링 앱 개선 기획서 — 「2. 입력 묶음 확인·확정」 개편
| 버전 | 수정일 | 수정자 | 주요 변경 내용 | 비고 |
|---|---|---|---|---|
| v0.1.00 | 2026-10-14 | 심영표 | 신규 작성 | 초안 [미확정] — D1~D6 결정 반영(7.2절) |
| v0.1.01 | 2026-10-15 | 심영표 | 7.2절 D3~D6을 권고안대로 결정 반영 | 사용자 지시 "권고안대로" |
| v0.1.02 | 2026-10-15 | 심영표 | 4.4절 템플릿 구분 기준 재정의(각도=값, 기초=말뚝 유무, 도면 먼저 추천) | 사용자 결정 3건(OPEN #30 ①②④) |
| v0.1.03 | 2026-10-16 | 심영표 | A단계(분류·표시) 구현 결과 6.1절 추가 | 사용자 "개편 구현 진행" 지시; B단계는 사용자 승인 후 |
| v0.1.04 | 2026-10-16 | 심영표 | B단계(앱 확인 엔진·근거표·일치 묶음 일괄 확정) 구현 결과 6.2절 추가, Prism 적용 시점 결정 반영 | 사용자 "B단계 착수" + "Prism은 B단계 새 화면부터, 기존 화면 교체는 D단계" |
| v0.1.05 | 2026-10-19 | 심영표 | 이전 방식 일괄 확정 제거 반영, C단계 1차(앵커 학습·따라가기, R1·R2·R5) 구현 결과 6.3절 추가 | 사용자 "이전방식 일괄 확정은 지금 제거하고, C단계 착수" |
| v0.1.06 | 2026-10-19 | 심영표 | C단계 2차 결과 6.4절 추가(표 값 교차 확인, 운곡교 P3·P4 실사용 확인, R3·R4 기하 앵커 시험 결과 = 미채택) | 사용자 "C단계 2차 착수, 운곡교 P3·P4에 앵커를 불러와 실제 후보 확인" |
| v0.1.07 | 2026-10-19 | 심영표 | D단계(전 화면 Prism 교체, 사용설명서 v0.2.12, 전체 회귀, 운곡교 P3·P4 A등급 반영) 결과 6.5절 추가 | 사용자 "D단계 착수, 운곡교 P3·P4 후보 반영" |
| v0.1.08 | 2026-10-20 | 심영표 | 운곡교 P3·P4 실사용 결과와 앱 개선점 6.6절 추가(OPEN #34·#35) | 사용자 "앱의 개선점을 알려줘" → "진행해줘" |
| v0.1.09 | 2026-10-20 | 심영표 | 개선 ②③④⑥ 구현 결과 6.7절 추가 | 사용자 "#34의 2·3·4·6번 순으로 진행" |
| v0.1.10 | 2026-10-20 | 심영표 | 개선 ①⑤ 구현 결과 6.8절 추가 | 사용자 "①(읽기 도구 통합), ⑤(일괄 실행 중단 표시)를 진행해줘" |
| v0.1.11 | 2026-10-20 | 심영표 | 검토 요약 확정(한 화면 검토 + 한 번 확정) 6.9절 추가 | 사용자 "확정 판정이 오래 걸리고 확인하기 어렵다 → 앱이 일괄 처리, 사용자는 일괄 검토" 제안 → 권고안 진행 |
| v0.1.12 | 2026-10-20 | 심영표 | 6.9절에 후속 변경 추가(도면에서 읽기에 표 값 통합, 검토 요약 모두 체크·주의 표시) | 사용자 "템플릿 원본 그대로도 모두 도면에서 읽기로 바꾸고, 미확정도 일괄 확정" |
| v0.1.13 | 2026-10-20 | 심영표 | 운곡교 P4 복구 결과와 앱 수정 계획 6.10절 추가 | 사용자 "앱을 수정계획을 정리해줘" (P4 결정 소실 사고 기반) |
| v0.1.14 | 2026-10-20 | 심영표 | W4(원본 잔존 검사 확대) 상세 계획 6.11절 추가, 실측 근거 스크립트 보관 | 사용자 "「원본 잔존 검사 확대」에 대한 계획을 세워줘" |
상태: 초안
[미확정]. 코드는 고치지 않았고, 이 문서는 계획만 담습니다. 수치는 2026-10-14 현재 앱(Code/교각모델링앱/)과 보호 템플릿 4종을 직접 센 값입니다.[추론]은 확인이 필요한 판단입니다.
1. 개요
1.1 목적
앱 교각 화면의 「2. 입력 묶음 확인·확정」을 다음 네 가지가 되도록 고칩니다.
- 도면 표 밖 치수(표 3종에 없는 치수·EL·위치)를 앱이 찾아 후보로 제시합니다.
- 묶음별 확인(도면 대조)을 앱이 수행하고 근거를 보여 줍니다. 확정은 사람이 합니다(결정 D1).
- 같은 템플릿 안에서 바꿔도 되는 값과 바꾸면 안 되는 값을 구분해 화면에 표시합니다.
- 지금의 문제점과 해결방법을 정리해 개발 순서를 정합니다.
1.2 범위
| 포함 | 제외 |
|---|---|
| 교각 화면 2절(묶음 표·일괄 확정)과 [표 후보값]·[도면 문자 검색] 화면 | 3절 게이트 실행·승인 흐름(그대로) |
값 확인 엔진(engine/)에 검사·탐색 추가, 확정 기록(confirm.json) 확장 |
새 교각 형식의 생성기·검사기(형식이 다르면 별도 Task) |
| 보호 템플릿의 묶음 분류 메타 | 구조계산·간섭 검사·측량좌표(기존 한계 그대로) |
1.3 용어
| 용어 | 뜻 |
|---|---|
| 묶음 | params.json·expected.json의 최상위 항목 하나(예: footing, G4) |
| 확인 | 묶음 값을 도면 원자료와 대조하는 일. 이 기획에서는 앱이 수행 |
| 확정 | "내가 이 값을 도면과 대조했다"는 사람의 검토 기록(해시로 값 변경 시 자동 무효) |
| 표 밖 치수 | 받침 ELEVATION TABLE·솔플레이트 TABLE·철근재료표 3종에 없는 값. 정면·측면·평면·단면의 치수 문자와 작도선·철근 점에서 읽음 |
| 앵커 | 원본 교각 판독에서 "이 값을 도면의 어디서(뷰·레이어·객체·상대 위치·문자 패턴) 읽었는가"를 적은 기록 |
2. 현황
2.1 현재 화면과 동작
- 화면: 교각 화면 「2. 입력 묶음 확인·확정」 = 묶음 표(파일·묶음·상태·확정자·확정 시각) + [필요한 묶음 일괄 확정] 버튼 (
web/templates/pier.html18~35행). - 동작: 사용자가 묶음을 열어 값을 도면과 눈으로 대조·수정하고 확정합니다. 일괄 확정은 미확정 필수 묶음에 확정자 이름·시각·해시를 그대로 찍습니다(
web/app.pyconfirm_all: 값 검사 없음). - 값을 고치면 해시가 달라져 '변경됨 · 재확정 필요'가 되고 승인된 게이트도 '재실행 필요'가 됩니다(이 부분은 잘 동작).
- 표 밖 치수: 도면 문자 검색과 [핸들 조회](객체 핸들의 좌표·길이·반지름)로 사람이 찾습니다. EL 문자는 목록만 보여 줍니다(
reader.el_list). 값 자동 반영은 없습니다. - 표 3종은 자동 인식해 [표 후보값]에서 현재 값과 비교합니다(
reader.proposals).
2.2 규모 (보호 템플릿 4종, 직접 집계)
| 템플릿 | 전체 묶음 | 참고(확정 불필요) | 확정 필요 | 확정 필요 묶음 합계 용량 | 철근 중심선 목록(손으로 못 고침)의 비중 |
|---|---|---|---|---|---|
| 운곡교P1형 | 30 | 7 | 23 | 32 KB | 0 % (철근이 params 규칙 값) |
| 산외교울산P1형 | 31 | 5 | 26 | 117 KB | 84 % (coping_rebar 98 KB) |
| Ramp-A교P1형 | 30 | 5 | 25 | 135 KB | 89 % (coping_rebar 121 KB) |
| 옥성교P1형 | 32 | 5 | 27 | 463 KB | 95 % (coping_rebar 301 KB + footing_rebar 142 KB) |
3. 문제점
| # | 문제 | 근거 | 영향 |
|---|---|---|---|
| P1 | 일괄 확정이 값을 검사하지 않음. 확정 = 도장 | confirm_all은 p.confirm()만 호출. 화면 문구는 "값을 도면·판독서와 대조하셨습니까?" 한 줄 |
확정 기록의 신뢰가 사람의 성실에만 의존. 일괄 버튼이 쉬워 검토가 생략되기 쉬움 |
| P2 | 템플릿 원본 값이 그대로 확정될 수 있음. 복사 직후 값은 원본 교각의 값 | 사용설명서 5.1 주의문. 묶음 표에 '원본 값 그대로'라는 표시 없음 | 새 도면 대조 없이 확정·승인하면 원본 교각 모델이 PASS로 나옴(가장 위험한 실수) |
| P3 | 근거가 안 보임. 묶음마다 "이 값이 도면 어디서 왔는지"가 없음 | 묶음 표에 출처 열 없음. _src 메모는 '확정 불필요(참고)'로 숨음 |
사람이 매번 판독서·도면을 따로 열어 대조 |
| P4 | 표 밖 치수는 전부 수작업. 판독 스크립트를 교각마다 새로 씀 | 새 형식 1개당 판독·등록 스크립트 약 10개(Code/옥성P1판독/ 등). 앱은 문자 검색·핸들 조회까지 |
확인 단계 병목. 오타·누락·잘못된 뷰 기준 위험 |
| P5 | 손으로 대조할 수 없는 묶음. 철근 중심선 목록이 용량의 84~95 % | 2.2절 | 사람이 '열어서 눈으로 확인'할 수 없으므로 확정이 형식적 |
| P6 | 같은 템플릿에서 바꿔도 되는 값과 안 되는 값이 구분되지 않음. 모두 같은 JSON 편집 화면 | 묶음 편집은 '형식(객체·목록·숫자) 유지'만 강제(set_section) |
형식을 정의하는 값(form, builders, 마크 구성)을 실수로 고쳐 생성기가 깨지거나, 값이 아닌 형식이 달라진 도면을 같은 템플릿으로 밀어 넣음 |
| P7 | params와 expected가 같은 후보에서 함께 채워짐. | 사용설명서 5.3 주의문(두 줄 함께 반영 시 검사 무의미) | 검사의 독립성(독립 기대값 원칙)이 사용 습관에 의존 |
| P8 | 확인 상태의 층이 하나. '미확정 / 확정 / 변경됨' 3값뿐 | store.section_state |
"앱이 확인했다", "도면에 근거 없음", "불일치 의심"을 표현할 방법이 없음 |
4. 해결 방향
4.1 화면 개편 — 「2. 입력 묶음 확인·확정」
원칙: 앱이 확인하고 근거를 보이며, 사람은 근거를 보고 확정합니다(결정 D1). 앱은 확정하지 않습니다.
현행 표(파일·묶음·상태·확정자·확정 시각)를 아래 열로 바꿉니다.
| 열 | 내용 |
|---|---|
| 묶음 | 파일·이름. 클릭하면 편집 화면 |
| 변수 등급 | V1 / V2 / V3 / F (4.4절). 색과 글자 병기 |
| 값 출처 | 표 / 표 밖 치수(도면 위치) / 판독 스크립트 / 템플릿 원본 그대로 / 사람 입력 |
| 앱 확인 | 일치 / 주의 / 불일치 / 근거 없음 / 해당 없음(참고) + 근거 보기 |
| 사람 확정 | 확정·미확정·변경됨, 확정자·시각 |
- 표 위에 한 줄 요약: "필요 27개 중 앱 확인 일치 19 · 주의 4 · 불일치 1 · 근거 없음 3 · 사람 확정 0".
- [일치 묶음 일괄 확정]: 앱 확인이 '일치'인 묶음만 대상. 누르기 전 근거표를 한 번 열어야 활성화(D4 결정 대기). '주의·불일치·근거 없음'은 묶음마다 사유를 적어 개별 확정합니다.
- '템플릿 원본 그대로'인 묶음(P2)은 앱 확인이 **'근거 없음(원본값)'**이며 일괄 확정에서 제외됩니다. 새 도면과 대조(표 후보값 반영·표 밖 치수 반영·사람 입력)해 값이 바뀌거나 근거가 붙어야 풀립니다. 새 도면 값이 우연히 원본과 같은 묶음은 '일치(원본과 동일, 근거 있음)'로 구분합니다.
4.2 도면 표 밖 치수 찾기 (결정 D2: 규칙 + 템플릿 앵커)
탐색 규칙 6종 (4개 교각 도면에서 판독 스크립트가 쓴 방법을 앱 규칙으로 일반화합니다)
| 규칙 | 찾는 것 | 방법 | 이미 있는 것 |
|---|---|---|---|
| R1 레벨 | 기초·기둥·코핑 EL | EL. 문자 + 인접 레벨선·치수선 연결 |
reader.el_list(목록만) |
| R2 치수 사슬 | 22@120=2.640, 100 | 2@100 | 72@125=9.000 |
문자 패턴 → 치수 사슬로 파싱, 합계가 전체 치수와 맞는지 검산 | store.chain(입력용 파서만) |
| R3 철근 점·선 | 철근 위치 목록 | 철근 레이어의 점 심볼·선의 좌표(뷰 기준) → 위치 목록, R2와 대조 | 없음(스크립트) |
| R4 콘크리트 외곽 | 코핑 정면 외곽 점 목록 | 콘크리트 레이어 선 → 중심선(y = 0) 단면 점열 | 없음(스크립트) |
| R5 뷰 기준 | 정면·측면·평면 각각의 기준점·좌표 변환(예: z = 도면 y − 309,179.8) | 뷰 제목 문자('정면도' 등)·축척·EL 문자로 기준 후보 | 없음(스크립트에 상수) |
| R6 표 수량 대조 | 재료표 N과 작도 점·선 개수 | R3 결과 개수 = 재료표 수량이면 근거 강화(옥성교: 스터럽 106 = 39 + 27 + 40) | reader.proposals 일부 |
앵커(템플릿 원본의 판독 위치 기억)
- 앵커 한 줄 =
{값 경로, 뷰, 도면 레이어, 객체 종류, 기준 대비 상대 위치 또는 문자 패턴, 변환 규칙}. 원본 교각의 판독 스크립트가 값을 읽을 때 같이 남기는 형식으로 정합니다(소급 추출 범위는 D6). - 새 도면에서 같은 레이어·뷰·상대 위치·문자 패턴을 따라가 후보를 만들고, 규칙 R1~R6의 검산 결과로 신뢰 등급을 붙입니다.
| 신뢰 등급 | 조건 | 화면 |
|---|---|---|
| A | 앵커 일치 + 검산(사슬 합계·재료표 수량) 일치 | 후보 + 근거, 반영 가능 |
| B | 앵커 일치, 검산 없음 또는 일부 불일치 | 후보 + 주의 |
| C | 규칙만 일치, 앵커 없음(형식이 다른 도면 등) | 후보 목록만, 반영 시 사유 필요 |
| 없음 | 어떤 규칙도 일치하지 않음 | '근거 없음'으로 표시, 억지 후보를 만들지 않음 |
- 출력 = [표 후보값]과 같은 비교 표에 '표 밖 치수' 구역을 추가: 현재 값 / 후보 / 도면 위치(D1·좌표·핸들) / 신뢰 등급 / [도면 보기](
dxftools.render와 같은 확대 이미지). 선택해 반영하는 것은 사람입니다(자동 반영 없음). - 한계: 규칙과 앵커는 4개 교각의 도면 틀(운곡교 P1·P2, 산외교 울산 P1, Ramp-A교 P1, 옥성교 P1)에서만 검증됩니다. 틀이 다르면 등급 C 또는 '없음'이 나오는 것이 정상 동작입니다.
4.3 입력 묶음 확인·확정을 앱이 수행하기 (결정 D1: 앱 확인 + 사람 확정)
앱 확인 8종 (묶음마다 해당하는 것만 수행, 결과는 일치·주의·불일치·근거 없음·해당 없음)
| # | 확인 | 방법 | 막는 문제 |
|---|---|---|---|
| C1 | 출처 있음 | 값마다 표·표 밖 치수·스크립트·사람 입력 중 어디서 왔는지 기록 여부 | P3 |
| C2 | 도면 재대조 | 표 후보값·표 밖 치수 후보와 현재 값 비교 | P4 |
| C3 | 템플릿 원본 잔존 | 현재 값이 템플릿 원본과 같은데 새 도면 근거가 없는 항목 수 | P2 |
| C4 | 내부 정합 | 치수 사슬 합 = 전체 치수, 본수 = 재료표 N, 직경 = 재료표, 위치 목록 길이 = 사슬 개수 | P5 |
| C5 | params ↔ expected 독립 | expected 값이 params에서 복사됐는지(두 값이 같고 근거도 같은 한 후보) | P7 |
| C6 | 범위·단위 | EL(m×1000)·mm 단위 상식 범위, 음수·0·순서 역전 | 오타 |
| C7 | 변수 등급 위반 | F(고정) 항목이 템플릿 원본과 달라졌는지, V3(생성 변수)가 생성 스크립트 없이 손으로 고쳐졌는지 | P6 |
| C8 | 재생성 일치(V3) | 판독 스크립트로 재생성한 목록의 해시와 현재 해시 | P5 |
상태와 기록 (기존 confirm.json 호환)
미확인 → 앱 확인(일치|주의|불일치|근거 없음) → 사람 확정(확정자·시각·근거 해시)
↑ 값이 바뀌면 둘 다 자동 무효(기존 해시 방식 유지)
confirm.json의 확정 기록은 그대로 두고, 앱 확인은autocheck.json(묶음 해시·결과·근거 목록·검사 버전·시각)에 별도로 둡니다. 앱 확인은 확정 기록을 만들지 않습니다.- 게이트 실행 조건은 지금처럼 '필요 묶음이 사람 확정됨'입니다(변경 없음). 앱 확인은 조건이 아니라 판단 자료입니다.
- 보고서 초안 8장(검증 방법)에 "앱 확인 결과 요약"을 추가해 사람 확정 근거가 남게 합니다.
앱이 스스로 확정하지 않는 이유 (결정 D1 근거)
- 이 앱의 검증 구조는 생성과 검사의 독립에 기대고 있습니다. 앱이 값을 만들고(후보 반영) 같은 앱이 확정하면 검토자가 없어집니다.
- 앱 확인 '일치'는 "후보를 만든 규칙과 값이 같다"이지 "도면이 맞다"가 아닙니다(규칙이 틀린 도면에서 거짓 일치 가능).
- 확정은 책임 기록입니다. 앱이 근거를 모아 주면 사람의 확정이 빨라지되 의미는 유지됩니다.
4.4 같은 템플릿에서 변수 가능과 불가능 구분
4단계 분류 (묶음마다, 필요하면 필드마다 표시)
| 등급 | 뜻 | 예 | 앱에서의 처리 |
|---|---|---|---|
| V1 값 변수 | 같은 형식에서 도면마다 달라지는 숫자·문자 값 | 기초·버림 크기, 기둥 지름·높이, 코핑 치수·EL, 말뚝 개수·간격·길이, 받침 표 값, 직경, fck | 화면 편집 가능, 앱 확인 대상 |
| V2 목록 변수 | 같은 형식에서 도면마다 달라지는 위치·점 목록 | 철근 위치 목록, 치수 사슬, 코핑 정면 외곽 점 | 치수 사슬 입력 가능, 앱 확인 대상(C4) |
| V3 생성 변수 | 값이 도면마다 다르지만 판독 스크립트가 만든 큰 목록 | coping_rebar.bars(98~301 KB), footing_rebar.bars(옥성) |
화면 직접 편집 차단, 판독 스크립트 재실행 안내, 재생성 일치(C8) |
| F 고정 | 형식을 정의하는 값. 바꾸면 같은 템플릿이 아님 | scope, builders, checkers, 각 묶음의 form·shape·kind, 철근 마크 체계, 게이트 검사기 이름 |
편집 시 경고(D3: 차단 또는 경고), 바꾸면 '형식 변경 — 새 템플릿 필요' 표시 |
같은 템플릿에서 바꿔도 되는가 (예시, [추론] 항목은 시험 후 확정)
| 변경 | 판정 | 이유 |
|---|---|---|
| 기초 크기·두께, 기둥 지름·높이, 말뚝 개수·간격·길이 | 가능(V1) | 생성기가 값으로 받음 |
| 받침 표 값(EL.'X', h1~h3, A·B, S, L·T) | 가능(V1) | 표 후보값으로 이미 지원 |
| 철근 간격·개수·직경(재료표) | 가능(V1·V2) | 치수 사슬 입력 |
| 코핑 상면 단 수·받침 개수 변경 | 조건부 [추론] |
검사기 기대값·음성 시험 대상이 개수에 묶여 있음(OPEN #19 A7: 받침 10개 전제) |
| 코핑 철근 중심선 목록 | 스크립트 필요(V3) | 사람이 좌표 수만 개를 고칠 수 없음 |
| 평면 skew(사각)·받침 회전·기초 회전 등 각도 | 가능(V1) [2026-10-15 결정] |
각도는 템플릿이 아닌 값. 옥성교(skew 18°)·새재1교(0°) 검사기는 하나로 통합(선행: 두 교각 시험 재실행) |
| 말뚝 개수·간격·배치 | 가능(V1·V2) | 말뚝 유무만 형식 |
| 하면 곡선 ↔ 직선 경사, 기초의 말뚝 유무, 기둥 단면 형식, 대좌 공유 여부 | 불가(F) | 생성기·검사기가 다름 → 다른 템플릿 |
| 철근 형상 종류(U형 → 폐합 등), 마크 체계 | 불가(F) | 생성기·expected 스키마가 정함 |
게이트 범위(scope)·생성기·검사기 이름 |
불가(F) | 형식 정의 |
새 도면이 이 템플릿으로 가능한지 판별하는 체크리스트 (교각 만들기 화면에 질문으로 제공, 예/아니오)
- 기초 형식(말뚝 유무: 기초판+말뚝 / 기초판만 / 기초판 없는 단일 말뚝)이 같은가
- 기둥 단면 형식(원형 / 기타)이 같은가
- 코핑 하면 형상(곡선 / 직선 경사 / 나팔형)이 같은가. 평면의 사각·직각과 각도는 문항이 아니라 값 확인(skew·회전 각도 입력)으로 옮긴다
[2026-10-15 결정] - 받침 배치 구조(받침마다 대좌 / 앞뒤 공유 대좌)가 같은가
- 철근 형상 종류가 재료표 형식 열과 같은가
- 철근 생성 방식(규칙 값 / 철근별 중심선)이 같은가
하나라도 '아니오'면 "같은 템플릿으로 만들 수 없음 — 가장 가까운 템플릿 + 생성기·검사기 추가 필요"로 안내하고, 억지로 진행하면 묶음 표에 '형식 불일치 경고'를 상시 표시합니다.
도면 먼저 추천 (2026-10-15 결정): 교각 만들기 화면의 순서를 "도면 올리기 → 추천 순위(근거) → 템플릿 선택 → 6문항 확인"으로 바꾼다. 도면의 단서(말뚝·PILE 문자, Ø, 재료표 형식 열, 받침 표 행 수, 정면도 R 문자)로 문항 값을 추정해 미리 채우고 템플릿을 일치 문항 수로 순위 매긴다. 사람이 바꿀 수 있고, 맞는 템플릿이 없으면 "판단 불가"로 표시한다. R·각도 문자는 정면도·평면도 영역으로 한정해 철근 굽힘 반경 r 등과 구분한다. 논의 근거: context-migration/템플릿구분기준과도면기반추천_논의.md.
구현: 보호 템플릿에 variability.json(묶음·필드 경로 → 등급)을 추가합니다. 편집 화면과 앱 확인 C7이 이 파일을 읽습니다. 4개 템플릿 분류는 부록 A.
5. 문제점과 해결방법
| 문제 | 해결방법 | 기대 효과 | 난이도 | 우선순위 |
|---|---|---|---|---|
| P1 일괄 확정이 검사 안 함 | 앱 확인(C1~C8) + '일치 묶음만 일괄 확정' + 근거표 열람 조건(D4) | 일괄 확정이 도장이 아닌 근거 기반 확정이 됨 | 중 | 1 |
| P2 템플릿 원본값 확정 위험 | C3 '템플릿 원본 잔존' + 일괄 확정 제외 + 묶음 표에 '원본값' 표시 | 원본 모델이 PASS로 나오는 사고 방지 | 하 | 1 |
| P3 근거가 안 보임 | 값 출처 열 + 근거 보기(도면 위치·표 행·스크립트·사슬 검산) | 판독서를 따로 열 필요 감소 | 중 | 2 |
| P4 표 밖 치수 수작업 | 규칙 R1~R6 + 앵커 + 신뢰 등급 후보 표(결정 D2) | 새 도면 확인 시간 단축, 오타·누락 감소 | 상 | 3 |
| P5 손으로 대조 불가 | V3 분류 + C4·C8(내부 정합·재생성 일치) + 편집 차단 | 확정이 '요약된 검산 결과'에 근거 | 중 | 2 |
| P6 변수·고정 미구분 | 4단계 분류 + variability.json + 판별 체크리스트 + 형식 불일치 경고 |
형식이 다른 도면을 같은 템플릿에 밀어 넣는 실수 방지 | 중 | 2 |
| P7 params·expected 동시 채움 | C5(독립성) + 후보 반영 화면에서 params 줄 별도 선택 안내 강화 | 검사 독립성 유지 | 하 | 2 |
| P8 확인 상태 1층 | autocheck.json 별도 층(앱 확인), 확정 기록은 불변 |
"앱이 확인", "근거 없음", "불일치 의심" 표현 가능 | 하 | 1 |
6. 구현 계획
| 단계 | 내용 | 주요 변경 | 시험·판정 |
|---|---|---|---|
| A 분류·표시 | variability.json 작성(4템플릿), 묶음 표에 변수 등급·값 출처 열, '템플릿 원본 그대로' 표시(C3) |
web/templates/pier.html, web/store.py, data/_템플릿/*/variability.json |
4템플릿에서 분류 100 %, 새 교각(템플릿 복사 직후) 전 묶음이 '원본값' 표시 |
| B 앱 확인 엔진 | C1~C8 구현, autocheck.json, 근거표 화면, '일치 묶음 일괄 확정'(D4), 보고서 8장 요약 |
engine/verify.py(신설), web/app.py, 템플릿, engine/report.py |
5개 교각 자기 데이터 전 묶음 '일치'(거짓 불일치 0), 값을 일부러 바꾸면 '불일치'(거짓 일치 0, 음성 시험), 기존 회귀 9종 FAIL 0 |
| C 표 밖 치수 탐색 | 규칙 R1~R6, 앵커 형식·추출 도구, 후보 표 구역, 도면 보기 | engine/reader.py, engine/anchors.py(신설), 판독 스크립트 앵커 기록 |
4개 도면에서 원본 params 값 재현율(등급 A·B 비율)·거짓 후보 0건 집계, 틀이 다른 도면에서 '없음' 정상 표시 |
| D 통합·문서 | 일괄 확정 문구·흐름, 사용설명서 개정(5.3·5.4·9장), 회귀 전체 | 사용설명서 v0.2.08, 시험 tools/test_confirm_check.py |
웹 E2E 포함 전체 회귀 PASS |
- 각 단계는 정지·승인(사용자) 후 진행합니다(HITL).
6.1 구현 현황 (2026-10-16)
A단계 분류·표시 — 구현 완료, 사용자 승인 대기
| 항목 | 구현 |
|---|---|
| 변수 등급 분류 | engine/variability.py(규칙 표 + 묶음 내용으로 V3 판정: 철근 bars 목록 100개 이상), 보호 템플릿 6종에 variability.json(초안) 작성 — tools/make_variability.py. 템플릿 저장·교각 생성 때 자동 작성·복사 |
| 묶음 표 | 「변수 등급」「값 출처」 열 추가. 값 출처는 등급 파일의 일반 출처(표 / 표 밖 치수 / 판독 스크립트 / 사람 입력 / 템플릿 고정) |
| 템플릿 원본 그대로(C3) | 교각 생성 시 묶음별 해시를 pier.json의 origin에 기록 → 값이 그대로면 표에 '▲ 템플릿 원본 그대로'. 필수 묶음 중 원본인 것은 표 위에 목록 경고 |
| F 항목 편집(D3) | F 묶음 또는 묶음 안의 고정 필드(column.shape, coping.form 등)를 바꾸면 사유 입력 필수, edit_log.json에 기록. 차단하지 않음 |
| V3 편집 | 화면에서 저장 거부, 판독 스크립트 재실행 안내 |
| 시험 | tools/test_variability.py 전부 PASS(분류 100 %, 부록 A 일치, 신규 교각 26/26 원본 표시·수정 시 해제, F 사유·V3 차단, 기록 없는 기존 교각은 주장하지 않음) |
기획과 다르게 한 점·한계
- 「값 출처」는 일반 출처입니다. 묶음 값이 실제로 도면의 어디서 왔는지(C1·C2 근거)는 B·C단계 몫입니다.
- 기존 교각(2026-10-16 이전 생성)은 템플릿 복사 기록이 없어 '원본 그대로' 여부를 판단하지 않습니다(표시도 안 함). 새로 만드는 교각부터 적용됩니다.
variability.json은 묶음 수준 초안입니다. 필드 수준 분류와 담당자 확정(R6)은 남아 있습니다.- 시안의 Prism 시각 디자인(UX1~UX3)은 아직 앱에 적용하지 않았습니다(기존 화면 스타일 유지). 적용 시점은 사용자 결정 대기.
- 「앱 확인」 열·요약 띠·일괄 확정 근거표는 B단계입니다.
6.2 B단계 구현 현황 (2026-10-16)
앱 확인 엔진 engine/verify.py — 구현 완료, 사용자 승인 대기
| 항목 | 구현 |
|---|---|
| 앱 확인 C1~C8 | C1 출처 기록, C2 도면 재대조(ELEVATION·솔플레이트·재료표 후보 vs 현재 값), C3 템플릿 원본 잔존, C4 내부 정합(철근 수량 vs 재료표 수량; 계획 FAIL은 '주의'), C5 params/expected 독립, C6 범위·단위, C7 변수 등급 위반(F 항목), C8 재생성(연결된 스크립트 없음 → 해당 없음) |
| 상태 판정 | 불일치(검사 하나라도 실패) > 근거 없음(템플릿 원본 그대로, 독립 근거 없음) > 일치(표 대조 일치) / 주의(수량만 확인, 계획된 예외 등) / 해당 없음(참고·사람 결정 기록). F 묶음은 템플릿 원본(기록 없는 기존 교각은 보호 템플릿들)과 같으면 일치 |
| 저장 | autocheck.json(묶음 해시·결과·근거 목록·검사 버전) — confirm.json과 별도, 앱은 확정 기록을 만들지 않음. 값·도면·검사 버전이 바뀌면 자동 재실행(약 1초) |
| 화면(Prism) | 묶음 표 위 요약 띠(필요 N개 중 일치·주의·불일치·근거 없음·해당 없음·사람 확정), 「앱 확인」 열 + 근거 한 줄, 근거 보기(8종 검사별 결과·비교 내용·도면 위치), 일치 묶음 일괄 확정(근거표를 끝까지 내려야 활성, 대상 목록 해시 표식, 이름 필수), 앱 확인이 일치가 아닌 묶음은 개별 확정 시 사유 필수(확정 기록에 사유·당시 앱 확인 상태 저장) |
| 보고서 | 8장에 「8.1 입력 묶음 앱 확인 결과 요약」(묶음별 앱 확인·근거·사람 확정·사유) |
| Prism | web/static/prism.css(시안 pier.css에서 .prism 범위로 생성, tools/make_prism_css.py)를 새 화면(요약 띠·표·근거 보기·일괄 확정)에만 적용. 기존 화면 교체는 D단계 |
실제 교각 6종 결과 (tools/report_autocheck.py, 필요 묶음 기준)
| 교각 | 일치 | 주의 | 불일치 | 근거 없음 | 해당 없음 |
|---|---|---|---|---|---|
| Ramp-A교P1 | 11 | 2 | 0 | 9 | 3 |
| 산외교울산P1 | 12 | 4 | 0 | 7 | 3 |
| 산외교울산P2 | 12 | 4 | 0 | 8 | 3 |
| 새재1교P1 | 9 | 4 | 0 | 10 | 3 |
| 옥성교P1 | 9 | 4 | 0 | 11 | 3 |
| 운곡교P1 | 9 | 0 | 0 | 11 | 3 |
| (참고) 운곡교P3·P4 | 0~1 | 0~1 | 8 | 11 | 3 |
- 거짓 불일치 0: 모델링된 교각의 자기 데이터에서 불일치 0건. 운곡교 P3·P4(P1 값을 복사만 한 교각)는 표 대조에서 불일치 8건으로 정확히 잡힙니다.
- 거짓 일치 0(시험): 받침 h1 +5 → 불일치, expected 값 +1 → 불일치, 코핑 철근 1본 삭제 → 불일치, 두께 −5 → 불일치. 수량만 확인한 철근 목록은 '일치'가 아니라 '주의'.
- 근거 없음이 많은 이유: 기초·기둥·코핑 치수, 철근 위치·좌표, EL은 표 밖 치수라 앱이 아직 대조하지 못합니다(C단계). 숨기지 않고 '근거 없음'으로 표시합니다.
기획과 다르게 한 점·한계 (B단계)
- 기획의 수용 기준 "5개 교각 자기 데이터 전 묶음 '일치'"는 달성하지 못함 — 표 밖 치수 묶음은 C단계 전에는 일치가 될 수 없고 '근거 없음'입니다(거짓 일치를 만들지 않기 위해). 거짓 불일치 0·거짓 일치 0은 달성.
- C8(재생성 일치)은 앱에 생성 스크립트가 연결되어 있지 않아 '해당 없음'입니다.
이전 방식 일괄 확정은 접힌 항목으로 유지→ 2026-10-19 제거(사용자 결정).confirm_all경로와 화면 항목을 없앴고, 묶음은 [일치 묶음 일괄 확정] 또는 근거 보기에서 하나씩(일치가 아니면 사유 필수) 확정합니다. 이 경로를 쓰던 시험 9종은tools/testlib.confirm_required(묶음마다 사유를 붙여 개별 확정)로 바꿨습니다. P1 '확정 = 도장' 문제 해소.- 개별 확정(
section/.../confirm)은 앱 확인이 일치가 아니면 사유가 서버에서 강제됩니다. 이에 맞춰 시험 4곳이 사유를 넣도록 바뀌었습니다. - 기존 교각의 C3(템플릿 원본)은 판단하지 않고, F 묶음만 보호 템플릿과 비교합니다.
- 육안 확인: 임시 서버+헤드리스 Edge로 요약 띠·표·근거 보기·일괄 확정 화면을 캡처해 확인했습니다(
검증/ui_check_shots/).
6.3 C단계 1차 구현 현황 (2026-10-19)
표 밖 치수 탐색: 앵커 학습·따라가기 — 구현 완료, 사용자 승인 대기 (R1 레벨·R2 치수 사슬·R5 뷰 기준 구현, R3·R4 미구현)
| 항목 | 구현 |
|---|---|
앵커 학습 engine/anchors.py |
모델링된 교각의 숫자 필드(V1·V2 묶음, 1 m 이상)마다, 값과 같은 도면 치수·EL 문자(레이어·도면·좌표)를 기록. 같은 값이 1~6곳에서 나올 때만 앵커. 같은 파일 안에서 다른 종류 필드가 같은 값을 가지면(예: 두께와 지름 2500) '공유'로 표시해 A등급에서 뺌 |
| 따라가기(R5) | 새 도면과 앵커 도면에 공통인 문자(제목·라벨)로 뷰별 이동량을 구하고(가까운 5개 중앙값), 예측 위치 반경 1,200 mm 안에서 같은 레이어·같은 종류의 문자를 후보로 취함. 도면 틀 일치율(공통 문자 비율)이 70 % 미만이면 모든 후보를 C로 낮춤 |
| 신뢰 등급 | A = 2곳 이상 따라가 모두 같고 이동 편차 작음 / B = 2곳 이상 일치 또는 1곳 / C = 서로 다름·틀이 다른 도면. 후보가 없으면 '없음'(억지 후보를 만들지 않음) |
| R1 레벨 | 'EL. 38.916' 형식 문자를 앵커 종류 EL로 처리(z 계열 필드) |
| R2 치수 사슬 | n@간격=합계 문자를 파싱해 개수 × 간격 = 합계 검산. 맞지 않으면 묶음 표 위 경고와 후보 화면 목록(도면 보기 링크) |
| 저장 | 보호 템플릿 6종에 anchors.json(tools/make_anchors.py, 앵커 도면은 각 템플릿의 원본 교각). 교각 생성 시 복사, 앵커 없는 교각은 후보 화면에서 템플릿을 골라 불러옴. 앵커가 자기 도면에서 나왔으면(sources 해시 일치) 근거로 쓰지 않음 |
| 화면(Prism) | [표 후보값]에 「표 밖 치수 후보」 구역: 요약 띠(후보·다름·A·B·C 수, 틀 일치율), 표(반영·대상·현재·후보·등급·근거 n곳 중 m곳·도면 위치·도면 보기), 반영 사유(C 필수). 도면 보기 = 해당 위치 확대 PNG(engine/render.py) |
| 반영 규칙 | 같은 도면 문자에서 나온 후보를 params와 expected에 함께(한 번에 또는 따로) 반영 불가(P7), C등급은 사유 필수, 이미 같은 값은 반영 안 함, 반영·이전 값·등급·위치를 anchor_log.json에 기록, 바뀐 묶음은 재확정. 앱이 스스로 반영하지 않음 |
| 앱 확인 연동 | 새 검사 C2b 표 밖 치수 재대조: A 후보가 현재 값과 다르면 불일치, B가 다르면 주의, A가 같고 앵커 필드의 60 % 이상 대조되면 일치(강한 근거), 일부만이면 주의. 자기 도면 앵커는 제외 |
검증 결과 (tools/test_anchors.py, 실제 교각 9종 도면)
| 항목 | 결과 |
|---|---|
| 같은 도면 틀(울산 P1↔P2, 운곡교 P1↔P2) A등급 | 45건 중 틀린 후보 0건, 값이 바뀐 필드를 A로 정확히 복원한 것 13건 |
| 같은 도면 틀 B등급 | 451건 중 388건 일치(86 %), 틀린 후보 약 14 % — 경고로 표시 |
| 같은 도면 틀 C등급 | 48건 중 12건 일치 — 목록만, 반영 시 사유 필요 |
| 다른 도면 틀(36쌍) | A·B 후보 0건(틀 일치율 < 70 % → 전부 C) |
| R2 사슬 검산 | 9개 도면 중 운곡교 P4 도면의 사슬 2건이 불일치(62@125=7.250은 계산 7,750, 29@250=7.750은 계산 7,250 — 합계가 서로 바뀐 것으로 보임). 나머지 8개 도면은 0건 |
| 새 교각 시험 | 템플릿 운곡교P1형 + 운곡교 P2 도면: 후보 146건, A 11건(다른 값 7건 — 모두 운곡교 P2 모델링 값과 일치), 후보가 다른 묶음 6개가 앱 확인에서 불일치 |
| 시험 중 사고 | 처음 시험이 store를 환경변수 설정 전에 불러와 실제 data/에 시험 교각 2개를 만들었음 → 즉시 삭제, 시험은 PIERAPP_DATA 설정 뒤에 불러오도록 수정하고 data/를 건드리지 않는지 단언 추가 |
기획과 다르게 한 점·한계 (C단계 1차)
- R3(철근 점·선)·R4(콘크리트 외곽 점열)는 미구현. 철근 위치 목록·코핑 외곽 점열은 앵커로 읽을 수 없어 여전히 '근거 없음'입니다. 스칼라 치수·EL 문자로 읽히는 필드만 후보가 됩니다.
- 수용 기준 "거짓 후보 0건"은 A등급에서만 달성(같은 틀 45건 중 0건). B등급은 약 14 %가 틀립니다(단, B는 경고 표시이고 앱 확인에서도 주의까지만 반영).
- 앵커는 단일 숫자 문자와 값이 같은 필드만 학습합니다. 계산해서 얻는 값(예: 사슬 합, EL 차)은 앵커가 없습니다. 1 m 미만 값은 대상이 아닙니다.
- D6(소급 추출: 옥성교·Ramp-A교부터)에 따라 만들었으나, 학습이 자동이라 보호 템플릿 6종 모두에 앵커를 만들었습니다.
- 같은 도면 틀이어야 작동합니다. 틀이 다른 도면(다른 설계 회사 도면 등)은 후보가 C등급 이하로 떨어지는 것이 정상 동작입니다.
- 기존 교각 9종은 앵커가 없어 후보 화면에서 템플릿을 골라 불러와야 합니다(자동 선택 안 함).
- 육안 확인: 임시 서버+헤드리스 Edge로 후보 화면을 캡처해 확인(
검증/ui_check_shots/candidates.png).
6.4 C단계 2차 결과 (2026-10-19)
① 운곡교 P3·P4에 운곡교P1형 앵커를 불러와 실제 후보 확인 (tools/report_anchor_pier.py, 실제 data/운곡교P3·P4에 anchors.json 복사 — 값은 하나도 반영하지 않음)
- 두 교각의 현재 값은
운곡교p2를 복사한 것이고(pier.json의 template 항목), 도면은 P3·P4 자신의 것입니다. 도면 틀 일치율 0.77(≥ 0.70, 같은 틀로 인정). - 후보 146건 중 현재 값과 다른 것 91건(P3) · 102건(P4).
| 단계 | P3 | P4 |
|---|---|---|
| 표 교차 확인 전 | A 11 · B 116 · C 19 | A 9 · B 118 · C 19 |
| 표 교차 확인 후 | A 56(표 값과도 일치 47) · B 65 · C 25(표 값과 달라 낮춘 것 18) | A 54(47) · B 67 · C 25(18) |
- 표 값이 있는 필드만 비교하면 B등급은 34건 중 23건(68 %)만 맞았습니다. 틀린 것은 대부분 같은 값을 공유하는 마크의 재료표 길이(P3·P4·P5의 L이 서로 같아 후보가 서로 바뀜)였고, 표 교차 확인으로 모두 C로 내려갑니다.
- 화면 확인: 후보 구역 최상단에 표 값과도 일치하는 A등급이 나열되고(받침 EL, 철근 길이·수량, 기초 EL, 기둥 높이), 앱 확인에서 불일치가 P3 10개·P4 11개로 표시됩니다(표 후보 8개 묶음 + 앵커 A 후보 묶음)(
검증/ui_check_shots/candidates_P3.png,pier_P3.png). - 이 후보는 아직 반영하지 않았습니다. 반영 여부는 사용자가 [표 후보값] 화면에서 결정합니다(P3·P4는 모델링 전이고, 반영 후에도 앵커가 못 읽는 철근 위치 목록·코핑 외곽 등은 직접 판독해야 합니다).
② 표 값 교차 확인 구현 (engine/anchors.cross_check, 화면에 "표 값과도 일치" / "표 값 X와 다름 — 표를 따르세요")
- 표(ELEVATION·솔플레이트·재료표) 값이 있는 필드: 앵커 후보가 표와 같으면 A, 다르면 표 값을 병기하고 C. 표 값이 없는 필드는 그대로.
- 같은 도면 틀 4쌍 시험: A등급 45건 → 165건, 전부 맞음(128건이 표로 확인, 47건은 표와 달라 C로 하향).
③ R3·R4(기하 앵커) 시험 결과 — 채택하지 않음
- 시도: 앵커가 없는 숫자 필드(≥ 1 m)에 대해 콘크리트·철근·중심선 레이어의 선분 길이가 같은 값인지 찾아, 새 도면에서 같은 위치·방향의 선분 길이를 후보로 삼음(울산 P1↔P2, 운곡교 P1↔P2).
- 결과: A등급 15
18건/쌍이 값이 바뀐 필드를 하나도 복원하지 못했고(바뀐 값 복원 0건), 같은 값이 우연히 맞은 것과 철근 위치 목록(좌표인데 길이로 잘못 대응)의 오답 A가 27건 섞임. 위치 목록·외곽 점열은 길이가 아니라 뷰 기준점 대비 좌표이므로 뷰 기준점(R5)을 도면 틀마다 확정해야 하는데, 이는 현재 구조(문자 기반 이동량)로는 신뢰할 수 있게 구할 수 없었습니다. - 결론: 철근 점·선(R3)과 콘크리트 외곽 점열(R4)은 **여전히 '근거 없음'**으로 두고 판독 스크립트(사람)로 읽습니다. 억지 후보를 만들지 않는 방침 유지. 시도 코드는 보관하지 않고 결과만 기록(프로토타입 삭제).
④ 화면 편의: A등급 중 현재 값과 다른 후보를 expected만 / params만 한 번에 선택(두 파일 동시 선택은 P7 때문에 제공하지 않음).
한계 (C단계 2차)
- 표 교차 확인은 표가 있는 필드만 개선합니다. 표 밖 필드의 B등급 정확도(약 86 %)는 그대로입니다.
- R3·R4 미구현 상태 유지 — 철근 위치·코핑 외곽 묶음은 앱 확인에서 계속 '근거 없음'이 됩니다.
- P3·P4의 후보를 반영하지 않은 상태라 두 교각의 앱 확인은 불일치 10~11개 그대로입니다(반영 후 다시 확인).
- 확정·게이트 승인은 어느 단계에서도 앱이 대신하지 않습니다. 시험은 별도 시험 폴더에서만 확정 흐름을 실행합니다(실제 교각 데이터 보호: 웹 일괄 실행이 Ramp-A·울산·옥성 게이트 보고서를 '재로드 안 함' 상태로 덮어쓴 일이 있음, 원인(시험 또는 앱 사용) 미확인, OPEN #25).
- 수용 기준(착수 전 확정): ① 모든 필수 묶음에 앱 확인 상태가 있다 ② '근거 없음'을 숨기지 않는다 ③ 거짓 일치 0·거짓 불일치 0(4개 도면 기준) ④ 앱이 확정 기록을 만들지 않는다 ⑤ 기존 시험 FAIL 0.
6.5 D단계 결과 (2026-10-19)
① 전 화면 Prism 교체: web/templates/base.html을 Prism 틀(위쪽 띠·본문)로 바꾸고 web/static/prism-app.css를 추가해, 옛 화면의 표·버튼·입력칸·안내 문구가 Prism 토큰(색·간격·Pretendard)을 따르게 했습니다(템플릿별 개별 수정 없이 공통 틀로 교체). 상태 표시는 색과 함께 글자·기호를 씁니다. 형식 불일치 경고는 계속 닫을 수 없습니다. 어두운 테마는 시험하지 않았습니다.
② 사용설명서 v0.2.12: 앱 확인·근거 보기·일치 묶음 일괄 확정·변수 등급·표 밖 치수 후보·도면 먼저 추천·6번째 템플릿을 반영하고, 이전 방식 일괄 확정 설명을 삭제했습니다.
③ 운곡교 P3·P4 후보 반영(A등급, 파일 하나씩): tools/apply_anchor_a.py로 앱의 후보 반영 경로를 거쳐 expected 쪽 A등급 후보를 반영했습니다(P3 29필드, P4 34필드, 반영 전 params·expected·confirm.json은 backup/before_anchor_A_*에 보관, 기록은 anchor_log.json). params 쪽 A등급 후보는 같은 도면 문자를 expected에 이미 썼기 때문에 P7 규칙으로 막혀 반영하지 못했습니다. 그 결과 묶음 단위 앱 확인 불일치는 P3 10·P4 11로 그대로이고, 필드 단위 expected 차이 줄은 69→52(P3), 75→63(P4)로 줄었습니다. 남은 불일치는 A등급 후보가 아닌 값(표 후보·params 독립 판독이 필요한 값)입니다.
④ 회귀: fast 15/15 PASS, Rhino 그룹 결과는 OPEN #26에 기록합니다.
남은 결정: 표 후보(expected 쪽) 검토 후 반영 여부, params 독립 판독, 운곡교 P4 도면 판(OPEN #33).
6.6 운곡교 P3·P4 실사용 결과와 앱 개선점 (2026-10-20)
결과 요약
| 교각 | 입력 | 게이트 결과 | 검사 | 계획된 FAIL | 계획 외 FAIL |
|---|---|---|---|---|---|
| 운곡교 P3 | 도면에서 읽은 값으로 params·expected 갱신(77곳 + 표 후보 105건 + 2차 48곳) | G1~G5 모두 PASS·승인 | 578/585 | 7 (B12, C9~C13 원래 길이 5건, C13 규칙) | 0 |
| 운곡교 P4 | apply_pier_read.py 로 144곳 + 표 후보 118건 |
G1~G5 모두 PASS·승인 | 577/585 | 8 (B11, B12, C9~C13 원래 길이 5건, C13 규칙) | 0 |
- 첫 실행 → 최종 실행의 계획 외 FAIL: P3 G1 34·G2 7·G3 5·G4 28 → 0, P4 G1 18·G2 10·G3 22·G5 10(허위 G4 PASS) → 0.
- 새 도구:
tools/verify_pier_geometry.py(도면 값 55항목을 params 와 비교; P1·P3 55/55 로 재현 확인),tools/apply_pier_read.py(읽은 값을 params·expected 에 반영; P1·P3--dry로 재현 확인),tools/infer_footing_rebar.py(기초 철근 층 규칙; P1 재현),tools/extract_coping_outline.py. - 읽을 수 있는 값: 표 3종(받침·솔플레이트·재료표), 치수 글자, 코핑 외곽·철근 단·C15·C16, 받침 위치·회전, 기초·말뚝·기둥, 기초 철근 층(규칙 + 재료표 개수 일치), 기둥 철근(후프·결속). 읽을 수 없거나 가정: 스터럽 좌측 윗면, c14 좌측 규칙, 결속철근 끝 높이, 설계 의도.
앱 개선점 (OPEN #34, 효과 큰 순)
| # | 개선 | 근거(실제 사례) |
|---|---|---|
| 1 | 도면 읽기 도구를 후보 화면에 통합, 템플릿 재현 검증 포함 | P3 수작업 77곳, P4 144곳 |
| 2 | params↔expected 일관성 검사(Rhino 실행 전) | 게이트 1회 약 150초, P3 실패의 대부분이 옛 값 혼재 |
| 3 | 필드 단위 '템플릿 원본 그대로 남음' 검사 | P3: 앱 확인 불일치 0인데 게이트 40여 건 실패 |
| 4 | 표 칸에서 학습한 앵커의 거짓 후보 제거 | P3·P4: 재료표 S1 길이 칸 '3.800' 을 G3 사슬 끝으로 오인 |
| 5 | 일괄 실행 중단 시 중간 결과·이전 승인 요약 구분 표시 | P4: display.py 오류 후 승인 요약이 이전 실행 것으로 남음 |
| 6 | 점 좌표를 키로 쓰는 목록 정합 검사 | P3: hooks_up 옛 좌표로 G4 코핑 밖 점 56개 |
| 7 | 확정 사유 최소 품질 | 사유 'asf', 'afs', '12' |
| 8 | 임시 등록 '설계자 확인 대기' 상태 관리, 해당 없음 항목 자동 탐지 | P2 의 G3 B9 551/493 항목이 P3·P4 에 남음 |
| 9 | 보고서에 독립 근거 구분 표시 | PASS = 내부 일관성(params·expected 가 같은 읽기에서 나온 값 다수) |
| 10 | P1 규칙 가정 단계(스터럽 좌측 윗면, c14 좌측 규칙)의 도면 읽기 | P4: 규칙이 틀려 재료표 역산값으로 교체 |
| 11 | 도면 파일 해시·개정 번호 기록·비교 | P4 D2 사슬 오류: 사용자 CAD 판과 올린 파일 불일치 의심 |
| 12 | 다른 도면 틀·형식(울산·새재1교)에서의 일반성 확인 | 교각 2개·템플릿 1개로만 확인 |
설계자 확인 대상(OPEN #35): P3 C13, P4 B11·B12·C9·C13, D2 사슬(#33). 모두 임시 등록이며 보고서에 '설계자 확인 전'으로 표시해야 한다.
이번 작업에서 생긴 오류(재발 방지): apply_pier_read.py 가 pier_id 를 바꾸면서 display.hidden_ids 를 바꾸지 않아 P4 일괄 실행이 마지막 단계에서 중단됨 → 스크립트 수정(개선 3·6 과 같은 종류: 파생 값의 동시 갱신 누락).
6.7 개선 ②③④⑥ 구현 결과 (2026-10-20)
| 개선 | 구현 | 시험 결과 |
|---|---|---|
| ② params↔expected 일관성(C9) | engine/consistency.py: 같은 양을 나타내는 두 파일 값의 규칙 103~106건(기초·말뚝·기둥, 코핑 윗면 단·하면, 받침 피치·열 위치, 코핑 철근 단·C15·C16·루프·스터럽 하단, 후프·결속 사슬, 기초 철근 층·B9·B10, 재료표 사본). 다르면 해당 묶음이 불일치(b). 규칙의 경로가 없는 교각(새재1교 등)은 건너뜀 |
완성된 P1·P3·P4: 불일치 0. P3 최초 백업 상태(before_stage2): 54건 모두 검출, expected G1~G4 전부 불일치. P4 before_table_apply: 16건 검출. 다른 형식 4종: 거짓 불일치 0 |
| ③ 필드 단위 원본 잔존(C3b) | 교각 생성 시 origin_values.json 기록(이전 교각은 tools/make_origin_values.py로 초기 백업에서 재구성). 바뀐 묶음 안에서 높이로 보이는 값(10~60 m, z·단 높이·점 좌표의 z)이 기록값 그대로이면 주의(w) |
P3 before_hooks_up 상태에서 hooks_up 좌표 4개를 정확히 지목. 완성된 상태: 경고 0(처음에는 길이 12400·12000 등을 높이로 오인해 경고가 많았으나 높이 키로 제한) |
| ④ 거짓 앵커 | engine/anchors.py TABLE_RULE="single": 후보를 따라간 근거가 재료표 칸 하나뿐이면 C등급(table_only). 두 방식(none: 표 칸을 아예 제외)과 비교 |
P3·P4 확인값 기준 B등급 오답: 끔 10/65 · single 2/39 · none 3/29. A등급 오답 0 유지. 부작용: P3에서 expected:G2(일치→주의)·params:column_rebar(일치→근거 없음) 2개 묶음의 근거가 줄어듦(표 칸 하나로 맞던 B등급 후보) |
| ⑥ 점 좌표 목록 | C9 규칙: c14.hooks_up의 각 점이 c14.points에 있어야 함 |
최초 오류(P3 before_hooks_up)의 4점 모두 검출, 점 하나를 옮기면 해당 항목만 깨짐 |
검사 환경 정리: 실제 사용 중 운곡교p2(휴지통으로 이동)에 의존하던 시험 5종(test_open19·test_rampa·test_saejae·test_okseong·test_ulsan_p2)과 test_anchors를 tools/testlib.pier_dir(휴지통 최신 복사본, 대소문자 구분)로 바꿈. test_autocheck는 P3가 완성 값을 갖게 되어 최초 백업(다른 교각 값) 상태로 시험하도록 바꿈. 회귀 fast 16/16 PASS(test_consistency 추가).
남은 개선: ① 읽기 도구 통합, ⑤ 일괄 실행 중단 표시, ⑦ 확정 사유 품질, ⑧ 임시 등록 관리, ⑨ 독립 근거 구분 표시, ⑩~⑫.
6.8 개선 ①⑤ 구현 결과 (2026-10-20)
| 개선 | 구현 | 시험 결과 |
|---|---|---|
| ① 읽기 도구 통합 | engine/geomread.py: P3·P4 모델링 때 따로 만든 읽기 도구(코핑 외곽·철근 선·원, 기초·말뚝·기둥 글자, 받침 폴리라인, 재료표, 기초 철근 규칙)를 하나로 합친 순수 함수 read()(부작용 없음, 사본과 변경 목록 반환)와 apply_selected(). engine/footing_rule.py(기초 철근 규칙). 화면 「도면에서 읽기」(/pier/<이름>/geomread): 묶음별 현재/읽은 값/근거 표, 체크한 줄만 반영, 반영 전 backup/before_geomread_*, read_log.json, 추론 줄 기본 미선택, 도면 틀 일치율 70 % 미만 또는 필요한 선·글자가 없으면 이유를 알리고 읽지 않음. tools/apply_pier_read.py 는 같은 읽기의 명령줄 판 |
tools/test_geomread.py PASS: 운곡교 P1·P3 에서 읽은 값 = 현재 값(변경 0), P4 는 추론 줄 1건만, 초기 P4 백업(P1 복사)에서 144건 제안이 검증된 P4 값과 모두 같음(표시 선택 hidden_ids 제외), 다른 도면 틀 2종 거절, 화면에서 고른 줄만 기록·백업·로그·확정 무효화 |
| ⑤ 일괄 실행 중단 표시 | batch.json 에 started·reason(error/fail/blocked, 서버 중단은 killed)·error·gate, 게이트 결과에 at. 게이트 화면: 중단 이유 안내, 결과 시각과 '이전 실행 결과' 표시, 중단되기 전에 계산된 검사기 원본(<게이트>.json 이 기록(_gate.json)보다 새로울 때)을 '중단된 실행의 임시 결과'로 표시(승인·보고서에 쓰이지 않음), 입력이 바뀐 뒤의 승인은 '승인 기록은 이전 입력 것(무효)' |
tools/test_batch_notice.py PASS: 오류·FAIL·조건 미충족·서버 중단 안내, 이전 실행 결과 표시, 임시 결과, 무효 승인 표시, 완료된 실행에는 안내 없음, 실제 작업자(_batch)에 가짜 Rhino 를 연결해 세 중단 경로의 기록 확인 |
선택과 한계
- 읽기 결과를 params 와 expected 에 함께 채우는 것은 두 파일의 독립성을 떨어뜨림 → 화면 문구와 앱 확인 C9 설명으로 알림, 표(재료표) 값은 표 후보값 화면에서 따로 대조.
- 표시 선택
display.hidden_ids는 교각 이름이 바뀌면 템플릿의 숨김을 새 이름으로 옮겨 제안(P4 는 사용자가 비움으로 정함). - 읽기 규칙의 범위: 운곡교 도면 틀 1종, 교각 4개. 좌측 스터럽 윗면(추론)·c14 좌측 규칙·결속철근 끝 높이는 P1 규칙 가정.
- 환경: 일괄 실행 오류 시 중간 결과가
<게이트>.json으로 남는 것을 이용(별도 저장 없음).
남은 개선: ⑦ 확정 사유 품질, ⑧ 임시 등록 관리, ⑨ 독립 근거 구분 표시, ⑩ P1 규칙 가정 단계 읽기, ⑪ 도면 해시·개정 번호, ⑫ 다른 도면 틀 일반성.
6.9 검토 요약 확정 (2026-10-20)
문제: 묶음 20~23개를 하나씩 확정하는 데 시간이 오래 걸리고, 사유가 비거나('12', 'asf') 무엇이 바뀌었는지 보기 어려웠다. 사용자 제안: 앱이 일괄 확정하고 사용자는 일괄 검토만 한다.
결정(권고안): "앱이 확정"은 확정의 의미(사람이 도면과 대조했다는 기록)를 없애므로 채택하지 않고, 앱이 검토를 준비하고 사람이 한 화면에서 검토·체크해 한 번에 확정한다(D1 유지). 근거 없음 묶음은 항목별 체크(a)를 요구, 기존 개별 확정 화면은 예외 처리용으로 유지.
| 요소 | 구현 |
|---|---|
| 화면 | /pier/<이름>/review (교각 화면 [검토 요약으로 확정]). 확정이 필요한 묶음을 네 구역으로: 불일치(확정 불가), 주의·근거 없음(항목별 체크), 사람 결정 기록(체크), 일치(근거 훑어보기 + 구역 체크 1회) |
| 앱이 준비하는 것 | engine/review.py: 바뀐 것(교각 생성 시점 값 기록 origin_values.json 대비 변경 값 수와 예), 앱이 확인하지 못한 것(근거 없음·주의 검사 항목), 값의 출처(read_log.json·anchor_log.json 이력), 사유 자동 작성(auto_reason) |
| 사람이 하는 것 | 도면과 대조한 묶음에 체크, 목록 끝까지 읽기(표식 review_view.json = 그때 목록의 해시), 확정자 이름, 공통 의견(선택) |
| 기록 | 묶음별 확정 기록에 사유(앱 확인·변경·출처·의견 포함), 확정 당시 앱 확인 상태, 이름. 앱은 체크가 없으면 아무것도 확정하지 않음 |
| 안전장치 | 이름·끝까지 읽기·체크 없으면 거절, 값이 바뀌면 표식 무효, 불일치는 요청에 id 가 들어와도 확정하지 않음 |
시험 tools/test_review.py(PASS): 화면 조회만으로는 확정 0, 표식·이름 없으면 거절, 체크 없으면 0, 일치 구역은 구역 체크로만, B·D 는 체크한 것만, 불일치는 거절, 기록에 사유·앱 확인 상태·이름, 값이 바뀌면 표식 무효, 불일치를 고치면 모든 필수 묶음이 이 화면으로 확정되어 게이트가 열림. 회귀 fast 19/19.
후속 변경 (같은 날): ① 「도면에서 읽기」가 표 값(받침·솔플레이트·재료표 후보)을 같은 화면에 "표 값" 구역으로 포함(geomread.table_changes), 반영은 reader.apply_proposals 와 같은 규칙, 받침마다 다른 솔플레이트 길이는 {번호: 값} 으로 정규화 — 새 교각에서 템플릿 원본 값이 한 화면으로 모두 도면 값이 됨(시험: 초기 P4 백업 + 읽기 + 표 행 = 검증된 P4 의 표 관련 필드, 알려진 예외는 앵커 값·tie_offset 상수·낡은 직경 기록). ② 「검토 요약 확정」에 [모두 체크]·[모두 해제] 버튼, 주의 표시(템플릿 원본 그대로·설계자 확인 전 임시 등록 포함)를 칩과 확정 사유에 기록, 주의 표시가 있으면 모두 체크 시 확인창. 불일치 묶음은 여전히 확정 불가, 이름·끝까지 읽기·체크 없이는 확정되지 않음. 앞서 제안한 '낮은 위험/높은 위험 두 단계' 대신 사용자 요청에 따라 일괄 체크 + 주의 표시로 구현(위험도별 분류는 미구현).
한계: 체크는 사용자의 선언이라 실제 대조 여부는 앱이 확인할 수 없다. 사유의 "무엇을 어떻게 대조했는지"는 공통 의견에 적어야 남는다. 앞으로 앱 확인 'C10 도구 읽기 이력'을 근거(출처, 독립 검증 아님)로 연결하면 근거 없음 항목이 줄 수 있다(미구현).
6.10 운곡교 P4 복구 결과와 앱 수정 계획 (2026-10-20)
상태: 계획
[미확정]— 코드는 고치지 않았다. 아래 W1~W8은 사용자 승인 후 PDCA 순서로 구현한다.
6.10.1 사고 경위와 복구
| 시각 | 사실 |
|---|---|
| 09:08 | 첫 P4 G1~G5 통과·승인 → 11:20 사용자가 삭제(휴지통 운곡교P4_20261020_112015) |
| 11:22~12:01 | 템플릿에서 다시 만든 판에 읽기·결정 반영 → 12:01 삭제(휴지통 운곡교P4_20261020_121116) |
| 12:11 | 템플릿(운곡교P1형)에서 또 새로 만들고 읽기 279건 반영 → 12:12 검토 요약으로 5개 게이트 묶음 일괄 확정 |
| 12:15 | 일괄 실행: G5만 통과, G1~G4 계획 외 FAIL 11건으로 G1에서 중단 |
| 복구 | 휴지통 판의 expected.json·params.json 복원(현재 판 백업 data/운곡교P4/backup/before_restore_decisions_20261020/). 임시 폴더 시험: G1 171/171·G2 42/42·G3 71/73(계획 2)·G4 110/116(계획 6)·G5 183/183, 계획 외 0 |
12:11 판에서 템플릿 값으로 되돌아가 있던 곳(결정 소실 6곳): ① 앵커 rear_first_from_tip 1198 → 1232 ② tie_offset 22.5 → 17.5 ③ 좌측 스터럽 윗면 40447([추론]) ④ 코핑 상단 a 11856/11881/11905 → 11855/11880/11904 ⑤ c14 높이 .5 → .1 ⑥ 계획된 FAIL B11·C13 누락, B12 사유가 P1 값(28/34)으로 복귀. 1232는 기준 템플릿 운곡교P1형의 값이며 교각마다 다르다(P1 1232·P2 1223·P3 1212·P4 1198).
6.10.2 원인 (반복될 수 있는 실패)
| # | 원인 | 근거 |
|---|---|---|
| C1 | 사람의 결정(앵커 채택, 계획된 FAIL, 역산값)이 교각 데이터 안에만 있어 교각을 지우면 같이 사라지고, 새 교각에 다시 적용할 수단이 없다 | 6곳 소실 |
| C2 | 앱이 알고 있는 후보(B등급 1198)가 읽기에 자동 반영되지 않고, 경고만 남은 채 확정됨 | G1 확정 사유 현재 1232 ≠ 도면 1198 |
| C3 | 원본 잔존 검사(C3b)가 높이로 보이는 값만 비교해 tie_offset·a 등을 놓침 |
12:15 FAIL |
| C4 | params와 expected가 서로 다른 값을 가리켜도 실행 전에 막지 못함(모델은 1198, 기준값은 1232) | G1 후열 패드 중심 X 5건 |
| C5 | 계획된 FAIL이 템플릿(P1) 승인 상태로 상속되고, 새 교각에 필요한 항목은 사람이 추가해야 함 | B11·C13 누락 |
| C6 | 게이트 실패가 어느 입력 필드 때문인지 앱이 알려 주지 않아 휴지통 판과 수동 비교가 필요했음 | 이번 복구 |
6.10.3 가능과 불가능의 경계
| 값의 종류 | 앱이 채울 수 있나 | 방식 |
|---|---|---|
| 표·글자·치수(재료표, ELEVATION TABLE, 사슬) | 가능 | 도면에서 읽기(같은 틀 A등급 165건 전부 정답) |
| 식이 정해진 계산값 | 가능(식 확인 후) | 규칙으로 다시 계산, 출처 「계산」 표시 |
| 도면에 없는 역산·추론값 | 제안만 가능 | 사람이 채택, 결정 기록에 남겨 재적용 |
| 선·점으로 그린 기하(R3·R4) | 불가능 | 시험에서 미채택(오답 A 2~7건/쌍) |
| 도면끼리 충돌하는 값 | 불가능 | 사람이 선택, 계획된 FAIL·설계자 확인 대기 |
| 다른 도면 틀 | 불가능 | 앵커 새로 학습 |
모든 묶음이 읽기로 채워지지는 않는다(P4: tol_mm·rebar_palette·planned_fail·materials는 읽기 0건). 게이트 시작에는 자기 묶음 확정과 이전 게이트 승인이 필요하나, 확정은 사람의 선언일 뿐 값의 정확성을 보장하지 않는다(P4 12:15).
6.10.4 수정 항목
설계 원칙: 앱이 준비하고 사람이 한 화면에서 체크해 한 번에 확정한다는 기존 결정(D1, 6.9절)을 유지한다. 확정 부담을 늘리지 않고, 앱이 더 많이 채우고 사실로 확인되는 모순만 차단한다.
| # | 수정 | 해결하는 원인 | 내용 |
|---|---|---|---|
| W1 | 실행 전 관문 | C4·C2 | 일괄 실행 전에 params↔expected 불일치(사실)와 후보≠현재 값을 모아 보여 주고, 불일치는 실행을 막고 후보 차이는 확인을 받는다. 기존 C9(engine/consistency.py)에 앵커 대상 필드를 추가하고 검사 항목 → 깨질 게이트 항목을 예측한다 |
| W2 | 읽기에 후보 빠짐없이 | C2 | 앱이 아는 B등급 이상 후보 중 현재 값과 다른 것을 「도면에서 읽기」 화면에 기본 선택으로 올린다(추론 줄은 지금처럼 기본 미선택) |
| W3 | 결정 기록 분리 | C1·C5 | decisions.json에 사람 결정(앵커 채택, 계획된 FAIL, 역산·추론값과 사유)을 읽기 이력과 따로 보관, 교각 삭제 시 휴지통에 함께 이동. 「이전 결정 다시 적용」 화면에서 같은 도면 틀일 때만 기본 선택, 고른 것만 반영 |
| W4 | 원본 잔존 검사 확대 | C3 | C3b를 변수 등급 V1·V2 숫자 필드 전체로 넓혀 템플릿 값 그대로인 필드를 「확인 필요」로 모은다. 파생값(a, c14 높이)이 어떤 입력에서 나오는지 식을 먼저 조사 |
| W5 | 실패 → 입력 필드 연결 | C6 | 계획 외 FAIL마다 원인 후보 필드를 표시(예: rear pad centre X → G1.seats.rear_first_from_tip), 「계획된 FAIL로 등록」 버튼(사유 필수) |
| W6 | 계획된 FAIL 상속 상태 | C5 | 템플릿에서 상속된 항목은 「미승인(상속)」으로 표시하고 게이트 결과로 해당 여부를 대조 (OPEN #34 ⑧과 통합) |
| W7 | 재현 시험 | 전체 | 검증된 첫 P4를 정답으로 「템플릿 + 읽기 + 재적용한 결정」 결과가 같은지 비교하는 tools/test_pier_rebuild.py. 이번 6곳 소실을 잡아야 통과 |
| W8 | 템플릿 승격 | C1 | 같은 도면 틀에서 결정이 반복되면(C13 L 28.966, B12 32/38) 「운곡교P3·P4형」 템플릿 후보로 올린다. 사용자 승인 필수, 설계자 확인 대기 항목은 상속 상태 유지 |
시험 방식: 각 항목마다 P4 12:11 판(결정 소실 상태)을 입력으로 쓰는 음성 시험과, 완성된 P1·P3·P4에서 거짓 차단 0건을 확인하는 양성 시험을 둔다.
6.10.5 순서와 결정 필요 사항
| 단계 | 항목 | 이유 |
|---|---|---|
| 1 | W1·W2 | 변경이 작고 이번 사고의 직접 원인을 막는다(같은 화면) |
| 2 | W3·W7 | 근본 대책과 그 검증 |
| 3 | W5·W6 | 실패 해석과 계획된 FAIL 정리 |
| 4 | W4·W8 | 파생식 조사·템플릿 승인이 필요해 뒤로 미룸 |
| # | 결정 필요 | 권고 |
|---|---|---|
| D7 | 이전 결정의 자동 재적용 범위 | 같은 도면 틀일 때만 기본 선택, 나머지는 목록에서 고름 |
| D8 | 기존 교각에 결정 기록을 소급할지 | 새 교각부터만 적용 |
| D9 | 미확정 상태의 시험 실행(승인 없이 임시 폴더에만 결과)을 앱에 둘지 | 둔다. 승인 기록은 남기지 않음 |
| D10 | W4의 파생식 조사를 1~3단계 뒤로 미룰지 | 미룬다 |
미해소(P4 승인): 복구한 값은 아직 확정되지 않았다. 미확정 5개 묶음(expected:planned_fail·G1·G2·G4, params:coping_rebar)을 검토 요약에서 재확정하고, 일괄 실행·G4·G5 승인 후 보고서 초안을 쓴다(OPEN #37).
6.11 W4 원본 잔존 검사 확대 계획 (2026-10-20)
상태: 계획
[미확정]— 코드는 고치지 않았다. 실측 스크립트:Code/교각모델링앱/tools/analysis_w4_residual_sizing.py.
6.11.1 목적
새 교각을 템플릿에서 만든 뒤 도면 값으로 바뀌어야 하는데 템플릿 값 그대로 남은 필드를 150초짜리 게이트 실행 전에 찾아 사람에게 보여 준다.
6.11.2 현행 C3b와 한계
engine/verify.py stale_fields_check: ① 키 이름이 높이처럼 생긴 필드(height_like)만 ② 값이 10~60 m ③ 같은 묶음에서 그런 값이 3개 이상 바뀐 경우에만 ④ 생성 시점 값(origin_values.json)과 같으면 경고(w, 실패 아님). 그래서 높이가 아닌 값(tie_offset, 앵커 rear_first_from_tip, 코핑 상단 a)은 비교 대상이 아니다.
6.11.3 실측 (P4 12:11 판 = 결정 소실 상태, 정답 = 복원한 P4)
| 항목 | 값 |
|---|---|
| 템플릿 숫자 필드 / P1~P3에서 교각마다 달라진 필드 | 1,676 / 958 |
| 12:11 판에서 템플릿 값 그대로인 숫자 필드 | 767 |
| 현행 C3b가 잡은 후보 | 0건 |
| 「템플릿 값 그대로 + 교각마다 달라지는 필드」(단순 확대) | 88건 중 실제 틀림 5건 → 정밀도 6 % (거짓 경보 83건) |
| 위 기준 + 3교각 모두 서로 다른 값 | 2건 중 1건(rear_first_from_tip) → 정밀도 50 %, 놓침 많음 |
해석: 통계만으로 확대하면 경보가 94 % 거짓이라 쓸 수 없다. 거짓 경보 대부분은 P4가 P1과 같은 구조라 맞게 같은 값인 필드(받침 이동 검사, 기초 철근 층, 솔플레이트 표 등)다. 실제로 게이트를 깬 필드는 소수(rear_first_from_tip, tie_offset, 코핑 상단 a 3개)다. 한편 c14 높이(.1 대 .5)와 계획된 FAIL 차이는 템플릿 잔존이 아니다(c14는 0.4 mm 차이로 게이트는 통과, 계획된 FAIL은 목록 항목 누락) → W3·W5·W6 몫이다.
필드별 이력(검증된 교각): tie_offset P1·템플릿 17.5, P2·P3·P4 22.5 / a P1·P2 11855·11880·11904, P3 11856·11880·11905, P4 11856·11881·11905 / rear_first_from_tip 1232·1223·1212·1198(전부 다름). 즉 교각마다 달라지는 폭이 작은(1~5 mm) 값은 사람이 눈으로 놓치기 쉽다.
6.11.4 설계 — 통계 경보 대신 단계별 확인
| # | 내용 | 효과·비고 |
|---|---|---|
| W4a | 교각별 확인 목록(watch-list): variability.json에 필드 단위로 「교각마다 달라지며 템플릿 값이면 확인 필요」를 지정. 초기 목록은 이력으로 실증된 필드(위 3개와 G2.schedule_L 등)로 시작. 템플릿 값 그대로면 앱 확인 「주의」(C3b 확장), W1 실행 전 관문에 연결 |
정밀도가 높은 소수 목록. 새 교각이 검증될 때 도구가 후보 추가를 제안하고 담당자가 승인 |
| W4b | 통계 후보는 경보가 아니라 묶음 요약: 「교각마다 달라지는 필드 N개가 템플릿 값 그대로」를 묶음 단위로 접어 보여 주고 필드 목록은 펼쳐 볼 때만 표시 | 거짓 94 %를 경보로 쓰지 않으면서 훑어볼 수 있게 함 |
| W4c | 읽기 후보 연동(W2): 목록·통계 후보 중 도면에서 후보(앵커·표)가 있는 필드는 「도면에서 읽기」 화면에 기본 선택으로 올림 | rear_first_from_tip은 B등급 후보가 있었다 |
| W4d | 파생값 조사: a, tie_offset 등이 어떤 입력·도면 글자에서 나오는지 P1~P4 값과 도면 문자로 조사. 식이 확인되면 계산값으로 제안(출처 「계산」), 못 찾으면 W4a 목록에 남김 |
현재 식을 모름. 조사 결과에 따라 W4a 목록이 줄어듦 |
| W4e | 교각 그룹별 기본값 승격(W8 연계): tie_offset 22.5처럼 P2 이후 전부 같은 값은 템플릿 P1 값(17.5)이 오히려 예외이므로, 같은 도면 틀 그룹 템플릿에서 기본값을 바꾸는 후보로 제안 |
승인 필수 |
6.11.5 판정 규칙 (C3b 확장안)
| 조건 | 판정 |
|---|---|
| W4a 목록 필드가 생성 시점 값 그대로 | 주의(w), 검토 요약의 해당 묶음에 필드명·템플릿 값·교각별 이력 표시 |
| 위 값이 읽기 후보(A·B등급)와 다름 | 주의 + 읽기 후보로 제시 |
| 통계 후보(W4b) | 정보(건수만), 판정에 영향 없음 |
| 묶음 전체가 그대로 | 기존 C3 |
실패(불일치)로 판정하지 않는다: 같은 값이 맞을 수도 있고(P2~P4 a 11880 등), 근거 없이 막으면 6.9절의 일괄 검토 흐름을 해치기 때문이다. 막는 것은 W1(params↔expected 사실 불일치)이 맡는다.
6.11.6 시험
| 시험 | 기준 |
|---|---|
| 음성(잡아야 함) | P4 12:11 판에서 rear_first_from_tip·tie_offset·a 3개 모두 주의로 표시 |
| 양성(거짓 경보 억제) | 완성된 P1·P2·P3·P4에서 W4a 목록 경보 0건 (값이 도면 값이면) |
| 통계 후보 | 12:11 판 기준 건수만 표시, 판정 불변 |
| 회귀 | tools/test_autocheck.py·test_consistency.py·test_review.py 통과, 기존 C3b 동작 유지 |
| 신규 | tools/test_stale_watchlist.py |
6.11.7 순서와 결정 필요
- W4d 파생값 조사(코드 변경 없음, 결과를 보고) → 2. W4a·W4b 구현 → 3. W4c(W2 구현 시 함께) → 4. W4e(W8 승인 시).
| # | 결정 필요 | 권고 |
|---|---|---|
| D11 | 초기 watch-list 필드 범위 | 게이트를 실제로 깬 3개 + G2.schedule_L로 시작해 사고 때마다 추가 |
| D12 | 통계 후보(W4b)를 화면에 둘지 | 묶음 요약만 두고 경보 아님 |
| D13 | 템플릿 값 그대로를 실패가 아닌 주의로 둘지 | 주의 유지(차단은 W1 사실 불일치만) |
7. 리스크·결정 사항
7.1 리스크
| # | 리스크 | 대응 |
|---|---|---|
| R1 | 앱 확인 '일치'를 "도면이 맞다"로 오해 | 근거 보기에서 '무엇과 무엇이 같은가'를 문장으로 표시, 신뢰 등급 병기 |
| R2 | 규칙·앵커가 4개 도면에 과적합 | 등급 C·'없음'을 정상으로 표시, 새 형식 도면마다 앵커 추가 |
| R3 | 앵커 소급 추출 비용(원본 4교각) | D6 결정(신규부터 vs 소급) |
| R4 | 앱 확인 규칙이 생성 스크립트와 같은 논리여서 순환 | 도면 원자료(DXF·문자 색인)를 직접 읽는 경로만 사용, 스크립트 재생성 일치(C8)는 '독립성 낮음'으로 표시 |
| R5 | 일괄 확정이 다시 도장화 | 일치만 대상, 근거표 열람 조건, 주의·불일치는 사유 필수 |
| R6 | 변수 등급 오분류 | variability.json은 템플릿 원본 교각 담당자가 확정, 분류 변경은 별도 Task |
7.2 결정 사항
| # | 내용 | 상태 | 권고 |
|---|---|---|---|
| D1 | 확정 주체 | 결정 2026-10-14 / 심영표: 앱 확인 + 사람 확정 | — |
| D2 | 표 밖 치수 탐색 방식 | 결정 2026-10-14 / 심영표: 규칙 + 템플릿 앵커 | — |
| D3 | F(고정) 항목 편집 시 처리 | 결정 2026-10-15 / 심영표: 권고안 | 경고 + 사유 입력(차단은 생성기 개발자 모드에서만) |
| D4 | 일괄 확정 조건 | 결정 2026-10-15 / 심영표: 권고안 | '일치' 묶음만, 근거표를 한 번 열어야 활성화 |
| D5 | 착수 범위·순서 | 결정 2026-10-15 / 심영표: 권고안 | A → B 먼저(위험 큰 P1·P2 해소), C는 B 검증 뒤 |
| D6 | 앵커 소급 추출 | 결정 2026-10-15 / 심영표: 권고안 | 옥성교·Ramp-A(최근, 판독 스크립트 최신)부터, 나머지는 필요 시 |
부록 A. 보호 템플릿 묶음 분류 (등급 초안, 담당자 확정 전)
| 묶음 | 운곡교P1형 | 울산형 | Ramp-A형 | 옥성교형 |
|---|---|---|---|---|
pier_id |
F | F | F | F |
scope·builders·checkers·negative (실행 설정) |
F (없음=기본) | F | F | F |
lean_concrete·footing·column·materials |
V1 | V1 | V1(기초 없음) | V1 |
piles / pile |
V1 | — | V1(pile 구간) |
V1 |
coping |
V1 + 점 목록 V2 (form F) |
V1 + V2 (form F) |
V1 + V2 (form F) |
V1 + V2 (form·skew_deg 구조는 F) |
bearing_seats·sole_plates |
V1 + 위치 V2 (대좌 구조 F) | V1 + V2 | V1 + V2 | V1 + V2 (대좌 공유 구조 F) |
rebar_marks |
직경 V1, 마크 체계 F | 동일 | 동일 | 동일 |
column_rebar |
V1·V2 (form F) |
V1·V2 | V1·V2 | V1·V2 |
footing_rebar |
V1·V2 | V1·V2 | — (shaft_rebar V1·V2) |
V3 (중심선 목록) |
coping_rebar |
V1·V2 (규칙 값) | V3 | V3 | V3 |
expected.G1~G5 |
V1·V2 (params와 독립 입력) | 동일 | 동일 | 동일 |
expected.planned_fail·rebar_palette |
사람 결정 기록(교각별) | 동일 | 동일 | 동일 |
display·_schema·_meta·*_src·hitl_decisions* |
F / 참고 | 동일 | 동일 | 동일 |
이 표는 묶음 수준의 초안입니다. 필드 수준 분류(
variability.json)는 A단계에서 템플릿마다 작성하고 담당자가 확정합니다.
부록 B. 근거 파일
| 구분 | 경로 |
|---|---|
| 화면·동작 | Code/교각모델링앱/web/templates/pier.html, web/app.py(confirm_all, unconfirmed), web/store.py(GATE_SECTIONS, section_state, confirm, set_section) |
| 표 판독·후보 | engine/reader.py(table_candidates, field_candidates, proposals, el_list, entity_info) |
| 사용 방법 | DOC/04_실행/실행_T형교각모델링앱사용설명서_2026-10-14_v0.2.07.md §4~5, §9 |
| 일반화 이력 | context-migration/OPEN_미해결목록.md #19·#23·#24·#25, DOC/02_분석/분석_운곡교P2교각도면판독_2026-10-12_v0.1.00.md §7 |
| 표 밖 치수 판독 사례 | Code/옥성P1판독/extract_g*.py, DOC/02_분석/분석_옥성교P1교각도면판독_2026-10-14_v0.1.07.md |