Files
Aislo/docs/raw/plans/2026-09-12_plan_checked_complete_items.md
T

53 KiB
Raw Blame History

2026-09-12 체크리스트 전체 완료 항목 이관

원본: 저장소 루트 PLAN.md 처리: 사용자가 2차 교차검증 생략을 지시하여 기존 체크 상태와 자체검증 기록을 그대로 보존함. 주의: 「검증 대기」·「사용자 확인 대기」·「보류 확정」 표기는 완료로 재해석하지 않고 원문대로 유지함.

0-9. 계획노선 편집 모달 — 기능 개선 (2026-09-12 사용자 지시) — 앞 아홉은 만듦 · 검증 대기

선행: 0-2 (모달 본체는 이미 섬). 여기는 그 위에 얹는 개선임. 손대는 자리는 B05_Profile_UI_RouteEdit.ts 와 조각 다섯(_Curve·_Edits·_History·_Input·_Label)임.

지금 상태 — 조사로 확인한 것 (2026-09-12)

  1. 등고선은 도엽 것 한 벌뿐임. 모달은 배수유역도와 같은 도엽_등고선.geojson 을 노선 둘레 300m 띠 안에서만 그림. LAS 로 만든 등고선은 이미 있으나(GET /projects/{id}/surface/models/{model_id}/contour?interval=, 응답에 level(표고)과 사업지 좌표 점렬) B05 3D 뷰어만 씀. 확정 지표면 모델 id 는 B05 페이지가 이미 쥐고 있음(confirmedSurface.model_id).
  2. 최소곡선반지름은 제한이 아니라 표시임(2026-09-06 확정). 서버가 projects.road_type + 설계속도 + 지형으로 골라 min_radius_m 로 내려 주고, 화면은 못 미치는 노드를 붉게만 칠함. 값 표는 config_system_design.FOREST_ROAD_PROFILE_CRITERIA["min_plan_radius_m"](설계속도 40/30/20 × 일반·특수)이고 근거는 지식DB 01_임도/02_상세설계/평면선형.md 별표2 .2.다.(1)임. 작업임도는 곡선반지름 규정 자체가 없음(같은 문서 §1).
  3. 노선 길이·시점·종점·측점 표기가 모달에 없음. 측점 간격 기본값은 20m(SECTION_STATION_INTERVAL_M), 「3+18.0」 표기 유틸은 B05_Profile_Util_Station.ts 에 이미 있음.
  4. 점을 주고 지반고를 받는 통로가 없음. 서버 common_util_surface_sampler.build_surface_sampler 는 종·횡단 생성 안에서만 불림 — ⑤·⑧ 은 이 통로를 새로 내야 함.
  5. 곡선 조작 패널이 모달을 벗어남(사용자 지적 ⑨). document.bodyposition: fixed 로 띄우고 곡선 중심 반대쪽 16방위로 자동배치라 모달 상자 밖하단 정보행 위로 넘어감. 모달이 overflow: hidden 이라 밖에 띄운 것이었으나, 「잘리지 않게」와 「상자 밖으로 나가게」는 다른 문제임.

개선 방향 — 아홉

  • ① 계획노선 길이 실시간 라벨 — 그려지는 폴리라인(plannedLine)의 정점 간 거리 합을 브라우저에서 바로 내 상태줄에 냄. 원호가 이미 정점으로 펴져 있어 이 합이 곧 실제 노선 길이임. 서버 왕복 없음.

  • ② 시점·종점·규칙측점 실시간 표기 — 양 끝에 시점(BP)·종점(EP) 이름표, 규칙 간격마다 노선에 직교 눈금과 측점번호를 냄. 누가거리 → 「3+18.0」 변환은 B05_Profile_Util_Station.formatStation 재사용. ⚠ 측점 간격은 프로젝트 설정을 따라야 하므로 20m 를 코드에 굳히지 않음. 확대를 줄이면 눈금이 붙어 뭉개지므로 화면 간격이 좁아지면 5측점마다만 이름표를 냄. 자체검증 (2026-09-12, ORCA 내장 브라우저 · 프로젝트 5cff3920) — ①②⑨ 셋 다 화면에서 확인함. · 상태줄이 「길이 1017.5m · 노드 26개 …」로 뜸. 저장된 planned_route.csv(정점 170개)를 따로 재어 본 값도 1017.5m, 노드 26개·곡선 24곳으로 정확히 같음. · 시점·종점 이름표와 5측점마다의 눈금(0+0.0 · 5+0.0 … 50+0.0)이 노선 위에 뜸. 종점 표기 50+17.5 는 50×20+17.5 = 1017.5m 로 길이와 맞아떨어짐. 이름표를 위로만 띄웠더니 측점 라벨과 포개져 노선 바깥 방향으로 밀어 풀었음(측점 라벨은 노선에 직각으로 나감). · 패널 머리를 지도 밖 2000px 까지 끌어도 오른쪽 1401.2px · 아래 863.1px 에서 멈춤(테두리 1401.5 · 863.2). 하단 정보행은 지도 칸 아래라 가려지지 않음. · 그리기가 B05_Profile_UI_RouteEdit_Render.ts 로 떨어져 나가 본체가 703줄 → 627줄이 됨(700줄 규정 회복). 측점 눈금은 B04 지도와 같은 drawStationTicks 를 부름.

  • ③ 등고선 한 줄당 높이값 라벨 — 도엽은 등고수치 속성, LAS 는 level 값이 이미 실려 있어 새로 셀 것이 없음. 가닥마다 화면 안쪽 한 자리에 숫자를 찍되, 겹치면 주곡선(간격의 5배)만 냄.

  • ④ R·L 최소값 제한 — 하한에서 막음 (2026-09-12 확정). 지금의 「붉게만 칠함」을 하한 아래로 아예 못 가게 막는 쪽으로 바꿈 — 0-2 확정의 「막지 않고 표시만」은 이 자리에서 뒤집힘. 막는 값은 둘임. · R 하한 — 서버가 이미 내려 주는 min_radius_m(임도 종류·설계속도·지형이 정함)을 그대로 씀. 작업임도는 규정이 없어 0 — 수치를 지어내지 않고 설정값 한 자리로 두어 나중에 값만 바꾸면 바로 걸리게 함. · L 하한(곡선 길이) — 법령·교본에 평면 곡선 길이 하한이 없음. R 과 같은 꼴로 임도 종류별 설정값을 새로 두되 지금은 전부 0(제한 없음)으로 열어 둠. · 막는 자리는 반지름 칸 · 곡선 길이 칸 · 곡선 손잡이 끌기 셋. 하한에 닿으면 거기서 멈추고 왜 멈췄는지 상태줄에 냄. ⚠ 노드를 옮겨 교각이 작아지면 L = R·Δ 라 길이가 저절로 줄어듦 — 이때는 노드 이동을 막지 않고 R 을 늘려 L 을 지킴(길이 고정과 같은 셈)이며, R 까지 하한에 닿으면 그때 멈춤. 자체검증 (2026-09-12, ORCA 내장 브라우저 · 프로젝트 5cff3920 · 하한 R 12m) · 막는 자리 셋 다 확인 — 반지름 칸에 5·11.9 를 넣으면 12 로 멈추고 그 값이 칸에 되적힘(30 은 그대로 통과), 곡선 손잡이를 교각점 쪽으로 44px 당겨도 R 칸이 12 에서 안 내려감, 노드를 끌어 접선 자리가 모자라지는 구간에서는 「하한에 걸려 더 못 옮깁니다(곡선반지름 12m)」가 뜨며 그 걸음이 되돌려짐. 패널에도 「R ≥ 12m」이 적힘. · 기본값과 하한을 갈라 둠 — 한 값으로 묶으면 작업임도의 하한 0 이 곧 반지름 0 이 되어 곡선이 아예 안 그려짐. 응답에 min_radius_m(기본값)과 limit_radius_m·limit_curve_length_m(하한)이 따로 나감(실측 12 · 12 · 0). · ⚠ 이미 하한을 밑돌던 자리는 그대로 둠 — 「조금이라도 나빠지면 막기」로 두었더니 옛 노선의 미달 노드 옆을 1px 만 건드려도 첫 걸음부터 막혀 아무것도 못 고쳤음. 지키고 있던 자리가 넘어가는 것만 막게 고침(붉은 표시는 그대로 남음). · 시험 resources/tester/test_plan_curve_limits.py 5건 통과. 전체 시험 1300 통과 · 22 건너뜀(설정 표를 건드려 전부 돌림).

  • ⑤ 두 지점 사이 거리·종단기울기 — 노선 위 아무 자리(직선·곡선 가림 없음)를 두 번 찍으면 a·b 사이 노선을 따라간 길이(b 지반고 − a 지반고) ÷ 길이 를 냄. 지반고는 확정 지표면에서 와야 하므로 점 목록을 받아 표고를 돌려주는 가벼운 API 를 새로 냄(build_surface_sampler 재사용, 새 계산 아님). ⚠ 0-2 확정 7(편집 중 계산 금지)과 부딪히지 않게 두 번째 점을 찍는 순간에만 부르고 노드를 끄는 동안에는 안 부름. 자체검증 (2026-09-12, ORCA 내장 브라우저 · 프로젝트 5cff3920) — Shift+클릭 두 번으로 잼. · 상태줄에 「구간 0+8.8 → 32+9.2 · 길이 640.3m · 지반고 876.2 → 869.9m · 종단기울기 -1.0%」가 뜸. 측점 표기로 되짚으면 32×20+9.2 8.8 = 640.4m 로 표시 길이와 맞고, (869.9876.2)÷640.3 = 0.98% 로 표시 기울기와 맞음. · 지반고는 새 통로 POST /route/elevations 가 냄. 저장된 종단 측점(center_x/y 208407.437464 · 367751.645256, center_z 878.30352)을 그대로 물어 878.304 가 돌아옴 — 종·횡단 생성기와 같은 sampler 를 보고 있음. · 찍은 자리는 a·b 동그라미와 초록 굵은 선으로 노선 위에 보임. 끄는 동안에는 서버에 안 부름 — 두 번째 점을 찍는 순간 한 번만 부름(0-2 확정 7). · 700줄 규정을 지키려 모달에서 구간 재기(_Measure.ts)와 [확인]·예상노선으로를 떼어냄 — 본체 693줄.

  • ⑥ 바탕 등고선을 LAS 것으로 — 확정 지표면 모델이 있으면 LAS 등고선을 그리고, 없으면 지금처럼 도엽 등고선을 씀(사용자 지시 그대로). 좌표계는 둘 다 사업지 m 라 변환이 필요 없고, 간격은 프로젝트 등고선 간격 설정을 따름. 노선 둘레 300m 띠로 거르는 것은 그대로 둠.

  • ⑦ 등고선 선택 활성화 — 등고선 한 가닥을 찍으면 그 가닥만 다른 색·굵기로 살아나고 높이값을 크게 냄. 집는 차례는 노드 · 곡선 손잡이 · 등고선 순 — 노선 편집이 먼저임. 자체검증 (2026-09-12, ORCA 내장 브라우저 · 프로젝트 5cff3920) — ③⑥⑦ 셋 다 화면에서 확인함. · 상태줄이 「… · LAS 등고선 · …」으로 바뀜. 3D 뷰어가 쓰던 등고선 파일(contour_…_1.0m.json, 가닥 2277·표고 187단)을 그대로 읽음. 확정 지표면이 없으면 도엽으로 내려앉는 갈래도 함께 넣었음. · 가닥마다 높이값이 붙음. 처음엔 화면이 숫자로 덮였음 — LAS 등고선은 한 표고가 여러 가닥으로 끊겨 있어서임. 겹치는 라벨을 건너뛰게 고쳤고, B04 지도(계곡선만 라벨)는 원래 드물어 표기가 안 바뀜. · 그래도 1m 간격을 다 그리니 지형이 선으로 뭉개졌음 → 화면에 실제로 들어오는 가닥 수를 세어 간격을 고르게 함(상한 350가닥). 이 노선에서는 10m 로 잡혀 750·760·…·920 이 읽힘. 확대하면 저절로 촘촘해짐. · 등고선을 누르면 그 가닥만 보라색으로 굵어지고 상태줄에 「고른 등고선 860m」이 뜸. 집히는 것은 그려진 줄뿐임(고른 값 850·840·860 이 모두 10m 배수) — 안 그린 줄이 골라져 없던 선이 튀어나오던 것을 막았음. 빈 자리를 누르면 풀림. 집는 차례는 노드 · 곡선 손잡이 · 등고선 순. · B04_PreProcess_UI_MapRender.ts 가 700줄을 넘어 사전 투영 쪽을 _Prepare.ts 로 분리함(619 → 479 + 306).

  • ⑧ 측점 횡단도 미리보기 — 별도 창 (2026-09-12 확정). 측점을 찍으면 따로 뜨는 작은 창에 그 측점 횡단을 보임. 시간이 조금 걸려도 됨 — 찍은 측점 하나만 서버가 셈함. 보일 것은 셋뿐임 — 원지반 횡단선 · 기본 계획 횡단선 · 계획 횡단의 성토사면 길이. 구조물은 안 그림. 셈은 B06 로직을 그대로 재사용(B06_Section_Engine_Design*) — 새로 짜지 않음. ⚠ 계획고는 편집 중에 없으므로 B06 이 쓰는 기본 계획 규칙(지반 추종)으로 그 측점 하나만 세움. 자체검증 (2026-09-12, ORCA 내장 브라우저 · 프로젝트 5cff3920) — 측점 눈금을 누르면 창이 뜸. · 창 제목 「횡단 미리보기 — STA.0+100.000」, 그림에 원지반(회색)·기본 계획 횡단(주황) 두 줄, 아래 한 줄에 「성토사면 좌 2.86m · 절토 71.43㎡ · 성토 1.97㎡ · 계획고는 [확인] 뒤에 정해지므로 지반을 따라 세운 기본 계획임」. · 정본과 같은 값인지 대조함 — 저장된 cross_00100m.json 의 지반 샘플과 견주니 offset −20.0m 에서 889.910743 vs 889.910847(0.1mm 차), 상단측도 둘 다 right. 계획고로 쓴 값은 그 측점 center_z 873.219755 그대로임. · 성토사면 길이는 B06 화면이 쓰는 fillSlopeLengths 를 그대로 부름 — 두 화면이 다른 길이를 말하지 않음. 설계선은 서버가 B06 compute_cross_design 으로 냄. · 한 장에 0.7초쯤 걸림(종·횡단을 한 번 돌림). 처음엔 가로·세로를 따로 늘려 사면 기울기가 거짓으로 보였음 — 같은 배율로 고침. · 전체 시험 1300 통과 · 22 건너뜀.

  • ⑨ 곡선 조작 패널이 모달을 벗어남 — 자동 자리를 모달 상자 안(하단 정보행 위까지)으로 가둠. 손으로 옮기는 것도 같은 테두리 안에서만. position: fixed 로 띄우는 것은 그대로 두고 자리 계산에서만 가둠 — 상자가 작아 패널이 안 들어가면 캔버스 오른쪽 위에 붙임.

개선 둘째 묶음 — 화면 정리와 회전 (2026-09-12 사용자 지시)

앞 아홉을 화면에서 보고 이어서 내려온 지시임. 모달 아래 정보행을 없애고 지도 위 오버레이로 옮기는 것이 줄기임 — 지도가 세로로 넓어짐.

  • ⑩ 조작 설명을 지도 좌상단 오버레이로 — 지금은 제목행 옆에 한 줄로 길게 늘어서 창이 좁으면 두 줄로 접힘. 2열로 묶어 지도 왼쪽 위에 띄움.

  • ⑪ 단추를 제목행 오른쪽으로 — [되돌리기]·[다시하기]·[초기화]·[예상노선으로]·[취소]·[확인]을 제목행 오른쪽 맞춤으로 옮김. 크기·모양은 공용 규격(ui_template.ui-btn)을 그대로 씀 — 모달이 따로 만든 b05-routeedit__btn 을 걷어냄.

  • ⑫ 상태·범례를 지도 좌하단 오버레이로 — 길이·노드 수·곡선 요약과 예상노선·계획노선 범례를 지도 왼쪽 아래에 띄움.

  • ⑬ 하단 정보행 삭제 — ⑩~⑫ 를 옮긴 뒤 그 줄을 통째로 없앰. 지도 칸이 그만큼 내려감.

  • ⑭ LAS 등고선도 5m 단위로 — 지금 LAS 자료는 1m 간격이라 확대하면 1m·2m 짜리까지 나옴. 도엽 등고선(5m)과 같은 눈금으로 맞춰 5m 아래로는 안 내려가게 함. ⚠ 서버에 5m 로 다시 뽑아 달라고 하면 첫 한 번이 오래 걸리므로, 받아 둔 1m 자료에서 5의 배수만 골라 그림.

  • ⑮ LAS 일 때 세류선도 등고 범위 안쪽만 — 도엽 하천중심선은 도엽 전체를 덮어 LAS 등고선 바깥까지 뻗음. 바탕이 LAS 일 때는 등고선이 있는 범위 안에서만 그림.

  • ⑯ 지도 회전 — 지도 오른쪽 위에 반시계·시계 아이콘 둘. 한 번 누를 때마다 그림 전체가 한 칸씩 돎(글자도 함께 돎 — CAD 도면과 같은 방식). 집기(노드·손잡이·등고선·측점)는 돌린 자리를 그대로 따라감.

  • ⑰ R·L 하한 5m 로 채움 (2026-09-12 사용자 확정) — 실무값도 없는 자리이고 자유도가 높은 공사라 0 으로 열어 두었으나, 표기상 값이 필요하면 5m 로 하라는 지시임. 작은 값으로 고칠 때 걸리적거리지 않는 수준으로 보신 값임. 설정 표 한 칸이라 뒤에 언제든 바꿈.

    자체검증 (2026-09-12, ORCA 내장 브라우저 · 프로젝트 5cff3920) — ⑩~⑯ 다 화면에서 확인함. · ⑩⑫⑬ 하단 정보행이 사라지고 지도가 그만큼 세로로 넓어짐. 조작 설명은 왼쪽 위 2열, 길이·노드·곡선 요약과 범례는 왼쪽 아래. 두 판 모두 클릭을 통과시켜 지도 조작을 안 가림. · 단추 여섯이 제목행 오른쪽 끝에 붙음. 공용 .ui-btn(--ghost, [확인]만 --filled)을 그대로 써서 다른 화면 단추와 크기·모양이 같아짐 — 모달이 따로 쓰던 b05-routeedit__btn 은 지움. · 확대하면 855·865·875·885·895·905·915·925 가 뜸 — 5m 단위가 맞음(1m·2m 짜리가 안 나옴). 받아 둔 1m 자료에서 5의 배수만 골라 그리므로 서버에 다시 묻지 않음. · 세류선이 LAS 등고선 범위 밖으로 뻗던 긴 파란 선이 사라짐. · 시계 단추 셋(45°)에 지도가 통째로 돌고 글자도 함께 돎. 돌린 상태에서 눈에 보이는 노드·손잡이를 눌러도 그대로 잡힘(「옮기는 중」·「곡선을 잡는 중」), 곡선 패널도 돌아간 노드 옆(105px)에 뜨고 지도 칸 안에 머묾. 반시계 셋으로 제자리. · ⚠ ⑰ 을 고치며 하나 알아냄 — L 하한을 기하에도 걸었더니 아무것도 안 고쳤는데 노선이 바뀌었음(길이 1017.5 → 1017.2m). 내각 179° 처럼 거의 곧은 자리는 L 5m 를 채우려면 R 이 286m 로 부풀기 때문임(L = R·Δ). 별표2 도 내각 155° 이상은 곡선을 안 둘 수 있다고 함. 그래서 L 하한은 칸에 적을 때만 막고(2 를 넣으면 5 로 멈춤) 패널에 「L ≥ 5m」으로 보이기만 함 — 노선은 손대지 않음. · 전체 시험 1310 통과 · 22 건너뜀.

개선 셋째 묶음 — 창 배치와 손맛 (2026-09-12 사용자 지시, 화면을 보고 내려온 것)

⑱~⑳ 이 줄기임 — 횡단을 메인 창 오른쪽에 붙박이로 두고 그 아래에 전후 비교창을 새로 냄. 나머지는 잔손질.

  • ⑱ 창 배치를 바꿈 — 메인 모달을 왼쪽으로 밀고, 오른쪽에 폭이 같은 세로 칸 하나를 세움. 위쪽 절반이 횡단 미리보기(지금 떠다니던 창을 붙박이로), 아래 절반이 전후 비교창(새로 만듦). 떠다니며 끌던 것은 그만둠 — 자리가 정해지면 끌 까닭이 없음.

  • ⑲ 전후 비교 — 비교창은 평소 빈 화면. 노선을 고쳐 노드를 놓는 순간(2026-09-12 사용자 확정) 그 측점 횡단을 다시 셈해 새것은 위, 직전 것은 아래로 내림. 끄는 동안에는 안 부름(한 장에 0.7초).

  • ⑳ 횡단 창 손질 — 제목의 측점을 누가거리가 아니라 측점 표기로(⓫ 참고). 하단 정보에서 「계획고는 [확인] 뒤에 정해지므로…」 설명을 지움(2026-09-12 사용자 확정) — 성토사면 길이·절토·성토 면적은 그대로 둠.

  • ㉑ 측점 표기를 한 규칙으로 — B05 왼쪽 아래 구조물 목록이 쓰는 「측점번호+잔여거리」(4+9.8 · 17+4.5) 그대로. 서버가 주는 STA.0+100.000 을 그대로 쓰지 않음 — 화면마다 표기가 갈림.

  • ㉒ 좌하단에 길이 둘예상노선 길이계획노선 길이를 나란히. 지금은 계획노선 하나뿐이라 얼마나 달라졌는지 안 보임.

  • ㉓ 거리 재기를 단추로 — [되돌리기] 왼쪽에 구분선을 두고 그 왼쪽에 [거리 재기] 단추. 켜면 그냥 눌러도 재짐(Shift 는 지름길로 남김).

  • ㉔ 잰 값을 작은 창으로 — 상태줄에 섞지 않고 따로 뜨는 작은 오버레이에 냄. 닫기 단추가 있고 닫으면 잰 것이 지워짐. 곡선 패널과 같이 뜨지 않음 — 하나가 뜨면 다른 하나는 숨음.

  • ㉕ 잰 구간이 꼬임 — 화면 사진에서 초록 띠가 노선을 벗어나 삼각형으로 얽힘. 두 점 사이를 가장 가까운 정점으로 잘라서 생긴 일임(노선이 되꺾이는 자리에서 엉뚱한 정점을 고름). 누가거리로 잘라 고침.

  • ㉖ 곡선 패널 여닫기 — 고른 꺾임점을 벗어나 누르면 선택이 풀리고 패널이 닫힘. 패널 오른쪽 위에 닫기 단추도 붙임.

  • ㉗ 곡선 패널 하단 정보 줄이기내각만 남김(2026-09-12 사용자 지시). 「고정 없음」·「R ≥ 12m · L ≥ 5m」·「칸을 비우면 자동」은 지움 — 막는 일은 칸이 이미 함.

  • ㉘ 고른 등고선에 높이 라벨 — 등고선 한 줄을 고르면 그 줄에 높이값을 크게 붙임. 지금은 색만 바뀌고 숫자는 상태줄에만 있음.

  • ㉙ 회전 아이콘을 반원으로· 대신 반만 도는 화살표 모양으로 바꿈.

  • ㉚ 돌려도 글자는 바로 세움 — 180° 로 돌리면 글자가 뒤집혀 읽히지 않음(사용자 지적). 라벨마다 거꾸로 한 번 더 돌려 눈높이로 세움. ⓘ 비용은 거의 없음 — 화면에 나오는 라벨이 수십 개뿐이고 라벨 하나에 변환 한 번 더 얹는 정도라 그림 전체를 다시 그리는 값에 묻힘. 취소할 까닭이 없어 넣기로 함.

    자체검증 (2026-09-12, ORCA 내장 브라우저 · 프로젝트 5cff3920) — 열셋 다 화면에서 확인함. · 메인 창이 왼쪽으로 밀리고 오른쪽 세로 칸에 「횡단」·「이전 횡단」 두 판이 반씩 앉음. 화면이 좁으면(1500px 미만) 오른쪽 칸이 접히고 지도가 폭을 다 가짐. · 측점을 눌러 2+0.0 횡단(성토사면 좌 12.50m · 절토 24.80㎡)을 본 뒤 노드를 옮겨 놓으니 위 판이 새 값(좌 5.86m · 절토 41.21㎡)으로 바뀌고 아래 판에 옛 값이 그대로 남음 — 전후 비교가 됨. 끄는 동안에는 안 부름. · ⑳㉑ 제목이 「횡단 2+0.0」 — 누가거리가 아니라 구조물 목록과 같은 측점 표기임. 「계획고는 [확인] 뒤에…」 안내는 지워짐. · 좌하단이 「예상노선 1070.4m · 계획노선 1017.5m · 노드 26개」 — 서버 로그의 예상노선 연장 1070m 과 맞음. · ㉓㉔ [거리 재기]가 [되돌리기] 왼쪽에 구분선과 함께 섬. 두 점을 찍으면 지도 오른쪽 아래 작은 창에 값이 뜨고 곡선 패널은 숨음. 닫으면 잰 것이 지워지고 모드도 꺼짐. · 꼬였던 초록 띠가 풀림 — 누가거리로 자르니 a 에서 b 까지 노선을 그대로 따라감. · ㉖㉗ 노드를 고르면 패널이 뜨고 빈 곳을 누르면 닫힘, 닫기 단추도 붙음. 하단 정보는 「내각 162°」 한 줄만 남음(「칸을 비우면 자동」까지 지움). · 고른 등고선 위에 높이값(890m)이 크게 붙음. · ㉙㉚ 회전 아이콘이 반원 화살표로 바뀜. 180° 로 돌려도 글자가 모두 바로 섬(시점·종점·측점 번호·등고 높이) — 그림만 돌고 숫자는 눈높이. 되돌리려면 _Rotate.tsUPRIGHT_LABELSfalse 로만 바꾸면 됨. · 700줄 규정에 맞춰 모달 뼈대를 _Chrome.ts, 횡단 그리기를 _Cross_Draw.ts 로 떼어냄. 전체 시험 1318 통과 · 22 건너뜀.

사용자 확정 (2026-09-12)

  1. 「최소 길이」 = 곡선 길이 L.
  2. 하한은 아예 못 넘게 막음 — 0-2 의 「표시만」을 이 자리에서 뒤집음.
  3. 작업임도는 규정이 없어 하한 0 — 다만 설정값으로 두어 나중에 값만 바꾸면 바로 걸리게 함.
  4. ⑧ 은 별도 창 — 원지반 횡단선 · 기본 계획 횡단선 · 성토사면 길이 셋만. 구조물 없음. B06 로직 재사용.

⚠ 남은 가정 하나 — 평면 곡선 길이 L 의 하한은 법령·교본에 없음. 임도 종류별 설정값 자리만 만들고 전부 0 으로 열어 둠(작업임도와 같은 방식). 값이 정해지면 그 자리에 적기만 하면 됨.

0-8. ⚠⚠ 같은 프로젝트를 둘이 만지면 앞사람 설계가 통째로 지워짐 (2026-09-09 사용자 지시로 조사)

다른 프로젝트끼리는 안전함. 위험은 한 프로젝트를 둘이 만질 때만 생기고 그때는 크게 생김. 업로드 완료 판정이 clear_designing() · discard_initial_snapshot() · purge_project_outputs() 를 부르는데 누가 올렸는지 안 따짐 — B 가 파일 하나 올리면 A 가 며칠 만든 설계가 스냅샷까지 사라짐. 막는 가드(분석 중 차단 · 같은 이름 옛 행 내림)가 직행 /files 한 갈래에만 없음.

고칠 순서 (사용자 확인 대기)

  • 직행 /files 가드 — 이미 붙어 있었음(2026-09-09 확인) — 세 갈래가 같아졌음.

  • purge 전 확인 단계 — 이미 있었음(2026-09-09 확인) — 409 로 묻고 무엇이 지워지는지 알림.

  • 프로젝트 단위 업로드 잠금 표시(2026-09-09, 018ebe7f) — 「○○○ 님이 올린 자료를

    분석하는 중입니다」가 B03 에 뜸. 올리는 경로 넷 모두 시작한 사람을 실음. ⚠ 실제로 도는 분석 화면은 못 봤음 — 7장 V-21 로 넘겼음.

3-6. B06 구조물 추가 — 남은 것 (2026-09-05 조사 → 2026-09-08 정리)

선 것 — B06 에서 구조물 전 군(A~G) 배치 가능. B군(종단배수 6종)은 연장(m) 으로 common_util_structure_lengths.py 가 냄(겹친 구간 합침, 원래 합도 함께 냄). 종단·평면에 구간 띠 표시. 측구(옆도랑)는 횡단 설계가 ditch_area_m2 로 이미 세므로 구조물 수량에서 제외 (design_owner: 횡단 설계) — 또 세면 이중 계상.

  • 도수로·절토사면 배수로 — 보류 확정(2026-09-09) — 품셈에 그 공종이 없어

    배치만 받고 단가·일위대가를 안 만듦. 사유로 드러내 두는 것이 확정된 동작임.

3-16. 측구 토글 화면 실측 — 남겨 둔 것 (2026-09-09)

  • 측구 토글이 화면에서 도나(2026-09-09, 5907de85·2eb2c972) — 안 돌던 까닭은

    선택(ditch_choice)이 캐시·재계산·저장 patch·서버 스키마 넷 다에 없어 버려진 것. 이은 뒤 실측 — 끄면 절토 계 3.33 → 1.78㎡, 다시 켜면 3.90㎡. 저장이 옛 면적을 싣던 자리도 함께 고쳤음(저장 직전 전 측점 재계산).

확정 ② 벽 두께 — 식이 나왔음 (뒷길이 기반)

상부 두께 = 3 + 0.30                (3 = 뒷길이, m)
하부 두께 = 상부 + 0.30 × (H  1.0)

⚠ 돌조공(H=0.5)만 이 규칙 밖 — 다른 시설이라 따로 둘 것.

  • 표준도에 상부·하부 두께 칸(2026-09-09, 3a64bb5b) — 비우면 실무 구조물도 식,

    넣으면 그 값이 이김. 실측 — 상부 0.60 저장에 입적 24.375 → 20.625㎥, 비우니 복귀.

4-14. 시험 예외 목록 — 잔손질 하나

  • **spoil_bank 예외 두 줄 걷음**(2026-09-09, 0ff26d43) — 정본 사유가 덮고 있어

    목록 없이도 통과. ⚠ 같은 상태가 13 개 더 있음 — 그 파일을 손댈 때 함께 걷을 자리.

8-36. 수량·원가 화면 — 좌측 패널 일원화 + 데이터 분류·근거 호버 (2026-09-12 사용자 지시) — 모두 끝, 검증 대기

까닭 — 메인 화면에 뜨는 수많은 숫자가 어디서 왔고 어떻게 계산됐는지 화면에서 가릴 길이 없어 개발·검산이 막힘. 나아가 어느 값을 사용자가 고치게 열어 줄지도 분류가 없어 못 정함. 실측으로 드러난 것 셋 — B03~B07 은 좌측 그룹마다 ui-collapsible ui-sidebar-section(접히는 상자+공통 외곽선)에 바닥 고정 ui-sidebar-actions 를 쓰는데 B08 은 상자가 없고 B09 는 공통 클래스를 하나도 안 씀, B08 은 개발용 「확정 없이 다음으로」 줄에도 ui-sidebar-actions 를 붙여 공용 코드가 첫 번째 것을 집는 바람에(ui_template_overlay.ts:115) 스크롤 영역이 그 줄 안에 갇혀 패널 내용이 잘림, 근거 표기는 B08 구조물 원단위 표(「근거」·「출처」 열)와 B09 원가계산서(formula_text)에만 있고 토적표·집계표·운반표·일위대가는 맨 숫자뿐임.

  • ⓪-가. B09 좌측 패널 공통 틀로 교체 [데스크탑 보조]b09-panel__groupui-collapsible ui-sidebar-section, b09-panel__actionsui-sidebar-actions, 그룹 제목에 ui-collapsible__title. 만지는 파일은 B09_Estimation_UI_Page.ts 한 개뿐이고 B08_* 은 데스크탑 메인이 잡고 있어 손대지 말 것. 화면 판정 = 상자 제목 눌러 접힘 · [계산]·[확정] 이 바닥에 붙어 늘 보임 · 본문만 구름.

    자체검증 — ORCA 내장 브라우저(5174)에서 B09 화면을 통째로 띄워 실좌표로 잼. 상자 다섯(공사 조건·요율 판·관급자재·이윤 조정·수량) 모두 b09-panel__group ui-collapsible ui-sidebar-section, 제목 다섯에 ui-collapsible__title. ① 제목 클릭 = 상자 높이 332px → 44px, 캐럿 ▾ → ▸, 다시 눌러 332px 복귀. ② 액션 줄이 창 바닥(920px)에 붙음 — 스크롤 영역을 끝까지 내려도(226/226) 액션 줄 좌표 [863, 920] 그대로. ③ 스크롤은 안쪽 래퍼만(scrollHeight 964 / clientHeight 738), 패널 본체 scrollTop 0 — 잘리는 데 없음. 상자 꼴은 테두리 1px(공통 ui-sidebar-section 색) · 패딩 12px · 모서리 8px 로 B04~B07 과 같음. ⚠ b09-panel__group 은 기초자료 본문 표도 쓰므로 상자 CSS 는 .ui-sidebar-section 이 함께 붙은 것만 집음. 공용 파일(ui_template/B08_* 은 안 건드림. tsc --noEmit 통과.

  • ⓪-나. B08 좌측 패널 공통 틀로 교체 [데스크탑 메인] — 조건 칸을 접히는 상자 다섯으로 묶음(토량환산계수 / 지반 구성비·시공법 / 현장값(표토·층따기·사토장·용수·운반거리) / 규준틀·임목 / 부대시설). 개발용 줄은 ui-sidebar-actions 를 떼고 자체 클래스로 바꿔 짤림의 원인을 없앰. 같은 실수 재발을 막게 공용 splitSidebarActions마지막 액션 줄을 집게 고칠지는 B08 이 통과한 뒤 판단(B04~B08 전부에 닿음).

    자체검증(2026-09-12, 커밋 648bc528) — 상자는 다섯이 아니라 일곱이 됨(제목 여섯 + 무제목 하나). 제목을 따로 지어내지 않고 이미 있던 제목 줄을 그대로 상자 제목으로 옮긴 까닭임 — 표토제거 · 구조물·사토 · 부대시설 개소 · 규준틀 개소당 재료 · 임목파쇄 · 콘크리트 타설 여섯과, 산출법 한 줄·토량환산계수 구획을 담는 무제목 상자 하나임(토량환산계수는 제 제목을 제 안에 들고 있어 제목을 둘로 만들지 않음). 지반 구성비·반영률 상자는 표가 있어야 서는 칸이라 이번 측정에는 안 뜸 — 표가 붙으면 같은 규칙으로 상자가 둘 더 섬.

    측정(ORCA 내장 브라우저 5173, 모듈을 직접 불러 패널을 그림) — 스크롤 래퍼가 패널 직계로 돌아옴(scrollParent = b08-quantity__panel ui-sidebar-fill, 전에는 개발용 줄 안) · .ui-sidebar-actions1개만 남음(전 2개) · [저장]·[확정] 줄 바닥 920px = 패널 바닥 920px = 창 높이 920px 로 잘림 없음 · 스크롤은 안쪽 래퍼만 · 「구조물·사토」 제목 클릭에 상자 높이 511px → 42px → 511px 로 접힘·펼침. tsc --noEmit 통과 · pytest -q 1294 passed.

    곁들이로 잡은 것 — 표를 못 받은 경우(table === null) concrete_placing 접근에서 터져 페이지가 통째로 백지가 되던 것을 ?. 로 막음. 정작 보여야 할 「표를 못 불렀다」 안내까지 같이 사라지던 자리임.

    남은 것 — 토량환산계수 구획의 접힘은 표가 있어야 그 구획이 서므로 로그인한 화면에서 한 번 더 볼 것. 공용 splitSidebarActions 를 「마지막 액션 줄」로 바꿀지는 아직 안 건드렸음(B04~B08 전부에 닿음).

  • ①. 출처 등급 여섯 못 박기입력(사용자가 넣음) · 측량(앞 단계 B05·B06 이 낳음) · 기준(법·품셈·단가판, 고정) · 계산(위 셋으로 만든 중간값) · 최종(내역서·원가로 나가는 값) · 막힘(근거가 없어 못 세움). ⚠ 이 여섯이 뒤에 오는 모든 사전의 밑동이라 B08 토적표로 먼저 검증한 뒤 B09 로 넘김.

    자체검증(2026-09-12) — 등급을 여덟으로 못 박음. 사람이 고르는 여섯(input·survey·standard·calc·final·blocked)에, 사전이 쓰는 둘을 더함. 정의처는 common_util/common_util_provenance.py 한 곳뿐임.

    여섯으로 모자랐던 자리 둘 — 양쪽 조사에서 같이 나옴excluded(제외) 신설 — 데스크탑 보조의 B09 조사 ㉱. 내역서의 「우리 줄이 아닌 것」(not_our_row)·검산용 제외 줄·자재대의 안 갈린 것은 못 세운 것이 아니라 세면 안 되는 것이라 blocked 와 뜻이 정반대임. 둘을 한 등급에 두면 사용자가 빈 칸을 채우려 들고 그것이 곧 이중계상임(8-7). 색도 다르게 줌 — blocked 는 붉은 띠, excluded 는 회색 빗금. ㉡ rule(채택 규칙) 칸 신설 — 같은 조사 ㉯. 안전관리비 A·B 중 작은 쪽, 자재단가 다섯 중 적용처럼 값 안에 선택이 숨은 열은 calc 로만 적으면 「왜 그것을 골랐나」가 사라짐. 열 사전에는 규칙만 적고 후보값은 줄 쪽으로 내려보냄.

    토적표에는 final(최종) 열이 없음 — 억지로 안 붙임. 이 표는 중간 장부이고 내역서로 나가는 값은 토공집계표에서 섬. 실제로 붙은 것은 survey 여섯 열(단면적 넷 + 측점) · calc 열넷뿐임. 여섯을 한 장에 다 채우려고 아무 열에나 final 을 붙이면 「분류가 있다」는 거짓만 남음.

    측정(ORCA 내장 브라우저 5173, 토적표 모듈에 실제 사전을 물려 그림) — 사전 20열 · 표시된 칸 40개(2줄 × 20열) · 등급 갈래 survey 12 / calc 28 로 열 성격대로 갈림. 호버 카드에 「절토 토사 보정량 · 계산 · 값 45.00 · 식 절토 토사 입적 × 토량환산계수(다짐) · 원천 기본값 정의처 · 자리 EarthworkTable.py:210」 이 그대로 뜸. 토글은 켜면 is-prov-tinted 가 붙고 칸 배경이 투명 → 초록 7 %, 왼쪽 띠 inset 3px, 다시 누르면 꺼짐.

    고쳐 잡은 것 — 줄 사유(측구 안분 폴백)가 그 줄의 모든 칸에 뜨던 것을 그 사유가 닿는 열(ditch_*)에만 뜨게 막음. 「절토 보정량」 카드에 「측구 가름값이…」 가 떠서 읽는 사람을 속이던 자리임. 사유가 늘면 엔진이 「어느 열에 닿는 사유인가」를 같이 내는 쪽이 맞음.

    시험 resources/tester/test_b08_provenance.py 8개 추가 — 값어치는 첫 번째에 있음: 사전 열 이름이 전부 실제 EarthworkRow 에 있는가. 엔진이 열 이름을 갈면 사전만 옛것으로 남는데 화면에서는 카드가 그냥 안 떠서 눈에 안 띔. 배포환경에서 None 이 나오는 것도 시험으로 박음. 등급 여섯은 한 페이지가 아니라 두 페이지를 합쳐야 다 쓰임 — 토적표엔 final 이 하나도 없고(중간 장부), B09 에는 원가계산서의 총원가·도급금액·총계·내역 금액·자재대 금액으로 분명히 있음(데스크탑 보조 확인). 한 장에서 여섯이 다 안 보인다고 등급을 줄이지 말 것.

  • ②. 등급 색칠 토글 — 셀 왼쪽 얇은 띠 + 옅은 배경. 여섯 색이 늘 켜져 있으면 표가 알록달록해 실무 시트 대조를 방해하므로 평소엔 꺼 두고 토글로 켬. 토글 단추는 시트 탭 줄에 둠(좌측 패널이 아님 — 패널 작업과 파일이 겹치지 않게).

  • ③. 칸 단위 근거 호버 — 마우스가 그 숫자 칸에 올라가면 카드가 뜸. 카드에 등급 · 값 · 식 · 원천 · (개발 빌드만) 파일:줄. 줄마다 갈리는 것(막힌 사유 · 폴백 안분 같은 것)은 그 칸에 따로 얹힘.

  • ④. 사전은 서버가 듦 + 배포 빌드에서 끊음 [로직 보안] — 「어디서 와서 어떻게 계산됐나」의 정답은 엔진이 아는 것이라 화면 TS 에 손으로 적으면 엔진을 고칠 때 설명만 옛것으로 남음. 새 파일 B08_Quantity_Provenance.py열 단위 사전을 두고 응답에 실음(칸마다 만들면 토적표 한 장이 30열×200줄=6천 칸이라 응답이 붐 — 겉보기는 칸 단위 그대로임). ⚠ 화면에서 숨기는 것으로는 보안이 안 됨 — API 로 그대로 뚫림. 배포 빌드에서는 서버가 사전을 아예 안 실어 보냄, 문은 이미 있는 ENVIRONMENT(common_util_dev_unlock 과 같은 방식)를 그대로 씀. 토글 단추도 개발 빌드에만 뜸.

  • ⑤. 원천은 글로만 적음 — 자동 이동은 보류 — 카드에 「원천: B06 횡단 NO.12+5」라고 적기만 함. 눌러서 그 화면·그 측점으로 이동하는 것은 지금 못 함 — B05·B06 이 「어느 측점을 보여 달라」를 밖에서 받는 문이 없고(측점 선택이 화면 안 변수로만 있음), 노선을 다시 탐색하면 측점 번호가 어긋나 엉뚱한 데로 감. 뒤에 붙일 때는 측점 번호가 아니라 측점 id 로 짚을 것.

    자체검증 ②③④⑤ (2026-09-12, 커밋 6e8de279·c94e7773·e1927423) — 뼈대는 공용 두 파일에 한 벌로 섬. common_util/common_util_provenance.py(등급 여덟 · ColumnProvenance · provenance_payload)와 ui_template/ui_template_provenance.ts(호버 카드 · 등급색 · 토글). B08·B09 가 같은 것을 씀.

    ② 토글 — 시트 탭 줄 끝. 평소 꺼짐, 켜면 칸 왼쪽 3px 띠 + 옅은 배경. 측정: 켬 is-prov-tinted 붙고 배경 투명 → 초록 color(srgb 0.12 0.54 0.30 / 0.07), 다시 끔 복귀. ⚠ 사전이 안 오면 단추 자체를 안 세움 — 배포 빌드에 빈 단추가 남지 않음.

    ③ 칸 단위 호버 — 카드에 등급·값·식·원천·채택·자리. 겉보기는 칸 단위지만 사전은 열 단위라 응답이 안 붐(토적표 한 장이 6천 칸). 같은 열이라도 줄마다 성격이 갈리는 자리는 칸 등급이 열 등급을 이김 — 원가계산서 「금액」 26칸 중 셋(총원가·도급공사비·총공사비)만 final, 토공집계 「계」의 무대 줄만 excluded, 준비공 「수량」의 못 세운 줄만 blocked. 배지와 띠가 같은 말을 하게 fill() 이 칸 등급을 먼저 봄(c94e7773).

    ④ 로직 보안 — 문은 provenance_payload() 하나. 개발환경이 아니면 None 이고 라우터가 응답에서 칸을 통째로 뺌. ⚠ 화면에서 숨기는 것이 아니라 안 보내는 것 — API 를 직접 불러도 안 나옴. 문의 정본은 is_dev_environment() 한 곳으로 통일(개발용 문이 두 벌이면 한쪽만 닫히는 날이 옴). 배포환경 None 은 시험으로 박음.

    ⑤ 원천은 글로만 — 카드 「원천」 줄에 어느 표·어느 단계가 낳았는지 적음. 자동 이동은 안 붙임(보류 근거는 항목 본문).

  • ⑥. 사전 채우기 — B08 여섯 장 · B09 열여섯 장양쪽 다 닫힘.

    B08(데스크탑 메인, e1927423) — 여섯 장 48열: 토적표 20 · 토공집계 5 · 운반 5 · 준비공 5 · 자재총괄 7 · 구조물 원단위 6. 화면 판정(ORCA 5173, 실제 사전을 물려 다섯 표를 그림): 집계 정상줄 final / 무대줄 excluded · 운반 정상 calc / 무대 excluded · 준비공 정상 calc / 값 없는 줄 blocked · 자재 총수량 final · 관급사급 input · 원단위 수량 calc. 시험 12개(test_b08_provenance.py) · pytest -q 1317 passed.

    B09(데스크탑 보조, d1a25080·aadb4f67) — 열여섯 장 92열. 등급 여덟이 전부 쓰임(standard 52 · calc 19 · excluded 7 · unclassified 7 · final 2 · input 2 · survey 2 · blocked 1). 화면 판정에서 나온 것: 자재단가대비표 slot_price 6칸 중 값 없는 5칸이 blocked 로 서서 「0원」과 「그 판에 그 품목이 없음」이 색으로 갈림 · 산출기초는 모으는 표라 카드에 「식」 줄이 아예 없음(값·원천·자리만) · 기초자료 실데이터 4,392칸 표시.

    사전 대상에서 뺀 둘 — 설계서 구성표(프로젝트가 낳은 값이 아니라 문서 목록) · 산출 조건 패널(표가 아니라 입력 칸이고 칸 밑 hint 가 이미 같은 일을 함). 없는 것을 지어내면 거짓만 남음.

    등급 여섯은 한 장이 아니라 여러 장을 합쳐야 다 쓰임 — 토적표엔 final 이 하나도 없고(중간 장부) B09 원가계산서·내역서·자재대에 몰림. 한 장에서 여섯이 다 안 보인다고 등급을 줄이지 말 것. 이 갈림은 시험으로 박음.

  • ⑦. B09 내역서 「비고」 사유 유실 — 고침 [데스크탑 보조]

    덮어쓰던 열세 곳 + 이어 붙이던 일곱 곳을 조각 배열 notes 로 옮기고 조각마다 닿는 열 키를 함께 실음. 화면 「비고」 칸은 조각을 종전 꼴(/ 이음)로 되뽑는 property 라 눈에 보이는 것은 안 바뀜 — 토글 끈 사용자도 그대로 봄. 판정: 같은 줄에서 규격 카드엔 「갈래: 토사」만, 수량 카드엔 반영률 문구만, 단가 카드엔 단산 번호만, 금액 카드엔 줄 사유 없음. 줄 전체에 걸리는 사유(열 키 빈 것)만 세 칸 모두에 붙음.

    줄 사유는 그 사유가 닿는 열에만 붙일 것 — B08 에서 줄 사유를 그 줄 모든 칸에 띄웠다가 「절토 보정량」 카드에 「측구 가름값이…」 가 떠서 읽는 사람을 속인 자리가 있었음(2026-09-12 실측 후 고침).

    앞작업 — B09 원천 조사표 완료 (2026-09-12, 데스크탑 보조) · 조사표 탭 열 개(살아 있는 아홉)의 화면 열마다 이름·원천(파일:줄)·식·등급 후보를 적음. 이미 있어 그대로 쓸 것 넷 — formula_text(원가계산서 식) · source_label(일위대가 원천) · base_label(법정경비 밑수) · 산출기초 ③ work_item_basis. 나머지 표는 식·원천·등급이 통째로 없음. ⚠ 등급 여섯에 안 맞는 것 일곱 갈래를 조사표 6장에 모음. 가장 확실한 어긋남은 ㉱ — 「여기서 안 세는 줄」(not_our_row · 검산용 제외 줄 · 관급사급 안 갈린 것)이 막힘 과 뜻이 정반대라 일곱째 등급 「제외」가 필요해 보임. 이 결정이 나머지보다 앞섬 — ① 을 굳힐 때 함께 볼 것.

    B09 배선 완료 (2026-09-12, 데스크탑 보조). 데스크탑 메인이 낸 공용 한 벌 (common_util_provenance.py · ui_template_provenance.ts) 위에 B09 쪽만 얹음. 공용 두 파일은 안 건드림 — 그 창 소관.

    ① 비고 덮어쓰기 버그 먼저 고침 (사전보다 앞세우라는 지시). BillRow.note 한 칸에 덮어쓰던 열세 곳 + 이어 붙이던 일곱 곳을 조각 배열 notes 로 옮김. 조각마다 닿는 열 키를 함께 실음(규격·수량·단가·금액·줄전체). 화면 「비고」 칸은 조각을 종전과 같은 꼴(/ 이음)로 되뽑는 property 라 눈에 보이는 것은 안 바뀜. ⇒ 한 줄에 사유가 둘이면 하나가 사라지던 것이 멈춤.

    ② 열 사전 B09_Estimation_Provenance.py (새 파일 — 기존 B09 파일이 700줄 초과). 8장 57열 — 원가계산서 5 · 내역서 8 · 일위대가 목록 6/본표 9 · 자재대 7 · 자재대(안 갈린 것) 7 · 중기 9 · 기초자료 목록표 6. 이미 있던 formula_text · source_label · base_label 은 그대로 쓰고 없는 것만 새로 적음. ③ 배선 라우터 5개 응답에 _with_provenance() (개발환경 아니면 칸 자체를 안 만듦) · 표 여섯에 markProvenanceCell + attachProvenance · ④ 등급색 토글은 탭 줄 끝.

    자체검증 — ORCA 내장 브라우저(5174)에서 진짜 사전 JSON(12.7KB)을 서버에서 뽑아 페이지 fetch 에 물리고 실제로 눌러 봄. · 원가계산서 3줄×5열 = 15칸 표시, 등급 standard·calc·unclassified 셋. · 내역서 그룹줄 0칸(값이 없으니 카드도 없음) · 잎줄 각 8칸 · 사유 실린 줄 2개. · 닿는 열 판정 통과 — 같은 줄에서 규격 카드엔 「갈래: 토사」만, 수량 카드엔 「반영률 80%…」만, 단가 카드엔 「단산 46」만, 금액 카드엔 줄 사유 없음. · 자재대 「안 갈린 것」 표는 일곱 열이 모두 excluded, 줄 전체 사유는 세 칸 모두에 붙음. · 토글 = 끔 box-shadow:none → 켬 excluded 회색 rgb(156,163,175) · final 금색 rgb(184,134,11) 3px inset → 다시 끔 none. sessionStorage 에 저장됨. · 사전 안 온 탭은 표시 0칸·오류 없음. 카드는 mouseout 에 닫힘. · tsc --noEmit 통과 · pytest 187 passed(b09·bill·boq·haul).

    남긴 어긋남 — 등급이 열에 하나뿐이라 못 적은 자리 원가계산서 「금액」은 같은 열 안에서 중간줄(간접노무비 등)과 마지막줄(총원가·도급금액· 총계)의 성격이 갈리는데 등급은 열에 하나임. calc 로 두고 rule 에 어느 줄이 final 인지 적어 둠. 칸 단위 등급이 필요한 첫 자리 — 공용 fill() 이 배지를 column.tier 로만 그려서 칸에 다른 등급을 심어도 배지가 안 따라옴(공용 파일이라 안 고침, 메인 창에 알림).

    아직 사전이 없는 장 — 단가산출근거·설계서 구성·산출기초·환율및기초자료· 자재단가대비표·산출 조건. 앞 넷은 값을 낳는 표가 아니라 모으는 표라 열 사전보다 「사전 대상인가」를 먼저 정해야 함(조사표 6장 ㉴).

    2차 — 남은 여섯 장 가름 완료 (2026-09-12, 두 창 합의). 넷 붙이고 둘은 뺌. · 붙임 자재단가대비표(「적용」이 원천 다섯 중 하나를 고르는 자리라 calc+rule, 값 빈 칸은 blocked) · 환율및기초자료(standardinput 이 갈리는 장) · 단가산출근거·산출기초(모으는 표라 식은 비우고 source·등급만). · 설계서 구성표(프로젝트 값이 아니라 개발 진척표 — 조사표 ㉴) · 산출 조건 패널(표가 아니라 입력 칸이고 칸 밑 근거 한 줄이 이미 같은 일을 함). ⇒ 사전 16장 92열. 등급 여덟이 전부 쓰임 — standard 52 · calc 19 · excluded 7 · unclassified 7 · final 2 · input 2 · survey 2 · blocked 1.

    칸 단위 final 심음 — 원가계산서 총원가·도급금액·총계 세 줄. 메인 창이 공용 fill() 을 고쳐 배지도 칸 등급을 따라오게 함. 나머지 칸은 열 등급을 그대로 넘김 (공용 채움이 없는 판에서도 띠가 붙게 여기서 명시).

    700줄 넘어 셋으로 가름B09_Estimation_Provenance.py(457줄, 값을 낳는 장 여덟) · _Sources.py(268줄, 바깥에서 오거나 모으는 장) · _Common.py(53줄, 두 쪽이 같이 쓰는 이름표·비고 조각 — 한쪽에 두면 불러들이기가 고리를 이룸).

    자체검증 2차 — 백엔드를 새로 띄우고(stale:false) 진짜 서버 응답으로 잼. · /estimation/base-data16장을 그대로 실어 보냄. · 기초자료 탭 실데이터에서 4,392칸 표시(목록표 셋), 등급 standard·unclassified. · tsc --noEmit 통과 · pytest 187 passed. · 자재단가대비표 slot_price 6칸 중 값 없는 5칸이 blocked — 「0원」이 아니라 「그 판에 그 품목이 없다」가 색으로 드러남. 「적용」 칸은 0 — 슬롯 6 이 곧 적용 단가라 그 자리에 값이 서면 칸을 따로 안 세움(정상). · 환율및기초자료 시간당 3칸 calc · 유가 적용 범위 1칸 input · 일당·산식·단가· 기준일·자료 모두 붙음. 한 탭에 등급 다섯(standard·unclassified·blocked·calc·input). · 산출기초 지문 12칸 unclassified · 못 채운 사유 105칸 blocked · 근거 65칸 standard. 모으는 표 카드에 「식」 줄이 아예 없음(값·원천·자리만) — 없는 식을 지어내지 않은 것이 화면에서 확인됨. · 칸 단위 final 원가계산서 금액 26칸 중 정확히 셋(총원가·도급공사비·총공사비)이 final, 나머지 23칸 calc. 띠 색 최종 rgb(184,134,11) · 계산 rgb(31,138,76). · 배지 어긋남 해소 확인 — 메인 창의 공용 fill() 고침(c94e7773)을 받은 뒤 다시 잼. 총원가 칸 카드 「금액최종」 · 재료비 칸 카드 「금액계산」 — 띠와 배지가 같은 말을 함. 금액 26칸이 final 3 · calc 23 으로 갈리고, 등급을 안 심은 「비목」 칸은 공용이 열 등급(standard)으로 채워 띠가 붙음(rgb(97,94,110)). ⚠ 서버는 uvicorn StatReload 가 멈춰(main.py 가 리로드마다 프론트 빌드를 다시 돌림) 옛 코드로 굳어 있어, 라우터 두 곳은 함수를 직접 불러 응답을 받아 그 실제 응답으로 잼 (둘 다 사전 16장 실림 확인). 프로세스 종료가 창 권한에 막혀 재시작은 사용자 몫.

새 코드를 옛 파일에 넣지 말 것B08_Quantity_Engine_UnitQuantity.py(1606줄) · B09_Estimation_UI_Page.ts(1415줄) · B09_Estimation_UnitPrice.py(1173줄) · B09_Estimation_UI_BaseData.ts(1080줄) 가 이미 700줄을 크게 넘김. 사전·호버는 새 파일로 뺄 것.

8-36 ⑧. 실제 화면 통합 검증 (2026-09-12, 데스크탑 메인) — 끝

지금까지의 판정은 모듈을 직접 띄워 꾸민 자료로 잰 것이었음. 사용자 지시로 로그인한 진짜 화면·진짜 서버 응답으로 한 바퀴 다시 돌았음. 백엔드를 새로 띄워(stale:false, code_mtime == source_mtime) 옛 코드로 헛검증하는 일을 막았음.

  • B08 좌측 패널 — 상자 아홉(제목 여덟 + 무제목 하나). 제목: 암 갈래 구성비 · 반영률 · 표토제거 · 구조물·사토 · 부대시설 개소 · 규준틀 개소당 재료 · 임목파쇄 · 콘크리트 타설. ⚠ 앞서 모듈 검증에서 일곱이던 것이 아홉이 된 까닭은 표가 있어야 서는 상자 둘(암 갈래 구성비·반영률)이 실데이터에서 섰기 때문임 — 예상대로임. 「암 갈래 구성비」 제목 클릭에 258px → 42px → 258px. 스크롤 래퍼는 패널 직계(b08-quantity__panel ui-sidebar-fill)이고 실제로 구름. [저장]·[확정] 바닥 920px = 패널 바닥 920px = 창 920px — 잘림 없음. 토량환산계수 구획도 제 제목으로 접힘(실데이터에서만 서는 자리라 이번에 처음 확인).
  • B08 여섯 장 전부에 등급이 붙음 — 모두 1,914칸 · 토적표 1,240(측량 372 · 계산 868) · 토공집계 85(기준 68 · 최종 15 · 제외 2) · 운반거리 30(계산 26 · 제외 4) · 준비공 70(기준 42 · 계산 23 · 막힘 5) · 구조물 원단위 426(측량 142 · 기준 213 · 계산 71) · 자재총괄 63(기준 27 · 계산 9 · 최종 9 · 입력 18). 탭마다 카드가 실제로 떴고 식·원천·자리가 그 장의 엔진을 가리킴.
  • 칸 등급이 열 등급을 이기는 자리가 실데이터에서 확인됨 — 토공집계 「계」 열 안에서 정상 줄은 최종, 무대(소운반 20m) 줄만 제외 2칸. 운반표도 같은 줄의 토량·거리 둘이 제외. 준비공은 값을 못 세운 줄 5칸이 막힘.
  • B09 좌측 패널 — 상자 다섯(공사 조건 · 요율 판 · 관급자재 · 이윤 조정 · 수량) 모두 접힘(332px → 44px → 332px). [재계산]·[확정] 바닥 920px. 스크롤 래퍼 b09-panel ui-sidebar-fill.
  • B09 사전이 서버 응답에 실림unit-prices·base-data·price-sources·basis-sheet·bill 다섯 응답 모두 provenance.sheets 16장. 화면: 일위대가 1,740칸(기준 580 · 계산 1,160) · 산출기초 623칸 · 원가계산서 130칸(기준 52 · 계산 49 · 미분류 26 · 최종 3).
  • 배지와 띠가 같은 말을 함(c94e7773 확인) — 원가계산서 같은 「금액」 열에서 총원가 = 배지 「최종」 · 띠 금색 rgb(184,134,11), 재료비 = 배지 「계산」 · 띠 초록 rgb(31,138,76).

남긴 것 · 되돌린 것

  • 원가계산서·내역서는 이 프로젝트에 원가가 안 돌아 있어 빈 표였음 → [재계산]을 눌러 26줄을 세운 뒤 쟀음. 데스크탑 메인 검증 프로젝트(79da822d…)라 남의 자리가 아님.
  • 검증 뒤 브라우저가 쓰던 값을 그대로 되돌림 — frd_current_project_id 를 원래 값(26275834…)으로, 등급색 토글(aislo.provenance.tint)은 지움.
  • 백엔드(8000)를 다시 띄웠음. 옛 코드로 굳어 있었음(stale:true, started_at 이 이틀 전). 이 PC 의 로그인 세션이 끊겼을 수 있음.

9-11. 사용자 확정 5차 — 반영 상태 (2026-09-09 밤, 중간 점검 시점)

  • [반나절] 돌 무게 인자표 — 이미 들어가 있었음(252e6b54). 계산식이 기본, 야면석만 관측표.

    야면석은 뒷길이 25·30·60·75 에 원본 값이 없어 그 규격에서 돌 줄이 안 서고 사유만 남음.

  • [잔손질] 공구손료 칸 — 세웠음(83c842e3). 기본은 빔 = 안 붙음.

    지금은 넣어도 붙을 밑수가 없음 — 일위대가에 주재료비가 선 공종이 0개(사급 자재 단가 대기).