From 521e792a59b7e61721f1bbd334b2d513e115069a Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 12 Sep 2026 18:36:22 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat(b06):=20=EC=A2=85=EB=8B=A8=20=EA=B3=84?= =?UTF-8?q?=ED=9A=8D=EC=84=A0=20=ED=8E=B8=EC=A7=91(=E2=96=B2/=E2=96=BC)?= =?UTF-8?q?=EC=9D=84=20B06=20=EC=97=90=EB=8F=84=20=EB=B6=99=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit B05·B06 종단을 같은 템플릿으로 맞추면서 **계획선 편집 버튼층만 빠져 있었음** — B06 에는 편집분을 얹어 계획선·전 측점 횡단을 다시 푸는 코드도, 편집 초안 세션도 이미 있었는데 누를 버튼이 없었음. B05 와 같은 부품(createEditOverlay)을 종단 그래프에 얹고, 누른 값은 B05 와 같은 세션 초안에 쌓음. 누르는 즉시 계획선·횡단을 다시 풀어 카드에 반영함. 저장도 이었음 — 종전에는 B06 이 초안을 읽기만 해서, B06 에서 [저장]·[확정]하면 계획선 편집이 정본에 안 남고 다음 진입 때 사라졌음. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Fe1QWPTfw11PaKh2LjwXdR --- B06_Section/B06_Section_UI_Page.ts | 47 ++++++++++++++++++- B06_Section/B06_Section_UI_Page_Persist.ts | 21 +++++++++ B06_Section/B06_Section_UI_Section_View.ts | 20 +++++--- .../B06_Section_UI_Section_View_Chart.ts | 4 +- .../B06_Section_UI_Section_View_Draw.ts | 27 +++++++++++ 5 files changed, 111 insertions(+), 8 deletions(-) diff --git a/B06_Section/B06_Section_UI_Page.ts b/B06_Section/B06_Section_UI_Page.ts index 5bc343a5..78a37c90 100644 --- a/B06_Section/B06_Section_UI_Page.ts +++ b/B06_Section/B06_Section_UI_Page.ts @@ -35,7 +35,17 @@ import { type SectionPersistContext, } from "./B06_Section_UI_Page_Persist"; import { maxToeFitHalfWidth } from "./B06_Section_UI_Cross_Fit"; -import { readAlignmentDraft } from "../B05_Profile/B05_Profile_UI_Profile_Edit"; +import { + createProfileEditStore, + readAlignmentDraft, + type ProfileEditStore, +} from "../B05_Profile/B05_Profile_UI_Profile_Edit"; +import { readAlignment } from "../B05_Profile/B05_Profile_UI_Profile_Data"; +import { + adjustStation, + buildAlignment, + toAlignmentBase, +} from "../B05_Profile/B05_Profile_UI_Profile_Alignment"; import { readStructurePick, writeStructurePick, @@ -481,6 +491,41 @@ export async function renderB06ProfileCross(root: HTMLElement): Promise { ); // 좌측 목록이 넘겨 준 구조물을 종단 알약 레인으로 보낸다(표시 통일). structureMarksSink = (structures, types) => sectionView.setStructureMarks(structures, types); + /** + * 계획선 편집(▲/▼) — B05 와 **같은 세션 초안**에 쌓는다(2026-09-12 사용자: B06 에만 + * 버튼이 없었다). 누르면 그 자리에서 계획선·전 측점 횡단을 다시 풀고(`reconcileStale…`), + * 영구저장은 [저장]·[확정]에서만 한다(CLAUDE.md 5장). + */ + let gradeStore: ProfileEditStore | null = null; + let gradeRouteId: number | null = null; + const gradeEditFor = (): ReturnType< + NonNullable[0]> + > => { + const detail = sectionDetail; + if (!detail || currentRouteId === null) return null; + const stored = readAlignment(detail.longitudinal); + if (!stored) return null; // 선형 저장분이 없는 옛 노선 — 편집할 기준선이 없다. + if (!gradeStore || gradeRouteId !== currentRouteId) { + gradeRouteId = currentRouteId; + gradeStore = createProfileEditStore(currentRouteId, stored.edits, () => undefined); + } + const store = gradeStore; + const base = toAlignmentBase(stored); + const alignment = buildAlignment(base, store.edits()); + return { + alignment, + stepM: alignment.policy.edit_step_m, + onStation: (chainageM, delta) => { + store.replace(adjustStation(base, store.edits(), chainageM, delta)); + // 편집분은 세션 초안에 있으므로 재계산이 그것을 그대로 읽는다(강제로 한 번). + void reconcileStaleDesigns({ force: true }).then(() => + sectionView.setGradeEdit(gradeEditFor), + ); + }, + }; + }; + sectionView.setGradeEdit(gradeEditFor); + // 종단 그래프 우클릭 — B05 와 같은 메뉴로 넣고 뺀다(2026-09-12 사용자: B05·B06 은 한 // 페이지라 같은 자리에서 되어야 한다). 어느 길로 들어와도 좌측 「구조물 배치」와 // 같은 함수를 타므로 목록·폼·알약이 함께 선다. diff --git a/B06_Section/B06_Section_UI_Page_Persist.ts b/B06_Section/B06_Section_UI_Page_Persist.ts index 6e99d8be..b2827081 100644 --- a/B06_Section/B06_Section_UI_Page_Persist.ts +++ b/B06_Section/B06_Section_UI_Page_Persist.ts @@ -18,6 +18,11 @@ import { } from "./B06_Section_Api_Fetch"; import { invalidateSectionDetail } from "./B06_Section_Section_Store"; import { flushPendingPipes } from "../B05_Profile/B05_Profile_Api_Pipes_Draft"; +import { saveProfileAlignment } from "../B05_Profile/B05_Profile_Api_Fetch"; +import { + clearAlignmentDrafts, + readAlignmentDraft, +} from "../B05_Profile/B05_Profile_UI_Profile_Edit"; import { flushPendingStructures } from "../B05_Profile/B05_Profile_Api_Structures"; import { flushUphillOverrides } from "../B05_Profile/B05_Profile_Api_Fetch"; import { buildCrossPatches, type CrossPatchSources } from "./B06_Section_UI_Page_Patches"; @@ -418,6 +423,15 @@ export function collectSectionEdits(ctx: SectionPersistContext): { }; } +/** 계획선 편집 초안이 있으면 종단 정본에 쓰고 초안을 지운다. 없으면 아무 일도 하지 않는다. */ +async function flushAlignmentDraft(projectId: string, routeId: number | null): Promise { + if (routeId === null) return; + const draft = readAlignmentDraft(routeId); + if (!draft) return; + await saveProfileAlignment(projectId, routeId, draft); + clearAlignmentDrafts(); +} + /** 세션에 쌓인 조정창·구조물 조작을 정본으로 내보낸다 — [저장]·[확정] 공통 앞단. */ async function flushPendingEdits(ctx: SectionPersistContext, projectId: string): Promise { // ⚠ 순서는 **B05 [임시저장]과 같아야 한다**(2026-09-12 사용자: 어느 페이지에서 저장해도 @@ -439,6 +453,13 @@ async function flushPendingEdits(ctx: SectionPersistContext, projectId: string): // B05에서 만지고 넘어온 구조물 조작분도 여기서 정본에 남긴다. 실패해도 횡단 // 저장까지 막지는 않는다 — 미저장분은 세션에 남으므로 다시 시도할 수 있다 // (2026-08-29 실측: 타입이 거절되자 sections/save가 아예 나가지 않았다). + // 계획선 편집(▲/▼)은 세션 초안에만 있다 — B06 에서 고쳤든 B05 에서 고쳤든 여기서 + // 종단 정본으로 내보낸다(2026-09-12). 종전에는 B06 이 초안을 **읽기만** 해서, B06 에서 + // 저장하면 계획선 편집이 다음 진입 때 사라졌다. + await flushAlignmentDraft(projectId, ctx.routeId()).catch((error) => { + const detail = error instanceof Error ? ` ${error.message}` : ""; + showToast(`계획선 저장에 실패했습니다.${detail}`, "error"); + }); await flushPendingStructures(projectId).catch((error) => { const detail = error instanceof Error ? ` ${error.message}` : ""; showToast(`구조물 저장에 실패했습니다.${detail}`, "error"); diff --git a/B06_Section/B06_Section_UI_Section_View.ts b/B06_Section/B06_Section_UI_Section_View.ts index ba24ec2d..1466a6c3 100644 --- a/B06_Section/B06_Section_UI_Section_View.ts +++ b/B06_Section/B06_Section_UI_Section_View.ts @@ -45,7 +45,11 @@ import { import { CROSS_HEIGHT } from "./B06_Section_UI_Section_Common"; import { STRUCTURE_LANE_HEIGHT_PX } from "../B05_Profile/B05_Profile_UI_Structures_Marks"; import type { SectionStructureEdit } from "./B06_Section_UI_Section_View_Menu"; -import { attachWindowScroll, drawLongitudinalPanel } from "./B06_Section_UI_Section_View_Draw"; +import { + attachWindowScroll, + drawLongitudinalPanel, + type LongitudinalPanelInput, +} from "./B06_Section_UI_Section_View_Draw"; import { type StructureInstance, type StructureType, @@ -118,6 +122,8 @@ export interface SectionViewController { /** 종단 그래프 우클릭으로 구조물을 넣고 빼는 길 — 없으면 메뉴가 안 뜬다 * (2026-09-12 B05·B06 일원화). */ setStructureEdit: (edit: SectionStructureEdit | null) => void; + /** 계획선 편집 ▲/▼ — 그릴 때마다 불러 지금 선형·편집 함수를 받는다(null = 버튼 없음). */ + setGradeEdit: (provider: (() => LongitudinalPanelInput["grade"]) | null) => void; dispose: () => void; } @@ -151,6 +157,7 @@ export function createSectionView( let markStructures: ReadonlyArray = []; let markTypes: ReadonlyArray = []; let structureEdit: SectionStructureEdit | null = null; + let gradeEditProvider: (() => LongitudinalPanelInput["grade"]) | null = null; let renderWidth = 0; let resizeTimer = 0; let panelResizeTimer = 0; @@ -508,6 +515,7 @@ export function createSectionView( naturalSpoilSlope: currentNaturalSpoilSlope, selectStation: (stationId) => selectStation(stationId, true), setMassBadge: (values) => massBadge.set(values), + grade: gradeEditProvider?.() ?? null, }); // 상단 패널이 sticky라 선택 카드가 그 아래로 숨는다 — 패널 높이만큼 스크롤 여백을 잡아 준다. syncScrollMargin(); @@ -525,11 +533,7 @@ export function createSectionView( } } - attachWindowScroll( - chartWrap, - () => updateChartWindow, - () => drawPanel(), - ); + attachWindowScroll(chartWrap, () => updateChartWindow, drawPanel); const draw = (): void => { if (!currentDetail || !Number.isFinite(renderWidth) || renderWidth <= 0) return; @@ -663,6 +667,10 @@ export function createSectionView( structureEdit = edit; drawPanel(); }, + setGradeEdit(provider) { + gradeEditProvider = provider; + drawPanel(); + }, setStructureMarks(structures, types) { markStructures = structures; markTypes = types; diff --git a/B06_Section/B06_Section_UI_Section_View_Chart.ts b/B06_Section/B06_Section_UI_Section_View_Chart.ts index 05701438..1e9c073f 100644 --- a/B06_Section/B06_Section_UI_Section_View_Chart.ts +++ b/B06_Section/B06_Section_UI_Section_View_Chart.ts @@ -32,6 +32,8 @@ export interface LongitudinalChartInput { viewportWidth: number; /** 구조물(비정규) 측점선을 끌어 옮겼다. 안 넘기면 그 선은 못 잡는다. */ onDragStation?: (stationId: string, toChainageM: number) => void; + /** X축·측점 라벨을 바닥에서 이만큼(px) 올린다 — 계획고 편집 ▼ 버튼과 겹치지 않게. */ + bottomInsetPx?: number; } export interface LongitudinalChartResult { @@ -114,7 +116,7 @@ export function buildLongitudinalChart(input: LongitudinalChartInput): Longitudi undefined, // 구조물(비정규) 측점선 끌어 옮기기 — B05 와 같은 조작이다(2026-09-12 일원화). input.onDragStation, - 0, + input.bottomInsetPx ?? 0, 0, visibleElevationRange(detail, fromM, toM) ?? undefined, ), diff --git a/B06_Section/B06_Section_UI_Section_View_Draw.ts b/B06_Section/B06_Section_UI_Section_View_Draw.ts index 8888e8f1..d14408d8 100644 --- a/B06_Section/B06_Section_UI_Section_View_Draw.ts +++ b/B06_Section/B06_Section_UI_Section_View_Draw.ts @@ -32,6 +32,8 @@ import { moveMarkById, type SectionStructureEdit, } from "./B06_Section_UI_Section_View_Menu"; +import { createEditOverlay } from "../B05_Profile/B05_Profile_UI_Profile_Edit"; +import type { ProfileAlignment } from "../B05_Profile/B05_Profile_UI_Profile_Alignment"; /** 그래프 한 벌을 세우는 데 필요한 값 — 본체가 재고 고른 것을 그대로 넘긴다. */ export interface LongitudinalPanelInput { @@ -53,6 +55,14 @@ export interface LongitudinalPanelInput { conversion?: EarthworkConversion; naturalSpoilSlope?: number; selectStation: (stationId: string) => void; + /** 계획선 편집 — 넘기면 종단 그래프 위에 ▲/▼ 버튼층이 선다(B05 와 같은 부품). + * 안 넘기면 버튼이 없고 그래프만 보인다(옛 저장분처럼 선형이 없는 노선). */ + grade?: { + alignment: ProfileAlignment; + /** 한 번 누를 때 오르내리는 양(m) — 선형 정책값. */ + stepM: number; + onStation: (chainageM: number, delta: number) => void; + } | null; /** 좌측 상단 누가토량 배지 — 값이 없으면 null 로 지운다. */ setMassBadge: (values: ReturnType | null) => void; } @@ -91,6 +101,9 @@ export function drawLongitudinalPanel( minWidth: chartWidth, scrollLeft: input.keepScrollLeft, viewportWidth: chartWrap.clientWidth || chartWidth, + // 계획고 편집 ▼ 버튼이 바닥에 붙으므로 X축·측점 라벨을 그만큼 밀어 올린다 + // (B05 와 같은 값 15px). 버튼이 없으면 0 — 종전 여백 그대로다. + bottomInsetPx: input.grade ? 15 : 0, // 측점선을 끌면 그 구조물이 옮겨 간다 — 관은 예약 이동, 구조물은 정본 이동. onDragStation: edit ? moveMark : undefined, }); @@ -130,6 +143,20 @@ export function drawLongitudinalPanel( } chartWrap.replaceChildren(...nodes); + // 계획선 편집 버튼층 — B05 와 **같은 부품**(`createEditOverlay`)이다(2026-09-12 사용자: + // B05·B06 은 한 페이지인데 B06 에만 버튼이 없었다). 누른 값은 B05 와 같은 세션 초안에 + // 쌓이고 [저장]·[확정]에서 종단 정본으로 나간다. + if (input.grade) { + chartWrap.append( + createEditOverlay({ + alignment: input.grade.alignment, + width: chartWidth, + x: chart.toX, + step: input.grade.stepM, + onStation: input.grade.onStation, + }), + ); + } // 종단 그래프 우클릭 — B05 와 같은 메뉴다(가까운 구조물이 있으면 삭제, 없으면 구조물군 // → 종류 2단 추가). 그래프를 다시 그릴 때마다 붙인다(상태를 안 남긴다). if (edit) { From 83fdbe912d02a086ecc80012ce544ad3b359130a Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 12 Sep 2026 18:57:40 +0900 Subject: [PATCH 2/4] =?UTF-8?q?fix(b06):=20=EA=B3=84=ED=9A=8D=EC=84=A0=20?= =?UTF-8?q?=E2=96=BC=20=EB=B2=84=ED=8A=BC=EC=9D=B4=20=EC=95=8C=EC=95=BD=20?= =?UTF-8?q?=EB=A0=88=EC=9D=B8=20=EC=9C=84=EB=A1=9C=20=EB=B0=80=EB=A0=A4?= =?UTF-8?q?=EB=82=98=EB=8D=98=20=EA=B2=83=EC=9D=84=20=EA=B7=B8=EB=9E=98?= =?UTF-8?q?=ED=94=84=20=EC=95=88=EC=9C=BC=EB=A1=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 편집 버튼층은 `inset: 0` 으로 부모를 꽉 채우는데, B05 는 부모가 그래프뿐이지만 B06 은 구조물 알약 레인도 같은 칸 안에 있어 ▼ 가 레인 위로 내려앉았음(실측: 그래프 바닥 231px 인데 버튼이 270~287px). 버튼층 높이를 그래프 높이로 잘라 B05 와 같은 자리에 세움 (실측 후 ▲ 72~89px · ▼ 212~229px, 그래프 70~231px 안). Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Fe1QWPTfw11PaKh2LjwXdR --- .../B06_Section_UI_Section_View_Draw.ts | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/B06_Section/B06_Section_UI_Section_View_Draw.ts b/B06_Section/B06_Section_UI_Section_View_Draw.ts index d14408d8..8a9402fb 100644 --- a/B06_Section/B06_Section_UI_Section_View_Draw.ts +++ b/B06_Section/B06_Section_UI_Section_View_Draw.ts @@ -147,15 +147,19 @@ export function drawLongitudinalPanel( // B05·B06 은 한 페이지인데 B06 에만 버튼이 없었다). 누른 값은 B05 와 같은 세션 초안에 // 쌓이고 [저장]·[확정]에서 종단 정본으로 나간다. if (input.grade) { - chartWrap.append( - createEditOverlay({ - alignment: input.grade.alignment, - width: chartWidth, - x: chart.toX, - step: input.grade.stepM, - onStation: input.grade.onStation, - }), - ); + const editLayer = createEditOverlay({ + alignment: input.grade.alignment, + width: chartWidth, + x: chart.toX, + step: input.grade.stepM, + onStation: input.grade.onStation, + }); + // 버튼층은 `inset: 0` 으로 부모를 꽉 채운다 — B05 는 부모가 그래프뿐이지만 B06 은 + // **알약 레인도 같은 칸 안**에 있어, 그대로 두면 ▼ 가 레인 위로 밀려난다(실측: + // 그래프 바닥 231px 인데 버튼이 270px). 그래프 높이로 잘라 B05 와 같은 자리에 세운다. + editLayer.style.height = `${input.chartHeight}px`; + editLayer.style.bottom = "auto"; + chartWrap.append(editLayer); } // 종단 그래프 우클릭 — B05 와 같은 메뉴다(가까운 구조물이 있으면 삭제, 없으면 구조물군 // → 종류 2단 추가). 그래프를 다시 그릴 때마다 붙인다(상태를 안 남긴다). From 3518f346e4194f5a159343a885958ebfc257bde1 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 12 Sep 2026 19:07:30 +0900 Subject: [PATCH 3/4] =?UTF-8?q?fix(b06):=20=EA=B3=84=ED=9A=8D=EA=B3=A0?= =?UTF-8?q?=EB=A5=BC=20=EB=88=84=EB=A5=B4=EB=8A=94=20=EB=8F=99=EC=95=88=20?= =?UTF-8?q?=EC=84=B8=EB=A1=9C=20=EC=B0=BD=EC=9D=84=20=EA=B3=A0=EC=A0=95=20?= =?UTF-8?q?=E2=80=94=20=EC=84=A0=EC=9D=B4=20=EC=95=88=20=EC=9B=80=EC=A7=81?= =?UTF-8?q?=EC=97=AC=20=EB=B3=B4=EC=9D=B4=EB=8D=98=20=EC=9B=90=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit B05 에는 있고 B06 에 없던 장치였음. ▲▼ 를 누를 때마다 세로 창이 새 계획선에 맞춰 다시 잡혀, 값은 바뀌는데 선은 제자리에 있는 것처럼 보였음. B05 와 같이 누르고 있는 동안 창을 고정하고 손을 뗀 뒤 한 번만 다시 맞춤. 실측(랩탑_보조 534.0m 측점): 계획고 837.24 → 839.84m 일 때 설계선이 3.2px 올라감. 종전에는 같은 조작에서 0.4px 만 움직였음. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Fe1QWPTfw11PaKh2LjwXdR --- B06_Section/B06_Section_UI_Section_View.ts | 14 +++--- .../B06_Section_UI_Section_View_Chart.ts | 9 +++- .../B06_Section_UI_Section_View_Draw.ts | 43 ++++++++++++++++++- 3 files changed, 58 insertions(+), 8 deletions(-) diff --git a/B06_Section/B06_Section_UI_Section_View.ts b/B06_Section/B06_Section_UI_Section_View.ts index 1466a6c3..49afaa2f 100644 --- a/B06_Section/B06_Section_UI_Section_View.ts +++ b/B06_Section/B06_Section_UI_Section_View.ts @@ -47,6 +47,7 @@ import { STRUCTURE_LANE_HEIGHT_PX } from "../B05_Profile/B05_Profile_UI_Structur import type { SectionStructureEdit } from "./B06_Section_UI_Section_View_Menu"; import { attachWindowScroll, + createElevationHold, drawLongitudinalPanel, type LongitudinalPanelInput, } from "./B06_Section_UI_Section_View_Draw"; @@ -119,10 +120,9 @@ export interface SectionViewController { structures: ReadonlyArray, types: ReadonlyArray, ) => void; - /** 종단 그래프 우클릭으로 구조물을 넣고 빼는 길 — 없으면 메뉴가 안 뜬다 - * (2026-09-12 B05·B06 일원화). */ + /** 종단 그래프 우클릭으로 구조물을 넣고 빼는 길(2026-09-12 B05·B06 일원화). */ setStructureEdit: (edit: SectionStructureEdit | null) => void; - /** 계획선 편집 ▲/▼ — 그릴 때마다 불러 지금 선형·편집 함수를 받는다(null = 버튼 없음). */ + /** 계획선 편집 ▲/▼ — 그릴 때마다 불러 선형·편집 함수를 받는다(null = 버튼 없음). */ setGradeEdit: (provider: (() => LongitudinalPanelInput["grade"]) | null) => void; dispose: () => void; } @@ -157,7 +157,7 @@ export function createSectionView( let markStructures: ReadonlyArray = []; let markTypes: ReadonlyArray = []; let structureEdit: SectionStructureEdit | null = null; - let gradeEditProvider: (() => LongitudinalPanelInput["grade"]) | null = null; + let gradeEdit: (() => LongitudinalPanelInput["grade"]) | null = null; let renderWidth = 0; let resizeTimer = 0; let panelResizeTimer = 0; @@ -515,7 +515,8 @@ export function createSectionView( naturalSpoilSlope: currentNaturalSpoilSlope, selectStation: (stationId) => selectStation(stationId, true), setMassBadge: (values) => massBadge.set(values), - grade: gradeEditProvider?.() ?? null, + grade: gradeEdit?.() ?? null, + holdRange, }); // 상단 패널이 sticky라 선택 카드가 그 아래로 숨는다 — 패널 높이만큼 스크롤 여백을 잡아 준다. syncScrollMargin(); @@ -534,6 +535,7 @@ export function createSectionView( } attachWindowScroll(chartWrap, () => updateChartWindow, drawPanel); + const holdRange = createElevationHold(chartWrap, drawPanel); const draw = (): void => { if (!currentDetail || !Number.isFinite(renderWidth) || renderWidth <= 0) return; @@ -668,7 +670,7 @@ export function createSectionView( drawPanel(); }, setGradeEdit(provider) { - gradeEditProvider = provider; + gradeEdit = provider; drawPanel(); }, setStructureMarks(structures, types) { diff --git a/B06_Section/B06_Section_UI_Section_View_Chart.ts b/B06_Section/B06_Section_UI_Section_View_Chart.ts index 1e9c073f..5ed3d1b6 100644 --- a/B06_Section/B06_Section_UI_Section_View_Chart.ts +++ b/B06_Section/B06_Section_UI_Section_View_Chart.ts @@ -34,6 +34,11 @@ export interface LongitudinalChartInput { onDragStation?: (stationId: string, toChainageM: number) => void; /** X축·측점 라벨을 바닥에서 이만큼(px) 올린다 — 계획고 편집 ▼ 버튼과 겹치지 않게. */ bottomInsetPx?: number; + /** 세로 창을 가로채는 자리 — 계획고를 ▲▼ 로 만지는 동안 창을 **고정**하는 데 쓴다. + * 안 넘기면 늘 보이는 구간에 맞춘다(종전 동작). */ + holdRange?: ( + next: { min: number; max: number } | null, + ) => { min: number; max: number } | undefined; } export interface LongitudinalChartResult { @@ -118,7 +123,9 @@ export function buildLongitudinalChart(input: LongitudinalChartInput): Longitudi input.onDragStation, input.bottomInsetPx ?? 0, 0, - visibleElevationRange(detail, fromM, toM) ?? undefined, + input.holdRange + ? input.holdRange(visibleElevationRange(detail, fromM, toM)) + : (visibleElevationRange(detail, fromM, toM) ?? undefined), ), ); return { node, axis, toChainage, toX, maxChainageM, viewFromM: fromM, viewToM: toM }; diff --git a/B06_Section/B06_Section_UI_Section_View_Draw.ts b/B06_Section/B06_Section_UI_Section_View_Draw.ts index 8a9402fb..96d51824 100644 --- a/B06_Section/B06_Section_UI_Section_View_Draw.ts +++ b/B06_Section/B06_Section_UI_Section_View_Draw.ts @@ -55,6 +55,10 @@ export interface LongitudinalPanelInput { conversion?: EarthworkConversion; naturalSpoilSlope?: number; selectStation: (stationId: string) => void; + /** 세로 창 가로채기 — 계획고를 만지는 동안 창을 고정한다(B05 와 같은 장치). */ + holdRange?: ( + next: { min: number; max: number } | null, + ) => { min: number; max: number } | undefined; /** 계획선 편집 — 넘기면 종단 그래프 위에 ▲/▼ 버튼층이 선다(B05 와 같은 부품). * 안 넘기면 버튼이 없고 그래프만 보인다(옛 저장분처럼 선형이 없는 노선). */ grade?: { @@ -104,6 +108,7 @@ export function drawLongitudinalPanel( // 계획고 편집 ▼ 버튼이 바닥에 붙으므로 X축·측점 라벨을 그만큼 밀어 올린다 // (B05 와 같은 값 15px). 버튼이 없으면 0 — 종전 여백 그대로다. bottomInsetPx: input.grade ? 15 : 0, + holdRange: input.holdRange, // 측점선을 끌면 그 구조물이 옮겨 간다 — 관은 예약 이동, 구조물은 정본 이동. onDragStation: edit ? moveMark : undefined, }); @@ -208,7 +213,11 @@ export function drawLongitudinalPanel( chartWrap.scrollLeft, chartWrap.clientWidth || chartWidth, ); - return applyElevationWindow(chartWrap, visibleElevationRange(detail, fromM, toM) ?? undefined); + const next = visibleElevationRange(detail, fromM, toM); + return applyElevationWindow( + chartWrap, + input.holdRange ? input.holdRange(next) : (next ?? undefined), + ); }; } @@ -239,3 +248,35 @@ export function attachWindowScroll( }, SCROLL_SETTLE_MS); }); } + +/** + * 계획고 ▲▼ 를 **누르고 있는 동안 세로 창을 고정**한다(B05 와 같은 장치). + * + * 안 그러면 창이 새 계획선에 맞춰 다시 잡혀, 값은 바뀌는데 선은 제자리에 있는 것처럼 + * 보인다(2026-09-12 사용자 보고: 「버튼을 눌러도 계획 종단선이 안 바뀐다」). 손을 뗀 뒤 + * 한 번만 다시 맞춘다. + */ +export function createElevationHold( + chartWrap: HTMLElement, + redraw: () => void, +): (next: { min: number; max: number } | null) => { min: number; max: number } | undefined { + let editing = false; + let held: { min: number; max: number } | undefined; + chartWrap.addEventListener("pointerdown", (event) => { + if (!(event.target as HTMLElement).closest(".b05-profile-edit__btn")) return; + editing = true; + const release = (): void => { + editing = false; + window.removeEventListener("pointerup", release); + window.removeEventListener("pointercancel", release); + redraw(); + }; + window.addEventListener("pointerup", release); + window.addEventListener("pointercancel", release); + }); + return (next) => { + if (editing) return held; + held = next ?? undefined; + return held; + }; +} From 3fc19dbfc24bd8995f9277e2fb8910338bfb3f53 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 12 Sep 2026 19:07:36 +0900 Subject: [PATCH 4/4] auto: 2026-09-12 19:07 (ESD_LAPTOP) --- .../2026-09-12_plan_checked_complete_items.md | 364 +++++ ...2b_plan_snapshot_before_checked_cleanup.md | 1217 +++++++++++++++++ 2 files changed, 1581 insertions(+) create mode 100644 docs/raw/plans/2026-09-12_plan_checked_complete_items.md create mode 100644 docs/raw/plans/2026-09-12b_plan_snapshot_before_checked_cleanup.md diff --git a/docs/raw/plans/2026-09-12_plan_checked_complete_items.md b/docs/raw/plans/2026-09-12_plan_checked_complete_items.md new file mode 100644 index 00000000..b193da9d --- /dev/null +++ b/docs/raw/plans/2026-09-12_plan_checked_complete_items.md @@ -0,0 +1,364 @@ +# 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.body` 에 `position: fixed` 로 띄우고 곡선 중심 반대쪽 16방위로 자동배치라 **모달 상자 밖**과 **하단 정보행 위**로 넘어감. 모달이 `overflow: hidden` 이라 밖에 띄운 것이었으나, 「잘리지 않게」와 「상자 밖으로 나가게」는 다른 문제임. + +**개선 방향 — 아홉** + +- [x] **① 계획노선 길이 실시간 라벨** — 그려지는 폴리라인(`plannedLine`)의 정점 간 거리 합을 브라우저에서 바로 내 상태줄에 냄. 원호가 이미 정점으로 펴져 있어 이 합이 곧 실제 노선 길이임. 서버 왕복 없음. +- [x] **② 시점·종점·규칙측점 실시간 표기** — 양 끝에 시점(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`** 를 부름. + +- [x] **③ 등고선 한 줄당 높이값 라벨** — 도엽은 `등고수치` 속성, LAS 는 `level` 값이 이미 실려 있어 새로 셀 것이 없음. 가닥마다 화면 안쪽 한 자리에 숫자를 찍되, 겹치면 주곡선(간격의 5배)만 냄. +- [x] **④ 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 건너뜀**(설정 표를 건드려 전부 돌림). + +- [x] **⑤ 두 지점 사이 거리·종단기울기** — 노선 위 아무 자리(직선·곡선 가림 없음)를 두 번 찍으면 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.9−876.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`)와 [확인]·[예상노선으로](`_Apply.ts`)를 떼어냄 — 본체 693줄. + +- [x] **⑥ 바탕 등고선을 LAS 것으로** — 확정 지표면 모델이 있으면 LAS 등고선을 그리고, **없으면 지금처럼 도엽 등고선**을 씀(사용자 지시 그대로). 좌표계는 둘 다 사업지 m 라 변환이 필요 없고, 간격은 프로젝트 등고선 간격 설정을 따름. 노선 둘레 300m 띠로 거르는 것은 그대로 둠. +- [x] **⑦ 등고선 선택 활성화** — 등고선 한 가닥을 찍으면 그 가닥만 다른 색·굵기로 살아나고 높이값을 크게 냄. 집는 차례는 **노드 · 곡선 손잡이 · 등고선** 순 — 노선 편집이 먼저임. + **자체검증 (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). + +- [x] **⑧ 측점 횡단도 미리보기 — 별도 창** (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 건너뜀**. + +- [x] **⑨ 곡선 조작 패널이 모달을 벗어남** — 자동 자리를 **모달 상자 안**(하단 정보행 위까지)으로 가둠. 손으로 옮기는 것도 같은 테두리 안에서만. `position: fixed` 로 띄우는 것은 그대로 두고 자리 계산에서만 가둠 — 상자가 작아 패널이 안 들어가면 캔버스 오른쪽 위에 붙임. + +**개선 둘째 묶음 — 화면 정리와 회전 (2026-09-12 사용자 지시)** + +앞 아홉을 화면에서 보고 이어서 내려온 지시임. **모달 아래 정보행을 없애고 지도 위 오버레이로 옮기는 것**이 줄기임 — 지도가 세로로 넓어짐. + +- [x] **⑩ 조작 설명을 지도 좌상단 오버레이로** — 지금은 제목행 옆에 한 줄로 길게 늘어서 창이 좁으면 두 줄로 접힘. **2열**로 묶어 지도 왼쪽 위에 띄움. +- [x] **⑪ 단추를 제목행 오른쪽으로** — [되돌리기]·[다시하기]·[초기화]·[예상노선으로]·[취소]·[확인]을 제목행 **오른쪽 맞춤**으로 옮김. 크기·모양은 **공용 규격**(`ui_template` 의 `.ui-btn`)을 그대로 씀 — 모달이 따로 만든 `b05-routeedit__btn` 을 걷어냄. +- [x] **⑫ 상태·범례를 지도 좌하단 오버레이로** — 길이·노드 수·곡선 요약과 예상노선·계획노선 범례를 지도 왼쪽 아래에 띄움. +- [x] **⑬ 하단 정보행 삭제** — ⑩~⑫ 를 옮긴 뒤 그 줄을 통째로 없앰. 지도 칸이 그만큼 내려감. +- [x] **⑭ LAS 등고선도 5m 단위로** — 지금 LAS 자료는 1m 간격이라 확대하면 1m·2m 짜리까지 나옴. 도엽 등고선(5m)과 **같은 눈금**으로 맞춰 5m 아래로는 안 내려가게 함. ⚠ 서버에 5m 로 다시 뽑아 달라고 하면 첫 한 번이 오래 걸리므로, **받아 둔 1m 자료에서 5의 배수만 골라** 그림. +- [x] **⑮ LAS 일 때 세류선도 등고 범위 안쪽만** — 도엽 하천중심선은 도엽 전체를 덮어 LAS 등고선 바깥까지 뻗음. 바탕이 LAS 일 때는 **등고선이 있는 범위 안**에서만 그림. +- [x] **⑯ 지도 회전** — 지도 오른쪽 위에 **반시계·시계** 아이콘 둘. 한 번 누를 때마다 **그림 전체**가 한 칸씩 돎(글자도 함께 돎 — CAD 도면과 같은 방식). 집기(노드·손잡이·등고선·측점)는 돌린 자리를 그대로 따라감. +- [x] **⑰ 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 사용자 지시, 화면을 보고 내려온 것)** + +**⑱~⑳ 이 줄기임** — 횡단을 **메인 창 오른쪽에 붙박이로** 두고 그 아래에 **전후 비교창**을 새로 냄. 나머지는 잔손질. + +- [x] **⑱ 창 배치를 바꿈** — 메인 모달을 **왼쪽으로** 밀고, 오른쪽에 폭이 같은 **세로 칸** 하나를 세움. 위쪽 절반이 **횡단 미리보기**(지금 떠다니던 창을 붙박이로), 아래 절반이 **전후 비교창**(새로 만듦). 떠다니며 끌던 것은 그만둠 — 자리가 정해지면 끌 까닭이 없음. +- [x] **⑲ 전후 비교** — 비교창은 평소 **빈 화면**. 노선을 고쳐 **노드를 놓는 순간**(2026-09-12 사용자 확정) 그 측점 횡단을 다시 셈해 **새것은 위, 직전 것은 아래**로 내림. 끄는 동안에는 안 부름(한 장에 0.7초). +- [x] **⑳ 횡단 창 손질** — 제목의 측점을 **누가거리가 아니라 측점 표기**로(⓫ 참고). 하단 정보에서 **「계획고는 [확인] 뒤에 정해지므로…」 설명을 지움**(2026-09-12 사용자 확정) — 성토사면 길이·절토·성토 면적은 그대로 둠. +- [x] **㉑ 측점 표기를 한 규칙으로** — B05 왼쪽 아래 구조물 목록이 쓰는 **「측점번호+잔여거리」**(`4+9.8` · `17+4.5`) 그대로. 서버가 주는 `STA.0+100.000` 을 그대로 쓰지 않음 — 화면마다 표기가 갈림. +- [x] **㉒ 좌하단에 길이 둘** — **예상노선 길이**와 **계획노선 길이**를 나란히. 지금은 계획노선 하나뿐이라 얼마나 달라졌는지 안 보임. +- [x] **㉓ 거리 재기를 단추로** — [되돌리기] **왼쪽에 구분선**을 두고 그 왼쪽에 **[거리 재기]** 단추. 켜면 그냥 눌러도 재짐(Shift 는 지름길로 남김). +- [x] **㉔ 잰 값을 작은 창으로** — 상태줄에 섞지 않고 **따로 뜨는 작은 오버레이**에 냄. **닫기 단추**가 있고 닫으면 **잰 것이 지워짐**. **곡선 패널과 같이 뜨지 않음** — 하나가 뜨면 다른 하나는 숨음. +- [x] **㉕ 잰 구간이 꼬임** — 화면 사진에서 초록 띠가 노선을 벗어나 **삼각형으로 얽힘**. 두 점 사이를 **가장 가까운 정점**으로 잘라서 생긴 일임(노선이 되꺾이는 자리에서 엉뚱한 정점을 고름). **누가거리로 잘라** 고침. +- [x] **㉖ 곡선 패널 여닫기** — 고른 꺾임점을 **벗어나 누르면 선택이 풀리고** 패널이 닫힘. 패널 **오른쪽 위에 닫기 단추**도 붙임. +- [x] **㉗ 곡선 패널 하단 정보 줄이기** — **내각만 남김**(2026-09-12 사용자 지시). 「고정 없음」·「R ≥ 12m · L ≥ 5m」·「칸을 비우면 자동」은 지움 — 막는 일은 칸이 이미 함. +- [x] **㉘ 고른 등고선에 높이 라벨** — 등고선 한 줄을 고르면 그 줄에 **높이값을 크게** 붙임. 지금은 색만 바뀌고 숫자는 상태줄에만 있음. +- [x] **㉙ 회전 아이콘을 반원으로** — `↺`·`↻` 대신 **반만 도는 화살표** 모양으로 바꿈. +- [x] **㉚ 돌려도 글자는 바로 세움** — 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.ts` 의 `UPRIGHT_LABELS` 를 `false` 로만 바꾸면 됨. + · 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` 한 갈래에만 없음.** + +**고칠 순서 (사용자 확인 대기)** + +- [x] **직행 `/files` 가드 — 이미 붙어 있었음**(2026-09-09 확인) — 세 갈래가 같아졌음. +- [x] **purge 전 확인 단계 — 이미 있었음**(2026-09-09 확인) — 409 로 묻고 무엇이 지워지는지 알림. +- [x] **프로젝트 단위 업로드 잠금 표시**(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: 횡단 설계`) — 또 세면 이중 계상. + +- [x] **도수로·절토사면 배수로 — 보류 확정**(2026-09-09) — 품셈에 그 공종이 없어 + + **배치만 받고** 단가·일위대가를 안 만듦. 사유로 드러내 두는 것이 확정된 동작임. + +### 3-16. 측구 토글 화면 실측 — 남겨 둔 것 (2026-09-09) + +- [x] **측구 토글이 화면에서 도나**(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)만 이 규칙 밖 — 다른 시설이라 따로 둘 것. + +- [x] **표준도에 상부·하부 두께 칸**(2026-09-09, `3a64bb5b`) — 비우면 실무 구조물도 식, + + 넣으면 그 값이 이김. 실측 — 상부 0.60 저장에 입적 24.375 → 20.625㎥, 비우니 복귀. + +### 4-14. 시험 예외 목록 — 잔손질 하나 + +- [x] `**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`)에만 있고 토적표·집계표·운반표·일위대가는 **맨 숫자뿐**임. + +- [x] **⓪-가. B09 좌측 패널 공통 틀로 교체** `[데스크탑 보조]` — `b09-panel__group` → `ui-collapsible ui-sidebar-section`, `b09-panel__actions` → `ui-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` 통과. +- [x] **⓪-나. B08 좌측 패널 공통 틀로 교체** `[데스크탑 메인]` — 조건 칸을 접히는 상자 다섯으로 묶음(토량환산계수 / 지반 구성비·시공법 / 현장값(표토·층따기·사토장·용수·운반거리) / 규준틀·임목 / 부대시설). 개발용 줄은 `ui-sidebar-actions` 를 떼고 자체 클래스로 바꿔 **짤림의 원인을 없앰**. 같은 실수 재발을 막게 공용 `splitSidebarActions` 가 **마지막** 액션 줄을 집게 고칠지는 B08 이 통과한 뒤 판단(B04~B08 전부에 닿음). + + **자체검증**(2026-09-12, 커밋 `648bc528`) — 상자는 다섯이 아니라 **일곱**이 됨(제목 여섯 + 무제목 하나). 제목을 따로 지어내지 않고 **이미 있던 제목 줄을 그대로 상자 제목으로 옮긴** 까닭임 — 표토제거 · 구조물·사토 · 부대시설 개소 · 규준틀 개소당 재료 · 임목파쇄 · 콘크리트 타설 여섯과, 산출법 한 줄·토량환산계수 구획을 담는 무제목 상자 하나임(토량환산계수는 제 제목을 제 안에 들고 있어 제목을 둘로 만들지 않음). 지반 구성비·반영률 상자는 표가 있어야 서는 칸이라 이번 측정에는 안 뜸 — 표가 붙으면 같은 규칙으로 상자가 둘 더 섬. + + 측정(ORCA 내장 브라우저 5173, 모듈을 직접 불러 패널을 그림) — 스크롤 래퍼가 패널 직계로 돌아옴(`scrollParent = b08-quantity__panel ui-sidebar-fill`, 전에는 개발용 줄 안) · `.ui-sidebar-actions` 가 **1개**만 남음(전 2개) · [저장]·[확정] 줄 바닥 920px = 패널 바닥 920px = 창 높이 920px 로 **잘림 없음** · 스크롤은 안쪽 래퍼만 · 「구조물·사토」 제목 클릭에 상자 높이 511px → 42px → 511px 로 접힘·펼침. `tsc --noEmit` 통과 · `pytest -q` **1294 passed**. + + 곁들이로 잡은 것 — 표를 못 받은 경우(`table === null`) `concrete_placing` 접근에서 터져 **페이지가 통째로 백지**가 되던 것을 `?.` 로 막음. 정작 보여야 할 「표를 못 불렀다」 안내까지 같이 사라지던 자리임. + + 남은 것 — 토량환산계수 구획의 접힘은 **표가 있어야** 그 구획이 서므로 로그인한 화면에서 한 번 더 볼 것. 공용 `splitSidebarActions` 를 「마지막 액션 줄」로 바꿀지는 아직 안 건드렸음(B04~B08 전부에 닿음). +- [x] **①. 출처 등급 여섯 못 박기** — `입력`(사용자가 넣음) · `측량`(앞 단계 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 에는 원가계산서의 총원가·도급금액·총계·내역 금액·자재대 금액으로 분명히 있음(데스크탑 보조 확인). 한 장에서 여섯이 다 안 보인다고 등급을 줄이지 말 것. +- [x] **②. 등급 색칠 토글** — 셀 왼쪽 얇은 띠 + 옅은 배경. 여섯 색이 늘 켜져 있으면 표가 알록달록해 실무 시트 대조를 방해하므로 **평소엔 꺼 두고 토글로 켬**. 토글 단추는 시트 탭 줄에 둠(좌측 패널이 아님 — 패널 작업과 파일이 겹치지 않게). +- [x] **③. 칸 단위 근거 호버** — 마우스가 **그 숫자 칸**에 올라가면 카드가 뜸. 카드에 등급 · 값 · 식 · 원천 · (개발 빌드만) 파일:줄. 줄마다 갈리는 것(막힌 사유 · 폴백 안분 같은 것)은 그 칸에 따로 얹힘. +- [x] **④. 사전은 서버가 듦 + 배포 빌드에서 끊음** `[로직 보안]` — 「어디서 와서 어떻게 계산됐나」의 정답은 엔진이 아는 것이라 화면 TS 에 손으로 적으면 엔진을 고칠 때 설명만 옛것으로 남음. 새 파일 `B08_Quantity_Provenance.py` 에 **열 단위 사전**을 두고 응답에 실음(칸마다 만들면 토적표 한 장이 30열×200줄=6천 칸이라 응답이 붐 — 겉보기는 칸 단위 그대로임). ⚠ **화면에서 숨기는 것으로는 보안이 안 됨** — API 로 그대로 뚫림. 배포 빌드에서는 **서버가 사전을 아예 안 실어 보냄**, 문은 이미 있는 `ENVIRONMENT`(`common_util_dev_unlock` 과 같은 방식)를 그대로 씀. 토글 단추도 개발 빌드에만 뜸. +- [x] **⑤. 원천은 글로만 적음 — 자동 이동은 보류** — 카드에 「원천: 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` 은 시험으로 박음. + + **⑤ 원천은 글로만** — 카드 「원천」 줄에 어느 표·어느 단계가 낳았는지 적음. 자동 이동은 안 붙임(보류 근거는 항목 본문). + +- [x] **⑥. 사전 채우기 — 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 원가계산서·내역서·자재대에 몰림. 한 장에서 여섯이 다 안 보인다고 등급을 줄이지 말 것. 이 갈림은 시험으로 박음. + +- [x] **⑦. B09 내역서 「비고」 사유 유실 — 고침** `[데스크탑 보조]` + + 덮어쓰던 열세 곳 + 이어 붙이던 일곱 곳을 조각 배열 `notes` 로 옮기고 조각마다 **닿는 열 키**를 함께 실음. 화면 「비고」 칸은 조각을 종전 꼴(`/` 이음)로 되뽑는 property 라 **눈에 보이는 것은 안 바뀜** — 토글 끈 사용자도 그대로 봄. 판정: 같은 줄에서 규격 카드엔 「갈래: 토사」만, 수량 카드엔 반영률 문구만, 단가 카드엔 단산 번호만, 금액 카드엔 줄 사유 없음. 줄 전체에 걸리는 사유(열 키 빈 것)만 세 칸 모두에 붙음. + + ⚠ **줄 사유는 그 사유가 닿는 열에만 붙일 것** — B08 에서 줄 사유를 그 줄 모든 칸에 띄웠다가 「절토 보정량」 카드에 「측구 가름값이…」 가 떠서 읽는 사람을 속인 자리가 있었음(2026-09-12 실측 후 고침). + + **앞작업 — B09 원천 조사표 완료** (2026-09-12, 데스크탑 보조) · [조사표](docs/raw/verification/2026-09-12_B09_데이터_원천_조사.md) + 탭 열 개(살아 있는 아홉)의 화면 열마다 이름·원천(`파일:줄`)·식·등급 후보를 적음. + 이미 있어 그대로 쓸 것 넷 — `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`) · 환율및기초자료(`standard` 와 `input` 이 갈리는 장) · + 단가산출근거·산출기초(**모으는 표**라 식은 비우고 `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-data` 가 **16장**을 그대로 실어 보냄. + · 기초자료 탭 실데이터에서 **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`) 옛 코드로 헛검증하는 일을 막았음. + +- [x] **B08 좌측 패널** — 상자 **아홉**(제목 여덟 + 무제목 하나). 제목: 암 갈래 구성비 · 반영률 · 표토제거 · 구조물·사토 · 부대시설 개소 · 규준틀 개소당 재료 · 임목파쇄 · 콘크리트 타설. ⚠ 앞서 모듈 검증에서 일곱이던 것이 아홉이 된 까닭은 **표가 있어야 서는 상자 둘**(암 갈래 구성비·반영률)이 실데이터에서 섰기 때문임 — 예상대로임. 「암 갈래 구성비」 제목 클릭에 258px → 42px → 258px. 스크롤 래퍼는 패널 직계(`b08-quantity__panel ui-sidebar-fill`)이고 실제로 구름. [저장]·[확정] 바닥 920px = 패널 바닥 920px = 창 920px — **잘림 없음.** 토량환산계수 구획도 제 제목으로 접힘(실데이터에서만 서는 자리라 이번에 처음 확인). +- [x] **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**). 탭마다 카드가 실제로 떴고 식·원천·자리가 그 장의 엔진을 가리킴. +- [x] **칸 등급이 열 등급을 이기는 자리가 실데이터에서 확인됨** — 토공집계 「계」 열 안에서 정상 줄은 `최종`, 무대(소운반 20m) 줄만 `제외` 2칸. 운반표도 같은 줄의 토량·거리 둘이 `제외`. 준비공은 값을 못 세운 줄 5칸이 `막힘`. +- [x] **B09 좌측 패널** — 상자 다섯(공사 조건 · 요율 판 · 관급자재 · 이윤 조정 · 수량) 모두 접힘(332px → 44px → 332px). [재계산]·[확정] 바닥 920px. 스크롤 래퍼 `b09-panel ui-sidebar-fill`. +- [x] **B09 사전이 서버 응답에 실림** — `unit-prices`·`base-data`·`price-sources`·`basis-sheet`·`bill` 다섯 응답 모두 `provenance.sheets` **16장**. 화면: 일위대가 1,740칸(기준 580 · 계산 1,160) · 산출기초 623칸 · 원가계산서 130칸(기준 52 · 계산 49 · 미분류 26 · **최종 3**). +- [x] **배지와 띠가 같은 말을 함**(`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 밤, 중간 점검 시점) + +- [x] `[반나절]` **돌 무게 인자표** — 이미 들어가 있었음(`252e6b54`). 계산식이 기본, 야면석만 관측표. + + ⚠ **야면석은 뒷길이 25·30·60·75 에 원본 값이 없어** 그 규격에서 돌 줄이 안 서고 사유만 남음. +- [x] `[잔손질]` **공구손료 칸** — 세웠음(`83c842e3`). 기본은 빔 = 안 붙음. + + ⚠ **지금은 넣어도 붙을 밑수가 없음** — 일위대가에 주재료비가 선 공종이 0개(사급 자재 단가 대기). diff --git a/docs/raw/plans/2026-09-12b_plan_snapshot_before_checked_cleanup.md b/docs/raw/plans/2026-09-12b_plan_snapshot_before_checked_cleanup.md new file mode 100644 index 00000000..5ad3443a --- /dev/null +++ b/docs/raw/plans/2026-09-12b_plan_snapshot_before_checked_cleanup.md @@ -0,0 +1,1217 @@ +# 2026-09-12 잔여 완료 체크 정리 전 상시계획서 스냅숏 + +> 원본: 저장소 루트 PLAN.md +> 처리: 혼합 섹션에 남은 완료 체크와 그 근거를 제거하기 전 전체 원문 보존. +> 검증: 사용자 지시에 따라 위키 관리자의 2차 교차검증 생략. + +# 상시 계획서 + +> 운영 원칙 +> +> - **작업 목록**: 남은 일을 한 곳에 +> - **구획은 페이지·기능별** 착수하지 않기로 한 것만 맨 아래 **보류** +> ⚠ **별도 파일로 가르지 않는다** — 상시계획서는 한 파일로만 운영. +> - **담당은 적지 않는다** — 어느 창·폴더가 맡을지는 그때그때 정한다. +> - **작성방법** — 짧고 이해하기 쉽게, 문단의 종료 시점 전까지 줄바꿈금지. + +## 작업 목록 + +### ⭐ 사토장 — 사용자 설계 (2026-09-09 밤, 원문 그대로 옮김) + +**여쭀던 「사토장까지 거리」의 답이자, 그보다 큰 설계임.** 거리를 값으로 받는 것이 아니라 +**사토장을 노선 위에 놓는 것**임. + +**무엇인가** — **횡단도에서 기존 성토선을 그대로 두고, 노견 이후 확장 방향으로 추가 성토선을 +하나 더 긋는 것.** 그 추가 성토가 곧 사토장임(현장 안에 쌓는 것). + +**받는 값** + +``` +기본 기준 측점 +세부 부피값(사용자 입력) + 추가 거리값(외부 사토장을 쓸 때 대비) +``` + +**거리 셈** — **공사장 입구에 사토장이 있다고 보고 계산한 거리 + 추가 거리값.** +⇒ 추가 거리를 넣으면 **외부 사토장 운영도 같은 틀로 됨.** 그때는 **횡단도 표기가 필요 없음.** + +**횡단도** — **추가 성토선의 확폭 방향 길이가 자동 결정**되면 됨(부피에서 역산). +**유토곡선** — 그러면 당연히 표현됨. +**수량·원가** — 그 사토장 값을 그대로 씀. + +**⚠ 정하며 갈 것 셋 (사용자 원문에 없어 구현하며 확인)** + +``` +㉠ 걸치는 구간 기준 측점 하나인가, 구조물 C군처럼 전/후 구간인가 + → 부피를 길이로 나눠야 하므로 구간이 필요함. **C군과 같은 모양**을 권함 +㉡ 확폭 성토선 기울기를 기존 성토 기울기와 같게 볼 것인가 + → 같게 두는 것이 자연스럽고, 다르면 사용자 칸이 하나 더 필요 +㉢ 「공사장 입구」 노선 기점(BP)으로 볼 것인가 + → 측점에서 기점까지 누가거리는 이미 아는 값 +``` + +⚠ **셋 다 임의로 굳히지 말고 화면에 드러내고 바꿀 수 있게** 할 것(사용자 지시 「페이지에 남길 것」). + +**⚠⚠ 정정 — 폭을 재는 기준 (2026-09-09 사용자 보충)** + +> 「사토장의 성토선을 긋고 **부피를 계산하는 기준이 노견 바깥쪽이 아니라 +> **노견과 노면의 사이**를 기준으로 길이가 늘어나고 사토장 부피가 되어야 함」 + +⇒ **폭의 시작점은 「노면 끝(= 노견 시작)」임.** 노견 바깥 끝이 아님. +⇒ 사토장이 서면 **그 구간의 노견이 사토장 성토 안에 들어감** — 노견 폭도 사토장 폭에 포함됨. +⚠ **이중계상 확인이 필요한 자리** — 원래 노견 성토가 **노체 성토에 이미 들어 있으면** + 사토장이 그것을 또 세게 됨. **사토장이 선 구간의 노견 몫을 어떻게 다루는지**를 + 구현 전에 반드시 확인할 것(빼는가 · 사토장이 대신하는가). + +**⭐ 설계 (랩탑 메인 정리 · B05·B06 몫)** + +``` +타입 spoil_fill 「유용토운반작업장(노선 내)」 E군 · interval +칸 capacity_m3(부피) · extra_distance_m(추가 거리) · fill_slope_ratio(빈 값 = 노선 성토 따름) + + length_m · before_m · after_m (C군 규약) +그리기 성토선 바깥에 추가 성토선 — **구조물 designTrim 통로를 그대로 탐**(새 개념 없음) + **파선** + 말풍선 「유용토운반작업장 · 부피 ○㎥ · 폭 ○m」 + ⚠ 구조물 터파기 파선과 **선 종류를 갈라야** 함 +폭 부피에서 **되풀이로 역산**(폭 잡고 → 측점 단면적 → 평균단면적법 → 목표와 비교) + **폭은 구간 내내 하나** · **상한 = 지반선이 있는 데까지**(그 밖은 지반을 모름) + 안 서는 측점은 기존 `slope_unclosed` 로 가림 +내는 값 capacity_m3 · placed_m3 · unplaced_m3 · 측점별 station_placed_m3 + ⚠ unplaced > 0 이면 알림. **폭을 억지로 키우지 않음** +유토곡선 잔량마다 spoil_destination_chainage_m · spoil_haul_distance_m + (없으면 null — 거리를 지어내지 않음. B08 통짜 입력으로 떨어짐) + 사유 「사토장에서 계산」 / 「설계 입력값」 을 값과 함께 +``` + +**⭐ 새로 만들 것이 적음** — `designTrim` · 단면적·평균단면적법 · `slope_unclosed` · +`transfers`·띠(평균거리) · 잔량 지반 갈래 **다섯이 이미 있음.** +새로 짜는 것은 **폭 역산 되풀이**와 **타입·거리 칸**뿐. + +**⚠ 아직 정할 것** + +``` +③ ✅ **닫힘 (2026-09-09 사용자 확정)** — 사용자 원문: + 「**기존 구조물 측점이나 규칙 측점에만 들어가는 게 맞아**」 + ⇒ 사토장은 **이미 있는 측점 위에만** 놓임(구조물이 선 측점 또는 정규 측점). + **새 측점을 만들지 않음.** 구간 시·종점도 측점에 맞춤 + ⇒ **「공사장 입구 가정」이 필요 없어짐** — 사토장 측점이 정해지므로 거리는 + **발생점 → 사토장 측점** 누가거리로 그냥 나옴(실무 「사토운반」 탭과 같은 꼴) + ⇒ `extra_distance_m` 는 **외부 사토장 대비용으로만** 남음 +⚠ 사토 운반량을 어느 상태로 세나(자연/느슨/다짐) ← 실무 탭 수식 확인 중 +⚠ 실무 「×0.8」의 정체 · 암 1.0 이 우리 1.15/1.30 과 다름 ← 같이 확인 중 + ⚠ 답 오기 전까지 **우리 계수를 건드리지 말 것** +1 「사토장 관리」 줄을 세울 것인가 — **공종 코드가 없음**(B08·B09 같이 볼 자리) +``` + +**⇒ 이것이 서면 풀리는 것들** + +- 사토 운반 거리가 **설계에서 나옴** — 물어보던 값이 아니게 됨 +- 유토곡선 사토가 **갈 곳이 생김**(지금은 잔량으로만 남음) +- 구조물 잔토·채집석 공제가 **금액으로 드러남**(운반이 서므로) + +### ⭐⭐ 사용자 확정 5차 — 2026-09-09 밤 (결정 시트 회신, 큰 것 여덟 + 작은 것 다섯) + +**이 절이 정본임. 다시 묻지 말 것.** 시트 원문 [https://claude.ai/code/artifact/206bcb63-004e-49e8-ba3b-eeb520b0e590](https://claude.ai/code/artifact/206bcb63-004e-49e8-ba3b-eeb520b0e590) + +#### 큰 것 여덟 + + +| # | 물음 | **확정** | 해야 할 것 | +| --- | ---------- | ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| 1 | 비탈 터파기 | **지금 이대로** (기초 + 비탈) | 값 그대로.`155.625㎥ · 11,263,899원` 유지. **터파기·되메우기·잔토 세 줄의 「확정 대기」 노티스를 걷을 것** | +| 2 | 지장목제거 | **두 줄로 가름** (권고대로) | 실무처럼**뿌리뽑기 + 잡관목제거**. **같은 면적(17,873.8㎡)이 두 줄에 그대로 들어감 — 이중계상 아님** | +| 3 | 공종 없는 다섯 줄 | ⚠**보류.** 「나중에 실무 문서 첨부. **임의로 만드는 건 지금은 무의미**」 | **일위대가를 만들지 말 것.** 줄은 서되 사유로 두고 **실무 문서를 기다림** | +| 4 | 뿌리 운반 | **덤프** | ⚠ 사용자 관찰 — 「**실제 운반품이 적용 안 되는 듯함. 나중엔 적용될 가능성도 있음**」 ⇒ 덤프로 잡되 품이 안 붙으면 **그대로 두고 사유**. 억지로 붙이지 말 것 | +| 5 | 근주이식·임목파쇄 | **권고대로**(기본 안 셈) | ⚠ 단 「**현장에 따라 파쇄가 적용될 필요 있음**」 ⇒ **임목파쇄는 켤 수 있는 칸**을 둘 것. 기본은 꺼짐 | +| 6 | 제근 단위 | **권고대로 — 면적 축** | 건설품셈 3-9-2 **「1,000㎡당」**을 빌려 씀. ⚠**교차 참조 표시 필수**(임도 전용 품이 있는데 건설품셈을 쓰는 것). 밑수가 서면 **제근·뿌리 적재·뿌리 운반·지장목제거 네 줄이 함께 섬** | +| 7 | 돌 무게 | **권고대로 — 계산식** | `뒷길이 × 0.77(채움률) × 2.65(비중)`. ⚠ **돌 종류별 인자표**로 둘 것(야면석은 그 식이 안 맞음). ⚠ 「**나중에 실무자 협의 후 명확히**」 — 잠정임을 화면 근거에 적을 것 | +| 8 | 사급 자재 단가 | **물가정보 API 로 반영 예정** | ⚠ 「**견적단가가 들어가는 부분은 우리가 생각해 봐야 함**」 ⇒ **API 로 오는 몫**과 **업체 견적으로 받을 몫**을 가르는 설계가 선행. 지금은 미결 | + + +⚠ **8번의 「구조물 넷 표준 단면」(소단·BOX암거·소형사방댐·옹벽 H=1.6)은 답이 안 왔음.** +3번과 같은 결(「나중에 실무 문서 첨부」)로 보고 **기다림.** 임의로 만들지 말 것. + +#### 작은 것 다섯 + + +| # | 물음 | **확정** | +| --- | --------- | -------------------------------------------------------------------- | +| 1 | 공구손료 비율 | **지금은 안 넣음. 다만 숫자를 넣으면 되게 열어 둘 것** — 칸을 만들되 기본은 빔, 비면 안 붙음 | +| 2 | 물빼기 구멍 | **국가기준으로 감**(Ø50 · 2㎡당) **+ 숫자 변경 가능하게** | +| 3 | 막자갈 식 | **실무식으로** — `(상 + 하) ÷ 2 × H` | +| 4 | 체적·석적 두 줄 | **실무대로 세울 것** | +| 5 | 옹벽 기초잡석 | **실무가 어떤지 확인하고 일단 따라갈 것** ⚠ 두 원본이 「없음」으로 일치했으므로 **더 볼 실무 자료가 있는지부터** | + + +⚠ **여섯째(규준틀 목재 손율)는 답이 안 왔음** — 시트에 늦게 붙어 못 보셨을 수 있음. **다음에 여쭐 것.** +지금은 **아무도 안 곱하는 상태** 그대로 두고 사유만 유지. + +**⇒ 이 확정으로 풀리는 것** — 시트 답 대기 아홉 중 **일곱이 닫힘**. 남은 것은 **3번·8번(자료 대기)**뿐. + +### ⭐ 사용자 확정 4차 — 2026-09-09 밤 (흙막이 표현) + +**「흙막이는 횡단도에서 표현방식들과 옵션들은 동일하게 반영하면 될거야. 형상은 동일해. +물론 데이터는 분리하여 계산되어야함.」** — 사용자 원문. 아래가 정본임. + + +| 무엇 | 확정 | +| ------------ | ----------------------------------------- | +| **횡단도 표현방식** | **기슭막이와 같게.** 따로 그리지 않음 — 같은 그리기 경로를 씀 | +| **옵션(입력 칸)** | **기슭막이와 같은 벌.** 새 옵션 체계를 만들지 않음 | +| **형상** | **같음.** 단면 모양이 다르다고 보지 말 것 | +| **수량·데이터** | ⚠**분리 계산.** 원단위·공종코드·성분 줄은 **흙막이 자기 것**으로 | + + +**⇒ 그러니 일이 이렇게 갈림** + +``` +한 벌로 쓰는 것 횡단도 그리기 · 기하 · 옵션 칸 · 화면 표시 +따로 두는 것 수량 전개(형식별) · 원단위 · 공종코드 · 자재 줄 +``` + +⚠ **랩탑 보조가 「축이 달라 기슭막이 식을 안 빌리겠다」고 한 판단은 수량 쪽에서는 그대로 유효함** +(교본 앞면 1:0.3 · 뒷면 수직 · 천단 30㎝). **사용자 확정이 덮는 것은 「그림·옵션」이고, +「수량 계산」은 오히려 분리하라고 못 박은 것임.** 둘을 헷갈리지 말 것. + +⚠ **형식별 수량 원천** + +``` +떼 정본 「떼흙막이」(개소당) — 떼 1.39㎡ · 바닥파기 0.17㎥, 치수는 원문이 「평균」으로 붙박이 + (랩탑 보조가 확보. `soil_guard.form` 에 「떼」 추가됨 — 2026-09-09 랩탑 메인) +돌(찰)·돌(메) · 콘크리트 · 블록쌓기 · 돌망태 · 흙포대 · 통나무쌓기 + ⚠ 정본에 탭 **없음**. 수량 원단위는 여전히 미확보 — 지어내지 말 것 +``` + +**⇒ 즉 지금 수량이 서는 흙막이는 「떼」 하나뿐이고, 그림·옵션은 전 형식이 기슭막이와 한 벌임.** + +### ⭐ 사용자 확정 3차 — 2026-09-09 밤 (여섯 중 다섯) + +**「1~6번은 권장하던 대로, 6번은 자재로」** — 사용자 원문. 아래가 정본임. + + +| # | 물음 | **확정** | +| --- | ---------- | ------------------------------------------------------------- | +| 1 | 흙깎기 작업효율 E | **0.50** (영월 방식 · 현행 산림품셈 인자와 전부 일치) | +| 2 | 기초잡석 두께 | **0.2 m** (폭 1.5m 는 관측 역산 ⇒ 옹벽 0.30㎥/m) | +| 3 | 사토장까지 거리 | ⚠**미정 — 권고한 값이 없어 그대로 물음으로 남김**(현장값) | +| 4 | 구조물 터파기 용수 | **육상(용수 없음)** ⚠ 내가 권고한 적 없어 **통상값으로 적용 + 노티스**. 사용자가 뒤집을 수 있게 | +| 5 | 관급 자재 | **전부 사급** | +| 6 | 콘크리트 자리 | **자재 축에 세움**(㉮) — 사용자 명시 | + + +⚠ **3·4 는 내가 권고를 낸 적이 없는 자리임.** 3 은 물음으로 남기고, 4 는 통상값으로 넣되 +**「사용자 확정이 아니라 통상값 적용」**을 사유·노티스에 적을 것. 뒤집히면 한 줄임. + +**⚠⚠ 그리고 사용자 지시 — 「대신 페이지에 남길 것」.** +**여섯 값 전부를 코드에 박고 끝내지 말 것.** **화면에 칸으로 세우고, 지금 값과 그 근거를 보이고, +사용자가 바꿀 수 있게** 할 것. + +``` +흙깎기 작업효율 0.50 칸 + 근거(현행 산림품셈 9-3-2 · 영월 방식) +기초잡석 두께 0.2 m 칸 + 근거(폭 1.5m 는 관측 역산 · 두께는 원문에 없음) +사토장 거리 칸(비어 있음) — 넣으면 덤프 금액이 섬 +용수 유무 칸(기본 육상) + **「통상값 · 사용자 확정 아님」** 표시 +관급/사급 칸이 이미 있음 — 전부 사급으로 세움 +콘크리트 자재 축에 섬 +``` + +⇒ **정한 값이 화면에서 안 보이면 다음 사람이 왜 그 값인지 모름.** 오늘 지켜 온 +「사유를 드러낸다」와 같은 결임. + +### ⭐ 사용자 확정 2차 — 2026-09-09 저녁 (열한 건) + +**이 절이 정본임. 다시 묻지 말 것.** 근거·선택지는 결정 시트(`3afcfb05`)에 있음. + + +| # | 물음 | **확정** | 해야 할 것 | +| --- | ------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| ① | 층따기 단위 | **㎡ 유지.** 부피는 **사용자가 지정한 길이값을 곱해** 씀 | 면적이 정본.**길이(깊이) 입력 칸 하나** + `㎥ = 면적 × 길이`. 그러면 ㎥ 단가를 그대로 씀 — 단위 불일치가 풀림 | +| ② | 벽 평균두께 | **실무 도면 하단 계산값을 우선 적용** | 정본 0.83 계열을 먼저 넣고 대 볼 것. ⚠**방향** — 상단 도면 + 하단에 **엑셀 같은 수식이 든 표**, **사용자가 값을 바꿀 수 있게** | +| ③ | 기계 노임 | **기술문서 DB 먼저 뒤질 것.** 없으면 **실무 기준 + 노티스** | ⚠ 고용보험·기계감가상각 등**더 붙는 것이 있는지**부터 확인 | +| ④ | 터파기 | **횡단도에 표현부터 구현.** 교본·실무문서를 보고 만들 것 | 노티스 붙이고,**그다음 사용자가 고를 수 있게** | +| ⑤ | 돌 중량 | **기술지식 DB 확인 → 없으면 현재 유지** | 유지하되**나중에 프로그램에서 확인할 수 있게** 근거를 남길 것 | +| ⑥⑦⑧ | 막자갈 식 · 체적/석적 줄 · 기초·천단 축 | **연계된 하나로 봄.** 정본이면 **검증 프로젝트에 이미 계산·저장돼 있을 것** — 확인하고 말할 것 | 저장분 확인 +**기술정보 DB 추적**. 그 결과를 보고 정함 | +| ⑨ | 야면석 계수 | **품셈 열이 기본**, 사용자가 고를 수 있게 | 기본값만 바꾸고 덮어쓰기 칸 | +| ⑩ | 채움 콘크리트 | **기본 210**, 사용자가 고를 수 있게 | | +| ⑪ | 잡석다짐 폭 | **기준 구조물에서 유도** — 같은 값을 공유 | 예: 기슭막이면**하단 길이 × 종단방향 폭 × 높이**로 부피. 구조물 제원에서 끌어낼 것 | + + +**⇒ 방향 한 줄** — ②가 말하는 「상단 도면 + 하단 수식 표 + 사용자 편집」이 **표준도의 최종 모양**임. +계산식을 코드에 숨기지 말고 **표에 드러내고 고칠 수 있게** 하는 쪽으로 감. + +### 확정 1~11 (정하신 것) + + +| # | 물음 | **확정** | 구현이 해야 할 것 | +| --- | ------------ | --------------------------------- | -------------------------------------------------- | +| 1 | 어떤 돌 | **구조물마다 고르게** | `stone_kind` 를 구조물별 입력 칸으로. 비어 있는 넷을 채우면 계수가 따라감 | +| 2 | 사나 캐나 | **기본 「캔다」, 구조물마다 바꿀 수 있게** | 법 문구·실무 관행이 둘 다 이쪽.**사토 「채집석 공제」도 함께 들어감** | +| 3 | 자재값 출처 | **둘 다** — 업체 견적·지역 상차가 **와** 물가지 | 출처를 고르는 칸 + 업체명·날짜·쪽수를 함께 받아 둘 것 | +| 4 | 콘크리트 타설 | **현장 조건에 따라 고르게**(㉰) | 몸체·채움 각각 고르는 칸. 실무 기본(몸체 레미콘 / 채움 기계비빔)은**제안값**으로 | +| 5 | 표준도 범위 | **진행** | 표(나흘) → 돌쌓기 그림(닷새) → 나머지 일곱(대엿새) 순서대로 | +| 6 | 값 고치는 자리 | **한 곳에서 정하고 도면은 비추기만**(㉮) | 자재 카탈로그가 정본. 도면 표에 [여기서 고치기] 단추 | +| 7 | 층따기 단위 | **㎡ (실무 관행)** | ⚠**대신 B06 횡단·종단 설계에서 그 면적이 실제로 나와야 함** | +| 8-1 | 야면석 채집 「인 부」 | **바꿔쓰기 허용** | 규정이 허용하는 「유사 직종으로 바꿔 쓰기」로 보통인부 적용 | +| 8-2 | 버림 콘크리트 | **기본 보이게, 뺄 수도 있게** | 두께 100㎜(KDS)·폭은 잡석다짐 폭. 넣고 빼는 칸 | +| 8-3 | 틈메우기돌 | **실무 구조물도를 보고 넣을 것** | 실무 표준도(구조물도) 확인이 선행 — 확인 전 임의 확정 금지 | +| 8-4 | 편책 | **별도 제작 후 연결** | 바자얽기(5-15)를 빌려 쓰지 않음.**일위대가를 따로 만들어 연결** | +| 9 | 돌쌓기 기울기 | **품셈 표준경사 표대로 자동 + 사용자가 바꿀 수 있게** | 높이·메찰·성절토로 자동 판정, 덮어쓰기 칸을 둠. 교본 축(시설 종류)은 덮어쓰기로 처리 | +| 10 | 물빼기 구멍 | **한 값이 기본, 구조물별로 다르게도 가능** | 기본 Ø50 · 2㎡당(국가기준). 구조물별 덮어쓰기 | +| 11 | 채움 콘크리트 강도 | **고를 수 있게** | 180(국가기준 하한) / 210 선택. 기본값은 아래 「남은 물음」 참조 | + + +### 확정 12~16 (알려만 드린 다섯 → 전부 「하라」로 바뀜) + + +| # | 무엇 | **확정** | +| --- | --------- | ------------------------------------------------------------------------------------- | +| 12 | 내야 할 표 | **16개 전체가 있어야 함.** 안 내던 7개(중기경비계산서 등)를 다 만들 것. **실무 문서에서 확인 가능** | +| 13 | 부대시설 다섯 줄 | **산출에 추가 반영.** 들어가야 할 내용임 (국가지점번호판·안내판·차단기·가설창고·수방자재) | +| 14 | 버림 콘크리트 | **추가.** ⚠ **실무문서 최신본을 따르되 법령·시행령·지침이 있으면 그 값이 우선** | +| 15 | 옛 프로젝트 금액 | **옛 테스트 버전이면 삭제해도 됨.** ⚠ **유가정보는 전국단위 공시가 / 지역단위 공시가를 고를 수 있어야 함** | +| 16 | 도자 한계거리 | **60m.** 상수는 이미 60(`config_system_design.py`)이었고 **설명 주석만 70으로 낡아 있어 맞춤**(2026-09-09) | + + +### ⚠ 남은 물음 넷 — 확정에 딸려 나온 것 + +- **⭐ 중기 조종원 노임 산식** — 우리 값이 실무보다 **−36%**. 실무 두 공사지가 쓰는 계수 +`× 16/12 × 25/20` 를 우리가 안 씀. 고칠 자리는 `record.operator_person_days / 8` **한 줄.** +**넣으면** 굴착기 0.7 시간당 86,096 → **106,384(+23.6%)** · 불도저 19톤 124,842 → +**148,861(+19.2%)** — **기계가 든 공종 전부**가 오름. +⚠ **아직 안 넣었음** — 계수의 원문(기재부 예규)이 저장소에 없어 **「원문 미보유」**로 남기고 +중기목록표 비고에 사실만 드러내 뒀음. **사용자 확정 자리.** + +## ⭐ 사용자 답 대기 — 한자리 목록 (2026-09-09 밤 모음) + +> **왜 모았나** — 코드로 할 수 있는 것이 오늘 거의 바닥났고, 남은 것은 대부분 **사용자가 +> 정해 줘야 움직이는 것**임. 흩어져 있으면 「무엇을 여쭤야 하는지」가 안 보여 한자리에 모음. +> **원문은 각 절에 그대로 있음** — 여기는 목록이고, 셋만 적음: +> **무엇을 정해야 하나 / 왜 우리가 못 정하나 / 정하면 어떻게 되나.** +> ⚠ 값은 **하나도 임의로 굳히지 않았음.** 지금은 전부 사유로 드러나 있음. + +### 금액이 크게 움직이는 것 — 먼저 여쭐 넷 + + +| 무엇을 정해야 하나 | 왜 우리가 못 정하나 | 정하면 어떻게 되나 | +| --------------------------------- | ------------------------------------------------------------ | ------------------------------ | +| **사급 자재 단가 — 누가 견적을 넣나** (9장) | 「못 구함」이 아니라 **누가 넣느냐**의 문제임. 물가정보 API 몫과 업체 견적 몫을 가르는 설계가 먼저 | 자재비 자리가 통째로 서고, 그 위에 제비율이 붙음 | +| **표토제거 축 셋 — 실무·원문이 우리와 다름** (8장) | 실무 시트와 원문이 서로 다르고 우리 축은 그 둘 어디와도 안 맞음 | 표토제거 2,359.03㎥ 가 어느 축으로 설지 정해짐 | +| **품 할증을 여럿 고를 때 합산인가 곱인가** (9장) | 품셈이 여러 할증을 함께 쓰는 법을 안 적어 둠 | 할증이 붙는 모든 줄의 품이 한 번에 갈림 | +| **노체다짐(9-16-2)을 셀 것인가** (9장) | 실무가 성토 다짐을 따로 세기도 하고 안 세기도 함 | 성토 구간 전체에 줄이 하나 서거나 안 섬 | + + +### 자료가 와야 닫히는 것 — 다섯 + + +| 무엇을 정해야 하나 | 왜 우리가 못 정하나 | 정하면 어떻게 되나 | +| ---------------------- | ---------------------------------- | -------------------------- | +| **소단 · 소형사방댐 원단위** | 소광리 53탭에 **탭 자체가 없음**(전수 확인) | 그 둘의 물량이 섬 | +| **BOX암거 원단위** | 실무 자료에 **없음이 확정**됨(관측·소광리 둘 다 0건) | 표준 단면이 오면 전개식이 섬 | +| **폐기물처리비 원문** | 「못 찾음」이 아니라 **원문을 안 갖고 있음** | 총원가 안팎 자리가 정해짐(V-18 과 한 벌) | +| **규준틀 재료량 · 층따기 높이·폭** | 실무 관측값은 찾았으나 **관행값 후보**라 확정 근거가 아님 | 두 공종의 밑수가 확정값으로 바뀜 | +| **종자·비료 단가** | 물가지·견적 품목이라 사급 미결과 같은 자리 | 씨앗뿜어붙이기 재료비가 섬 | + + +### 실무 관행을 물어야 하는 것 — 일곱 + + +| 무엇을 정해야 하나 | 왜 우리가 못 정하나 | 정하면 어떻게 되나 | +| ------------------------------- | -------------------------------------------------------- | --------------------- | +| **하단표 양식을 실무 것으로 맞출 것인가** (4장) | **납품 양식**이라 사무소마다 다름 — 표본이 한 곳뿐 | 표준도·횡단도 하단표 모양이 확정됨 | +| **옆도랑파기를 몇 갈래로 가를 것인가** | 우리 둘(토사·암) ↔ 실무 셋 | 측구터파기 줄 수가 갈림 | +| **「노면고르기」와 우리 「노면다짐」이 같은 공종인가** | 이름이 다르고 실무 값 3.0 의 출처를 모름 | 노면 줄이 하나로 합쳐지거나 둘로 남음 | +| **옹벽 기초잡석·터파기를 셀 것인가** | 품셈은 품만 주고 실무 안에서도 갈림 | 옹벽 줄에 잡석·터파기가 서거나 안 섬 | +| **물구멍 관 길이·규격·간격** | 정본은 평균두께(0.83m), 우리는 상수 0.5m — 정본 쪽이 이치에 맞으나 확정 목록에 없던 줄 | 물구멍 자재·단가가 확정됨 | +| **뒷채움 폭 칸을 둘 것인가** | 문서마다 0.30/0.45 ↔ 0.30/0.60 으로 다름 | 막자갈 밑수가 확정됨 | +| **녹화 반영률 100 %** (V-13) | **법은 100 %**, 실무 사례는 80 — 설계자 판단 자리 | 녹화 공종 물량이 갈림 | + + +### 우리 화면·표기 판단 — 여섯 + + +| 무엇을 정해야 하나 | 왜 우리가 못 정하나 | 정하면 어떻게 되나 | +| ----------------------------------------- | -------------------------------------------------------- | ------------------------ | +| **큰돌쌓기 그림 — 직경에서 두께를 내는 법** (4-12) | 품셈 13-6 은 **직경** 축, 우리 그림 식은 **뒷길이** 축 — 축을 잇는 것은 도메인 판단 | 표준도 1장에 그림이 섬(지금은 사유만 뜸) | +| **관 줄 셋 — 관종 칸 · 세월교 섞임 · 유출부 이중계상** (8장) | 실무 표기 관행을 모름 | 관 줄이 실무 모양으로 갈림 | +| **표 모양 넷에 깃발이 없음** (8장) | B09 판정 기준이 정해져야 함 | 전치형·2단 머리 등 네 모양이 자동 판정됨 | +| **미교차 측점만 반폭 +5m 로 다시 뜰 것인가** (3-10) | 다시 뜨는 비용과 값의 이득을 사용자가 저울질할 자리 | 사면이 원지반을 못 만나는 측점이 줄어듦 | +| **관급/사급 「발주기관 결정」 문구** (V-14) | 문구만 고치면 되나 **B08 화면은 데스크탑 메인 몫** | 사용자가 「미완성」으로 오해하지 않음 | +| **지장목제거 품셈 항목** (9장) | 품셈이 벌목을 **목적별로만** 갈라 맞는 공종이 없음 | 지장목제거 단가가 붙음 | + + +⇒ **스물둘.** 이 목록은 **모으기만 한 것**이고 값은 각 절에 그대로 있음. 답이 오면 +**그 절에서 닫고** 여기서는 지울 것. + +## 0. 공통 기반 — B05·B06이 한 페이지로 움직이기 위한 뼈대 + +### 0-5. 관 옵션 폼 — 세트를 짝으로 다시 만들게 배선 + +- [ ] **[반나절]** 관 옵션 폼이 바뀔 때 **세트 전체를 짝으로 다시 만들게** 배선 — 지금은 + + `B06_Section_UI_Page_Pipe_Options.ts` 가 스펙 칸을 하나씩 옮겨 적음(부분 사본). + - **2026-09-06 판단: 지금은 안 함.** 살아 있는 결함이 아니라 **유지보수 위험**임(새 옵션을 + 더할 때 폼 경로가 그것을 안 옮길 수 있음). 반면 지금 고치려면: + ① `buildCulvertSets` 는 관 지점의 **facility + 전체 options** 를 받는데 B06 에는 그 값이 + 없음(`section.culvert` 스펙만 있음) — 관 지점을 B06 까지 끌어와야 함 + ② 폼 → 조정창 되받기(높이·형태는 `revet_adjust` 로 감)와 **형태별 높이 한계 되돌리기**가 + 이 자리에 얽혀 있어 통째로 갈면 그 둘을 다시 세워야 함. + 새 옵션을 더할 일이 생기거나 값이 실제로 갈리는 것이 관찰되면 그때 할 것. + - **2026-09-09 다시 봄 — 아직 안 함(사유 갱신).** 까닭 ①은 **풀렸음**: B06 이 + `fetchDetailPipePoints` 로 관 지점(facility + 전체 options)을 이미 받아 옴 + (`B06_Section_Api_Culvert_Options.ts`). 까닭 ②는 **그대로임** — 폼 → 조정창 되받기 + (`revet_adjust` 의 높이·형태)와 형태별 높이 한계 되돌리기가 이 자리에 얽혀 있어, + 세트를 통째로 다시 만들면 그 둘을 다시 세워야 함. **하나가 남아 억지로 하지 않음.** + - **대신 오늘 한 것** — 폼 칸 20개를 캐시 경로와 대조해 **빠진 칸 셋**을 찾음. + · `revet_foundation`(기슭막이 기초) — **그리기가 읽는 값**(터파기 파선)인데 안 옮겨 + 적고 있었음 ⇒ 이어 붙였음(커밋 `e2380ea5`). + ⚠ **화면으로는 못 눌러 봄** — 이 칸은 상세(`phase: detail`) 값이라 B06 배치 폼에 + 아직 안 뜸(정본에도 전부 비어 있음). 칸이 화면에 서면 그때 실측할 것. + · `inlet_basin_form`·`inlet_basin_material` — **수량 전용**(B08 이 정본에서 읽음)이라 + 캐시에 안 실어도 됨. 사유를 시험에 적어 뒀음. + - 시험 `test_b06_pipe_form_keys.py` 추가 — **새 폼 칸이 캐시 경로에서 빠지면 잡음**. + 통짜 배선을 못 하는 동안 「조용히 안 닿는 값」을 막는 자리임. + +### 0-2. 계획노선 편집 — 예상노선을 바꿔 쓰는 길 (2026-09-06 사용자 지시) + +**선행:** 0-1 (노선을 바꾸면 ④ 계산 결과를 통째로 버리고 다시 만드는 규칙이 먼저 서야 함). + +지금 노선은 **한 벌뿐이고 불변**임. 실무는 두 벌임 — 사용자가 넣은 **예상노선**(원청, 불변)과 설계 과정에서 그것을 고쳐 만든 **계획노선**(정본). 계획노선을 만들 길을 새로 냄. 자동 제안 기능은 **보류**(뒤에 평면·종단·횡단·유토를 다 보고 제안하는 방식으로 붙임). 옛 「노선 경로 변경을 전체 재계산으로 분리하고 별도 모달·진행 표시·`route_signature` 게이트를 설계한다」 항목은 이 절로 합침. + +**화면** — 좌측 패널에 버튼 하나, 누르면 **큰 모달**이 뜸(계산이 오래 걸려 신중히 하라는 뜻으로 모달을 씀). + +**데이터** — 노선을 세 벌로 나눠 보관해야 함. + +**⭐ 확정 규칙 (2026-09-06 사용자 확정) — 만들 때 이대로** + +1. **노선 변경 = 계획노선만.** 예상노선은 어떤 경로로도 안 고침. +2. **전처리 전에 두 벌을 확보** — 체인이 예상노선을 내면 그 자리에서 계획노선으로 복사. +3. **화면에는 둘 다 보인다** — 예상노선 **점선**, 계획노선 **실선**. +4. **[초기화] = 예상노선을 계획노선으로 다시 복사.** 재계산이 아니라 복사. +5. **노선이 바뀌면 배수유역부터 전처리를 다시 돈다.** +6. **둘로 갈라 다룬다** — **횡단배수 지점**(`pipe_points.json`)은 **새로 계산한 값**, +*그 밖의 구조물**(`structures.json`)은 **옛 측점값(누가거리)을 그대로 이어받음**. +7. **계산은 모달 [확인]을 눌렀을 때만 시작.** 편집 중에는 아무 계산도 안 나감. +8. **재계산은 초기 체인 로직을 재사용**(`run_redesign_chain`) — **입구 하나**만 내면 됨. + +- [ ] **[하루+ · 시공 단계에 켬]** 시공 단계의 **설계변경 노선**은 자리만 잡아 둠 — 설계 프로젝트 전체 완료 후 시공사에 넘긴 뒤 켜지는 기능이라 지금은 구조만 준비. **지금 할 일이 아님**(순서상 마지막). + + **남은 것** +- [x] **재계산 중간 취소 — 만들지 않기로 닫음**(2026-09-09, `5d4473b4`) — 지금 **약 90초** + + (네 번 잰 값 87.3~95.4). 취소를 넣으면 관 지점이 이미 지워진 채 노선·종횡단이 어긋난 채 + 남아 **반쯤 부순 상태**가 됨. 대신 대기 안내에 경과 초를 돌게 했음. +- [ ] **[보류 — 조건 둘이 갖춰질 때만]** **투영 이월 코드 정리.** 허용오차 판정을 넣어 실제 + + 프로젝트 전부가 투영 가지를 안 타는 것까지 확인했으나, **지우는 것은 WARNING 0 이 이어지고 + 관 재배치 경로가 새로 설 때만**임. 지금 지우면 관 0건 결함으로 되돌아감. + ⓘ **2026-09-09 밤 재훑기 — 조건 ①은 이어지고 있음.** 서버 로그 전수에서 + 「투영 이월 실행」 **0건**이고, 대신 「지문은 다르나 같은 노선입니다 — 관 11건 그대로 + 씁니다(최대 어긋남 0.0012m ≤ 0.05m)」가 찍힘(허용오차 판정이 실제로 가지를 막고 있음). + 조건 ②(관 재배치 경로)는 아직 안 섰으므로 **그대로 열어 둠.** + +## 3. B06 횡단설계 + +### 3-17. 횡단도 손질 다섯 (2026-09-12 사용자 지시, 랩탑 보조) + +**① 노면이 넓어 보이는 까닭 — 조사 끝** + +노견은 안 늘어남 — 좌·우 각 0.5m 고정(`config_system_design.py` 표준값). 넓어진 것은 **차도**이고, 까닭이 둘이라 겹쳐 보임. + +- **곡선부 확폭** — 평면 곡선반경 표(별표2 Ⅰ.2.나.(4))로 **곡선 바깥쪽 편측**에만 붙음. 화면 라벨이 `규격 3.00 + 확폭 1.50` 으로 이미 갈라 보여 줌. 1.50m 은 반경 15~18m 구간값이고, 확폭 뒤 유효너비 상한은 5.0m. +- **기슭막이 노폭 연장** — 벽이 1:1.2 성토사면 착지점보다 바깥에 서면 물매를 눕히지 않고 **노견을 그만큼 수평 연장**함(`fillSlopeOf()`). 몫은 벽 라벨 `· 노폭 연장 N.NNm` 으로 뜸. +- [x] 실제 측점 수치 확인 (2026-09-12, `랩탑_메인` 프로젝트 원본 측점 파일 + 설계 엔진 직접 실행) — 4+0.0(80m) 은 반경 34.49m·바깥 **우** 라 차도 눈금이 좌 +1.50 / 우 −2.00, 13+0.0(260m) 은 반경 17.72m·바깥 **좌** 라 좌 +3.00 / 우 −1.50. 눈금은 정상적으로 움직이고 있으며, 안 움직이는 것은 **중심선(계획고 0점)** 임. +- [x] 확폭이 일괄인지 확인 — **아님**. 측점 62개 중 17개만 붙음(측점마다 평면 곡선반경을 재서 표값 적용). +- [x] **A. 노견 표시 넣기** (2026-09-12 구현) — 노면 끝(`road_edges`)에도 짧고 옅은 틱을 세우고, 노폭 라벨 뒤에 `· 노견 0.50m`(좌우가 다르면 `좌 x / 우 y`)를 붙임. 차도 틱과 노견 틱 사이가 노견이라 어느 쪽이 늘었는지 눈으로 갈림. 자리 `B06_Section_UI_Cross_Design.ts` · `B06_Section_UI_Style_Cross_Areas.css`. **자체검증** — `tsc --noEmit` 통과, prettier 통과. ⚠ 화면 실측은 로그인 OTP 때문에 아직 못 함(아래). +- [x] **B. 확폭 정본을 설계 곡선표로 바꾸기** (2026-09-12 구현) — 계획노선 곡선표를 읽어(`_load_design_curves`) 곡선 시·종점을 노선 누가거리로 바꾸고(`_design_curve_spans`), 곡선 안은 설계 반경의 표값 한 값, 앞뒤 10m 는 0 으로 잇고, 그 밖은 확폭 없음으로 매김(`_design_curve_widenings`). 곡선표가 없으면 종전 방식으로 물러섬. **자체검증** — 시험 3건 추가(`test_b06_curve_widening.py`), 전체 회귀 **1298 passed · 22 skipped**, ruff 통과. `랩탑_보조` 프로젝트 원본으로 재계산한 결과: 곡선 26개가 노선에 붙고 확폭 측점이 **17 → 29개**(설계 12m 곡선이 표값 2.25m 를 제대로 받고, 곡선 앞뒤 10m 만 이어짐). 종전에 곡선 밖 직선까지 확폭이 흘러나가던 자리가 사라짐. + ⚠ **이미 만들어 둔 프로젝트는 종횡단을 다시 생성해야 값이 바뀜** — 확폭은 측점 파일에 박혀 저장됨. +- [x] **확폭 때문에 측점을 새로 만들지 않음** (2026-09-12 사용자 확정) — 확폭은 평면 노선을 따라 자연히 붙는 것이라 횡단도를 측점으로 따로 세울 까닭이 없음. **규칙 측점·구조물 측점이 곡선(또는 앞뒤 이음)에 걸리면 그 측점에만** 반영함. 지금 구현이 그대로임 — `_design_curve_widenings` 는 이미 있는 측점 목록만 훑고 측점을 끼워 넣지 않음. +- [x] ⚠⚠ **확폭이 설계 곡선이 아니라 측점마다 다시 잰 반경을 씀** (2026-09-12 실측 — 위 B 로 고침) — `_plan_radii()` 가 측점 앞뒤 10m 세 점으로 외접원 반경을 다시 잼. 그래서 **같은 곡선 안에서도 측점마다 확폭이 달라지고**, 설계 반경과도 어긋남. `랩탑_메인` 실측: 설계 곡선 250.1~259.3m 은 **설계 반경 12.0m(법정 확폭 2.25m)** 인데 붙은 값은 258.1m 에서 1.50m(잰 반경 15.98m), 곡선 밖 260m 1.50m · 280m 0.25m, 곡선 안인 240m(설계 51m)은 0. 게다가 설계 곡선 길이가 3~10m 이라 **곡선 안에 측점이 아예 없는 곡선이 많음**(262.2~266.6m · 270.9~277.7m). 정본인 `planned_route_initial_curves.json`(apex·반경·접선장·BC/EC)을 쓰도록 고칠 것. +- [x] ⚠ **곡선 앞뒤 테이퍼가 사실상 안 먹음** — 종전 테이퍼는 「확폭이 붙은 이웃 측점」을 훑어 폈기 때문에 측점 간격(20m)이 테이퍼 길이(10m)보다 넓으면 중간값이 안 생겼음. B 에서 **곡선 시·종점 누가거리 기준**으로 바꿔 해소됨 — 이제 곡선 앞뒤 10m 안 측점이면 측점 간격과 무관하게 이어짐. +- [x] **중심선은 계획고 0점에 그대로 둠** (2026-09-12 판단) — 중심선은 노선·계획고·측점의 기준점이라 옮기면 종단·3D·수량이 모두 어긋남. 대신 A(노견 표시)로 차도·노견 경계가 보이게 해 혼선을 없앰. 확폭이 한쪽에만 붙어 단면이 좌우 비대칭인 것은 법정 규정대로임. + +**② 조정창 자리 — 횡단도 안 유지** + +좌측 사이드 [횡단 조정] 사본은 사용자가 없앨 예정이라 도면 안 오버레이가 본체임. + +- [x] 오버레이가 좌측 상단 면적표를 가림 — 조정창을 **면적표 높이만큼 아래로 내려** 세움(2026-09-12). 아래 기준으로 붙이지 않는 까닭은 종전 그대로(낮은 횡단도에서 창이 잘림). 표 높이는 `--b06-areas-height`(기본 3.2rem) 한 곳에서 고침. +- [x] 좌측 사본(`B06_Section_UI_Adjust_Dock.ts`)은 **일단 그대로 둠**(2026-09-12 사용자: 유지·확인만). + +**③ B06 종단 그래프를 B05 와 같게 (추가 검토)** + +- [x] **계획선 편집(▲/▼) 누락분 보완** (2026-09-12 사용자 지적) — 구조물 조작만 맞추고 **계획선 편집 버튼층을 빠뜨렸음**. B06 에는 편집분을 얹어 계획선·전 측점 횡단을 다시 푸는 코드(`refreshLocally`)도, B05 와 공용인 편집 초안 세션도 이미 있었는데 누를 버튼이 없었음. B05 와 같은 부품(`createEditOverlay`)을 종단에 얹고 X축 라벨을 15px 올림(▼ 버튼 자리). **저장도 이었음** — 종전에는 B06 이 초안을 **읽기만** 해서 B06 에서 [저장]·[확정]하면 계획선 편집이 정본에 안 남고 사라졌음. **자체검증** — 화면에서 ▲/▼ **124개**(측점 62 × 2) 확인, ▲ 한 번에 0측점 계획고 879.14 → 879.24m 오르고 초안에 `{"0.000": 0.1}` 기록, ▼ 로 되돌려 원값 복귀(검증 흔적 세션까지 지움). 전체 회귀 **1323 passed**, `tsc --noEmit`·prettier 통과. +- [ ] ⚠ **`B06_Section_UI_Page.ts` 828줄** — 700줄 한도 넘음(계획선 편집 배선 +28줄, 손대기 전 800줄). 다음 손질 대상. + +- [x] **어느 페이지에서 저장해도 같은 결과가 되게 맞춤** (2026-09-12 사용자 질문에서 드러남) — 좌측 폼·리스트·종단도는 이미 **같은 부품**이고 구조물(A~G) 저장도 같은 세션·같은 창구였음. 그런데 **관(계곡 통과 시설)만 세 자리가 어긋나 있었음**: ⓐ B06 저장이 델타를 먼저 내보내고 B05 스냅샷을 나중에 써 스냅샷이 B06 편집을 덮었음 → B05 와 같은 순서(스냅샷 먼저)로 바꿈. ⓑ B05 저장이 구간값 키만 넘겨 B06 에서 예약한 이동·추가·삭제가 조용히 빠졌음 → 키 셋을 다 넘김. ⓒ B06 좌측 목록이 정본만 읽어 B05 의 미저장 관이 안 보였음 → 구조물과 같은 규칙으로 미저장분 우선. **자체검증** — 전체 회귀 1299 passed·22 skipped, `tsc --noEmit`·prettier 통과. +- [x] **관 목록을 담는 자리를 한 벌로 합침** (2026-09-12) — B06 의 추가·삭제·이동을 모두 B05 가 쓰는 스냅샷(`pipes`)에 쓰도록 바꾸고, B06 전용 예약 경로(`culvertedit` 세션·`queueAdd`·`queueRemove`·`queueMove`)를 걷어 냄. 옛 세션에 남은 이동 예약만 저장 때 한 번 흘려보내게 읽기를 남김. 이제 좌측 폼·목록·종단 우클릭·측점선 끌기가 **한 함수**를 타고 담기는 자리도 **한 곳**임. **자체검증** — 시험을 「담는 자리가 하나뿐인가 + 옛 이동 예약 배출」로 바꿔 통과, 전체 회귀 1299 passed·22 skipped, `tsc --noEmit`·prettier·ruff 통과. 순 −110줄. + +사용자 원문 — 「B06 종단 그래프 기능이 B05 와 동일해야 함. 마우스 제어, 우클릭 구조물 추가, 좌측 사이드 패널 동작까지 완전히 동일. 상세 내용·위치만 다름. 템플릿화하면 더 좋음」. + +- 지금 B06 은 자체 렌더러 하나(`createLongitudinalProfile`, `B06_Section_UI_Section_View.ts` 안)이고, B05 는 `B05_Profile_UI_Profile_*` 22개 모듈 약 5,900줄(편집·표·줌·휠·구조물·이력). +- [x] **조사 끝 — 그래프 그리는 코드는 이미 한 벌** (2026-09-12) — `createLongitudinalProfile()` 이 B06 폴더에 있고 **B05 가 그것을 불러 쓰는** 구조임. 알약 레인(`buildStructureLane`)·누가토량 배지·좌측 「구조물 배치」 폼(`b_structures_section`)도 이미 공용임. 그러니 「템플릿화」는 새로 할 것이 거의 없고, **B06 에 빠진 것은 그래프 위에 얹는 조작층**뿐임. +- [x] **B06 종단 우클릭 메뉴·관 추가·삭제** (2026-09-12 구현) — B05 와 같은 부품(`mountStructureMenu`)을 B06 종단 그래프에 붙임(`B06_Section_UI_Section_View_Menu.ts` 신설). 일반 구조물은 좌측 「구조물 배치」와 **같은 함수**(`addAt`·`removeById`)를 타고, 관은 이동과 같은 **세션 예약**(`culvertedit`) 경로로 쌓였다가 [저장]·[확정]에서 정본으로 나감 — 세부 배수유역 재분할은 그때 서버가 함. 좌측 목록에서도 관을 넣고 뺄 수 있게 열었음(종전에는 「B05 에서 하라」 안내만 떴음). **자체검증** — 시험 1건 추가(`test_b06_culvert_edit_queue.py` — 넣었다 빼기·뺐다 넣기·중복 넣기), 전체 회귀 1298 passed, `tsc --noEmit`·prettier·ruff 통과. 화면 실측은 로그인 뒤. +- [x] **측점선·알약 끌어 옮기기** (2026-09-12 구현) — 종단 측점선(`onDragStation`)과 구조물 알약(`onMove`) 둘 다 받아 같은 길로 보냄. 관은 예약 이동(저장·확정 때 정본·배수유역 재분할), 구조물은 정본 이동. 끌기 판별·대상 찾기는 `B06_Section_UI_Section_View_Menu` 로 모음. **자체검증** — `tsc --noEmit`·prettier 통과, B05·B06 시험 369건 통과. +- [x] **화면 실측 끝** (2026-09-12, ORCA 내장 · `랩탑_보조` 프로젝트 B06) — 횡단 카드 62장에서 **차도 눈금 124개 + 노견 눈금 124개**(카드당 2+2), 라벨 `노폭 3.00m · 노견 0.50m`(확폭 측점은 `노폭 4.50m (규격 3.00 + 확폭 1.50) · 노견 0.50m`). 암 절토 칸은 머리말 `1:` + 값 `0.40`. 기슭막이 벽에 **클립 밖 해칭선 0개**(대각 이음선 사라짐, 클립 안 돌쌓기 선 5개는 그대로). 조정창은 면적표 **아래로 6px 띄워** 섬(겹침 없음). 종단 우클릭에서 **구조물군 → 종류 2단 메뉴**가 뜸(A 횡단배수·B 종단배수 …). 검증 중 값은 아무것도 안 바꿈(세션에 관·구조물 예약 0건). + ⚠ 확폭 값 자체는 **종횡단을 다시 생성해야** 새 규칙으로 바뀜 — 지금 화면은 옛 저장값임. +- [x] **`B06_Section_UI_Section_View.ts` 700줄 아래로** (2026-09-12) — 817줄이던 것을 **693줄**로 줄임. 종단 그래프·알약 레인·우클릭 메뉴·누가토량 배지·고정 Y축 세우기와 가로 스크롤 세로창 배선을 `B06_Section_UI_Section_View_Draw.ts`(210줄)로 옮김. 높이 재기·되먹임 보정·선택 상태는 본체가 그대로 쥠. **자체검증** — `tsc --noEmit`·prettier 통과, 전체 회귀 1299 passed·22 skipped, 화면 재확인(카드 62장·종단 SVG·고정 Y축·알약 레인·누가토량 배지 −7,706.4㎥·우클릭 메뉴 모두 정상). +- [x] ~~B06 종단에 빠진 조작 셋~~ — ① 우클릭 메뉴(`mountStructureMenu`, B05 에만 붙어 있음) · ② 측점선 끌어 옮기기(`onDragStation` 을 B06 이 안 넘김) · ③ 알약 끌기(B06 은 `onMove: () => undefined` 로 막아 둠). +- [x] **갈래 확정 — 「완전히 같게」**(2026-09-12 사용자: 「B05와 B06은 같은 페이지야. 넣을수 있어야함. 일원화 되어있어야해」). 조사해 보니 B06 도 [저장]·[확정]에서 이미 관 정본을 내보내고 있어, 편집 입구만 열면 됐음. 옛 메모: 일반 구조물(A~G군) 추가·삭제는 B06 이 이미 쓰는 구조물 정본으로 바로 됨. 그러나 **배관 추가**는 B05 배수유역도 편집기(`B05_Profile_UI_Drainage_Pipes`)를 거쳐 관 지점 정본을 쓰고 **세부 배수유역을 다시 나누는** 일이라, B06 에 그대로 못 옮김(B06 은 지금 「옮기기」만 예약해 두고 재분할은 [저장]·[확정] 때 서버가 함). 갈래: **(가)** B06 우클릭에서는 일반 구조물만 넣고 배관은 B05 로 보내기 · **(나)** 배수유역 편집기까지 B06 에 올려 완전히 같게 만들기(작업량 큼). **사용자 확정 대기.** + +**④ 기슭막이를 가로지르는 선 (추가 검토)** + +13+0.0 유출 기슭막이 상자를 선 하나가 관통함. + +- [x] 정체 확인·제거 (2026-09-12) — `appendWallHatch()` 가 **벽 상단에서 바닥까지 대각 이음선을 형태와 무관하게 늘 긋고** 있었음(옛 사용자 스케치의 가운데 선). 그 줄을 뺌. 해칭·벽 윤곽은 그대로. + +**⑤ 암 절토 입력을 각도에서 1:n 으로 (추가 검토)** + +- 속값은 이미 경사비(1:n)이고 화면만 각도(°)로 바꿔 보여 주는 중(`B06_Section_UI_Cross_CutSlope.ts`). +- [x] 입력칸을 `1:0.40` 꼴로 바꿈 (2026-09-12) — 머리말 「1:」 + n 입력(0.05 단위), 툴팁에 각도를 괄호로 함께 보임, 되돌리기 판정도 경사비 기준. **자체검증** — `tsc --noEmit`·prettier·B06 시험 139건 통과. 화면 실측은 로그인 뒤. + +### 3-9. 소단(berm) — 확정값과 남은 것 (2026-09-07 사용자 지시) + +**자리** — 소단·소단측구 둘 다 **구조물 배치 컨테이너 안**임(사용자 정정). 소단은 「사면안정」군, +소단측구는 「종단배수」군. 연장은 놓은 구간 길이로 다른 구조물과 같은 길에서 나옴. + +**폼 기본값 확정 (2026-09-07)** — **폭 0.5m · 간격(사면길이) 3.0m · 안쪽 기울기 0°** + +- 근거 — 별표2 범위(사면길이 2~~3m마다 · 폭 50~~100㎝) 안에서 **가장 적게 파는 조합**. +기본값은 **되돌리기 쉬운 쪽**이어야 함 — 더 넣는 것은 폼에서 한 번이지만 이미 판 것을 +되돌리면 전 측점 재계산임. +- ⚠ **소단은 비탈을 완만하게 만듦** — 1:1 절토면 기준 실효 경사가 0.5·3m 면 1:1.24 인데 +1.0·2m 면 **1:1.71** 로 서서 다른 비탈이 됨. 기본을 넓게 잡으면 안 되는 까닭. +- 소단측구를 나중에 올리려면 폭이 모자람(측구 0.5~1m) — 그때 사용자가 **1.0m 로 올리면 됨**. + +**벽이 선 측점은 소단을 안 놓음** — 성토측에 기슭막이가 서면 성토 설계선을 벽 상단에서 끊으므로 +소단이 끼어들 사면이 없고, 다단 벽은 단 사이 성토부선이 이미 소단 노릇을 함. +**판정 단위는 측점**(구간째 거부하면 배수관 유출 기슭막이 때문에 못 쓰게 됨 — 시험 48곳). + +- [ ] **[반나절 · 사용자가 뒤로 미룸]** **소단측구를 「그릴」지는 뒤로** — 사용자 확정 ㉯(「일단 수량만, 그림은 나중에 검토」). + + 지금은 **값만 받고 안 그림**이라 「사면 쪽 기울기」(소단과 반대 부호)는 기록만 되고 + 화면에 안 보임. 그리기로 하면 그때 **부호를 화면에서 확인**할 것(시험으로는 안 걸리는 자리). + +### 3-10. 사면이 원지반을 못 만나는 측점 — 실측과 판단 (2026-09-07 데스크탑 창 제기) + +**판단** — 현행(경고 표시) 유지가 맞음. 미교차 **22곳/105(21%)** 중 **절반 이상이 지형상 영원히** +**안 닫히고**(계곡·절벽 쪽으로 지반이 달아남), 닫히는 쪽도 중앙값 +3m 이나 **꼬리가 +292m** 라 +전역 확대는 값이 안 나옴. **수량이 적게 나오는 것은 사실**이므로 **표기로 막는 것이 맞음.** + +- [ ] **[답 대기]** **선택지(사용자 판단 대기)** — **미교차 측점만 반폭 +5m 로 다시 떠서 재계산**하면 + + 절반 정도가 실제 값으로 바뀜. 수단은 이미 있음(`ensureSampledWidth` — 측점별 반폭 재생성). + 비용은 그 측점만 백엔드 재샘플(20여 곳 × 1초 안팎). **전역 확대는 하지 말 것.** + +### 3-15. `B06_Section_Engine_Design.py` 가 700줄을 넘음 (2026-09-09) + +``` +남길 것 compute_cross_design 본체 + 결과 조립 (짝이 걸린 자리) +떼는 것 ① SectionGeometry 클래스 → B06_Section_Engine_Design_Geometry.py + (TS 짝은 이미 common_util_cross_design_geometry.ts 로 떨어져 있음 — 같은 선) + ② 표준값 해석·저장분 읽기 도우미 → B06_Section_Engine_Design_Specs.py + (_resolve_group · _as_float · curve_widening_args — TS 에 짝이 없는 파이썬 전용) +``` + +``` + ⇒ ①은 **TS 가 이미 그 선으로 갈라 둔 자리**라 거울이 안 깨지고, ②는 짝이 없는 몫임. + 착수 전 이 축을 한 번 더 보이고 승인받을 것. +``` + +## 4. B07 도면 아래 표 — 표준도(구조물도) · 횡단도 (2026-09-08 사용자 지시) + +### 4-1. 무엇을 만드나 — 사용자 방향성 + +**표준도 = 구조물도임**(사용자 정정 「도면 내용 중에 표준도가 구조물도임」). +그 프로젝트에 들어간 구조물의 **표준을 적은 장**이고 다른 도면과 성격이 다름. + +- **한 장 = 상단 도면 + 하단 단위당 정보표**(단위 **길이 · 면적 · 단가**). +- **실무는 엑셀 복사·붙여넣기로 만들었음.** 우리는 **내장 CAD 에서 그림도 표도 고칠 수 있게** 함. +- **도각(테두리·표제란) 필요 없음.** +- 프로젝트에 들어간 **구조물을 하나씩 하단 탭**으로 늘어놓아 확인. +- 표 값은 **영구저장소가 필요할 수 있음** — 확인할 것(4-5). +- **이 표는 B08 로 이어질 것.** + +✅ **교본 근거도 있음** — 「구조물도는 … **표준도** … 등으로 **갈음할 수 있다**」(임도기술교본 3-3 +실시설계). **사용자 정정이 교본과 같음.** + +**실무 원본 실물** — 울진소광 `07-구조도-소광리.xlsx`, **보이는 22탭 + 숨긴 31탭**, +**탭 하나 = 구조물 하나**. 탭 안은 **위 치수조서 + 아래 부위별 수량표**. +표는 **가로 모양**(`공종 | 규격이 열 머리 | 단위`)이고 별도 「규격」 열이 없음. +일부 탭은 `공종 | 산출 논리 | 수량 | 단위`. +⚠ **「단위당」의 단위가 구조물마다 다름** — 날개벽·집수정·돌골막이 **개소당**, +돌기슭막이·수로류·옹벽류 **m당**, 돌붙임 **㎡당**. **통일하지 않음.** +⚠ **단가·금액 열이 원본 어디에도 없음** — 사용자가 말한 「단가」는 **새로 넣는 칸**임. 넣는 모양은 4-3 요약. + +### 4-3. ⭐ 조사·합의에서 정해진 것 — 요약 + + +| 무엇 | 정해진 것 | +| ------------- | -------------------------------------------------------------------------------------- | +| **장 나눔 축** | **제원 조합 하나 = 한 장**(종류 수가 아님). 제원에 기울기가 들어 있어 **기울기가 바뀌면 장이 갈림** | +| **하단표 값 출처** | B08`build_unit_table` 결과를 **표 모양으로 접기만** — 계산을 새로 만들지 않음 | +| **단위** | 구조물마다 다름(날개벽·집수정·돌골막이**개소당** · 돌기슭막이·수로류·옹벽류 **m당** · 돌붙임 **㎡당**). **통일하지 않음** | +| **단가 칸** | 실무 원본 53탭 어디에도 없음 —**우리가 새로 넣는 칸.** 공종 줄마다 단가 + 맨 아래 1m당 총액 **둘 다** | +| **단가를 넣는 자리** | 「기초자료」 탭**한 곳**. 도면은 **비추기만** (확정 6번) | +| **값을 고치는 동작** | **표 칸에서 바로.** 좌측 폼은 두지 않음 | +| **저장 자리** | `project_settings.json` 의 **자기 구획 하나**(`save_section()`, B08 이 이미 그 문을 씀). **DB 안 만듦** | +| **B08 과의 관계** | **안 겹침. 합치지 말 것** | +| **한 장의 모양** | 도각**없음** · 그림 6 : 표 4 · 상단 도면 + 하단 단위당 정보표 | +| **그림 본** | `cross_standard`(표준횡단도) 짜임을 본뜸. 여러 장 나눔은 `plan_lidar` 본 | +| **전면 기울기** | 품셈 13-4-4 「표준경사」로**자동 판정 가능**(직고·메/찰·성/절토로 갈림) + 사용자 덮어쓰기 (확정 9번) | +| **교본 근거** | 「구조물도는 …**표준도** … 등으로 **갈음할 수 있다**」(임도기술교본 3-3 실시설계) | + + +### 4-5. 아직 안 만든 것 — 명세 셋 + +#### 표 값을 어디에 저장하나 — ✅ DB 안 만듦 + +`project_settings.json` 의 `save_section()` 에 **자기 구획 하나**만 얻으면 됨(B08 이 이미 그 문을 씀). +도면 파일(`design/drawings/{id}.json`)에 남기면 **코드 판이 바뀔 때 날아감** — 그것이 문제였지 +**DB 가 필요한 것은 아니었음.** +⚠ 저장 키가 `drawing_id` 단위라 **프로젝트를 넘나들지 못함** — 공용 라이브러리는 별개 결정. + +#### 표에 세울 칸 여덟 — 요약 + +``` +전면 기울기 · 상단폭 · 뒷길이 · 재료 · 저판·벽체 두께 · 기초잡석 두께 · 물빼기 구멍 · 이음(줄눈) +``` + +**⇒ 지금 상태** — **뒷길이·재료·전면 기울기·물빼기는 등록부에 칸이 섰음**(2026-09-09). +남은 것은 **저판·벽체 두께**(옹벽만 실무 도면에서 나왔음) · **이음(줄눈)**(품셈에 줄은 있고 수량 칸이 빔). +⚠ **「재료」 칸 하나가 셋을 한꺼번에 풂** — 고임돌·뒤채움·공종 갈래가 다 돌 종류를 따라감. + +#### ⚠ 전면 기울기 이름이 넷으로 흩어져 있음 — 모으는 것이 이 일의 절반 + +`REVET_LEAN_RATIO`(TS · **실제 도는 값**) · `REVET_FACE_SLOPE`(파이썬 · 읽는 곳 없음) · +`options["face_slope_ratio"]`(등록부에 없는 키) · `data_masonry/*.json`(읽는 코드 없음). +`**data_masonry` 를 정본으로 삼고 넷이 그것을 읽게 할 것** — 파이썬이 이미 `face_slope` 를 +스펙에 실어 보내므로 **TS 가 상수 대신 그 값을 읽으면** 통로를 새로 안 파도 됨. **반나절 안쪽.** +⚠ 말풍선·도면 글자도 같은 값을 읽어야 함 — **글자만 0.3 으로 남으면 화면이 거짓말을 함.** +✅ 거울 시험은 필요 없음 — 벽 기하는 **TS 한 벌**이고 서버도 그 TS 를 Node 로 돌림. + +### 4-12. ⭐ 표준도 만들기 — 착수 (랩탑 보조, 2026-09-09 사용자 「진행해줘」) + +**담당 랩탑 보조.** 순서는 결정 시트 확정 5번 그대로 — **1단계 하단표(나흘) → 2단계 돌쌓기 +그림(닷새) → 3단계 나머지 일곱(대엿새).** + +**⭐ 지금 어디까지 섰나 (2026-09-09 밤 전수 확인)** — **1단계 하단표는 네 장 다 섬**(V-9 닫음). +**2단계 그림은 절반 돌고 있음** — 코드가 있고 **뒷길이가 정해진 장에서는 실제로 그려짐**. +안 그려지는 장은 코드가 없어서가 아니라 **제원이 없어서**임. 못 서는 장에는 까닭을 화면에 +띄웠음(`dd8c86fa`). ⚠ 큰돌쌓기만은 규격 축이 **직경**이라 영영 못 그림 — 그림 대상에서 +빼고 사유만 띄웠고, 「직경에서 두께를 내는 법」은 **사용자 답 대기 목록**에 세웠음. + +#### ⚠ 횡단도 하단표 양식이 실무와 다름 — 답 대기 셋 + +출처를 못 찾았음(코드 주석·계획서·git 이력·지식DB 전부). **「우리 양식이 틀렸다」로 가지 않음** — +실무 표본이 **한 곳뿐**이고 사무소마다 다를 수 있음. **필요한 것은 판정이 아니라 출처**이고 +그 출처가 없음. + +- [ ] **[답 대기]** 하단표 양식을 실무 것으로 맞출 것인가 — **납품 양식이라 사용자 확정 자리.** +- [ ] **[답 대기]** 옆도랑파기를 **몇 갈래**로 가를 것인가 — 우리 둘(토사·암) ↔ 실무 **셋** + + (토사·연암·보통암). 4-9 ㉡ 이 「가를까」에서 「몇 갈래로」로 바뀜. +- [ ] **[답 대기]** 「노면고르기」와 우리 「노면다짐」이 같은 공종인가 — 실무 값 **3.0** 이 + + **노면 폭 3.0m 와 같음**(면적이 아니라 폭을 적은 것일 수 있음). 4-10 ㉪ 과 같은 줄. + +ⓘ **식생옹벽블럭도 터파기가 「기초 + 비탈」 두 줄**임(기초 0.82 + 비탈 1.77). 기슭막이 정본· + 옹벽에 이어 **세 번째 원본 근거** — 결정 시트 1번(비탈 터파기)에 힘이 실림. + +#### 3단계 — 나머지 일곱 종류: **그림 문제가 아님** + +그림을 못 그리는 게 아니라 **아래 표가 안 섬.** 기슭막이·골막이·바닥막이·개거·흙막이(떼)는 +3단계에서 섰고, 옹벽은 관측 원단위 **1규격뿐**이며 그 한 규격조차 **그림용 치수가 없음** +(원문에 두께·폭이 없음). 나머지는 원단위 미확보 사유가 화면에 뜸. + +**⇒ 3단계의 진짜 일감은 「그림 일곱 장」이 아니라 「수량 산출식 아홉 종류」임.** + +- [ ] **[답 대기]** 소단 · 소형사방댐 — 소광리 53탭에 **탭 자체가 없음**(2026-09-09 전수). + + BOX암거와 같은 자리 — 자료를 주셔야 물량이 섬. +- [ ] **[답 대기]** BOX암거 — **실무 자료에 없음이 확정됨**(2026-09-09): 관측 원단위 + + `not_found` 와 소광리 53탭 **둘 다 0개**. 「우리가 못 찾은 것」이 아니라 「실무에 없는 것」. + ⇒ 표준 단면(벽·저판·상판 두께)을 **사용자가 주셔야** 물량이 섬. +- [ ] **[답 대기]** 옹벽 기초잡석을 계상할지·두께를 얼마로 볼지 — 품셈 12-25 는 품만 주고 + + 두께를 안 정함. ⚠ 실무 「잡석 유/무」 축은 **dwg 파일 이름에만** 있고 계산표엔 없음. + +⚠ **구조물이 있는 프로젝트가 아직 없음**(내 `936be972` 는 0기). 표 칸이 서면 무엇을 심을지 +조율 창과 정할 것 — **심는 것은 아직 하지 않음.** + +### 4-13. ⛔ 중간 점검 시점의 상태 (2026-09-09 밤, 랩탑 보조) + +**표준도 — 지금 서 있는 것** + + +| 갈래 | 종류 | +| --------------- | ------------------------------------------------------------------------------------------------------------------------ | +| ✅**섬** | 돌쌓기(찰·메) · 큰돌쌓기 · 기슭막이(돌 계열) ·**골막이(돌)** · 바닥막이(돌붙임 찰·메) · 개거(두 규격) · **흙막이(떼)** | +| ⚠**칸만 오면 됨** | 옹벽 — 「식생옹벽블럭」 형식이 붙었고 치수는 소광리 「옹벽2.0」에 있음.**날개벽·집수정** — 정본 여섯 탭을 다 읽어 뒀고 개소당 7~8줄, 치수가 타입마다 붙박이라 **표로 옮기면 됨**(아직 시작 안 함) | +| ❌**자료가 없어 못 섬** | 소단 · BOX암거 · 소형사방댐 · 옹벽 H=1.6 · 흙막이 나머지 일곱 형식 · 골막이 나머지 다섯 형식 · 기슭막이 비(非)돌 형식 넷 | + + +⚠ **자료 없는 것은 일위대가를 임의로 만들지 않음**(확정 5차 3번 보류) — 사유만 화면에 뜸. + +- [x] **날개벽·집수정 원단위**(2026-09-09, `0747979c`) — 소광리 원본 다섯 탭의 개소당 + + 소계를 그대로 옮기고 「관보호공 날개벽」 고르는 칸까지 이었음. 집수정 Ø800 은 이미 있었음. + ⚠ 거푸집 종류가 탭마다 갈려 이름을 뭉개지 않았고, 철근·면목은 원본에 없어 안 지어냄. +- [ ] **[답 대기]** **물구멍 관 길이** — 정본은 개소당 길이를 **평균두께**로 잡음 + + (H=2.0 에서 0.83m). 우리는 상수 **0.5m** 라 −40 %. **관이 벽을 가로지르므로 정본 + 쪽이 이치에 맞음.** 확정 5차 목록에 없던 줄이라 안 건드리고 주석·거울시험에 차이만 + 못박아 뒀음(`test_b08_stone_masonry_mirror.py`). +- [ ] **[답 대기]** **뒷채움 폭 칸** — 막자갈 밑수인데 제원에 칸이 없어 정본 0.30/0.45 + + 붙박이. 소광리는 0.30/0.60 이라 문서마다 다름 — 칸이 필요한지. + +### 4-10. 근거가 없어 막힌 것 — 요약 + +**⇒ 지금 살아 있는 것만 (2026-09-09 밤 기준)** + + +| 막힌 것 | 상태 | +| ------------------------------------ | ----------------------------------------- | +| 옹벽 H=1.6 원단위 · 소단 · BOX암거 · 소형사방댐 | **자료 없음이 두 원본으로 확정** — 사용자가 주셔야 함 (시트 8번) | +| 표토 축 셋 | **확정 대기** (시트 9번) | +| 큰돌쌓기 재료 원단위 | 13-6 [주]⑦ 「설계수량」 — 관측값 또는 확정 | +| 목재틀흙막이 원단위 | 각재·판재 카탈로그 보강 | +| 사급 자재 단가 · 관급/사급 | ✅**확정 5차로 닫힘** (전부 사급 · 물가정보 API) | +| 전면 기울기 · 측구 토사/암 · 기초잡석 · 제근 · 표토 두께 | ✅**확정·조사로 닫힘** | + + +⚠ **「빈 장」 목록과 「그릴 치수 없음」 목록은 같은 물음의 두 얼굴** — 치수를 정하면 수량·그림·표준도가 함께 섬. + +## 8. B08 수량·설계내역 + +### 8-35. 오솔길 대조 「채택 순서」 1~3 (2026-09-12, 데스크탑 보조) — 검증 대기 + +근거: 오솔길 토공로직 대조 아티팩트 06절. 데스크탑 메인 창이 배정, 세 건 다 끝내고 push 함 +(`1bfe1aa6` · `465dbb95`). + +- [x] **① 토적표가 측구 가름값을 그대로 읽음** — `_split_ditch()` 가 절토 면적비로 다시 + 안분하던 것을 멈추고 B06 이 낸 `ditch_soil_area_m2`·`ditch_rock_area_m2` 를 그대로 씀. + 근거 `ditch_split_basis` 를 줄에 실음. 설계값이 아예 없는 저장분만 옛 안분으로 떨어지고 + (`cut_area_ratio_fallback`) 그 줄 `notes` 에 사유가 남음. `None` 과 `0.0` 을 가름 — + 0.0 은 설계가 낸 「없음」임. + + **자체검증** — 라우터 경로로 설계 dict 를 태워 봄: 설계 0.05/0.35 가 그대로 서고(옛 로직이면 + 0.30/0.10), 10m 구간 측구 암 입적 1.75㎥ ← 옛 0.50㎥. **값이 움직이는 자리임.** + 시험 세 갈래 추가(설계값 그대로 읽음 · 못 가른 측점 전량 암 · 폴백 사유). + `test_b06_ditch_split.py` 는 안 건드림. +- [x] **② 표기 자리수를 품셈에 맞춤** — 단면적 ㎡ 1자리 · 체적 계열 ㎥ 2자리 · 합계 정수 + (`SUM_DIGITS`). 계산은 전정밀 그대로. + + **자체검증** — ORCA 내장 브라우저(5174)에서 그 모듈을 불러 표를 그리고 칸 글자를 읽음: + 본문 `1.2 | 9.46 | 8.51 … 17.91 … 2.3 | 40.12 | 9.05 | -30.99 | -31.23`, + 합계행 `30 | 123 | 111 | 12 | 14 | 5 | 5 | 2 | 2 | 133 | 40 | 9 | -31`. 단면적 합계는 여전히 빈칸. +- [x] **③ 암 환산계수를 고를 수 있게 엶 — 기본값 불변** — 정의처는 + `config_system_design.EARTHWORK_CONVERSION_FACTORS` 한 곳 그대로. 고른 값은 프로젝트 설정 + `quantity.conversion_factors_override` 에 얹고 `earthwork_conversion_factors()` 한 함수가 풀어 냄. + 그 함수를 거치는 자리 여섯 — 토적표·운반표·기초단가(B08) · 유토곡선 컨텍스트·배분 계산· + [저장] 재계산(B06). 산출 조건 패널에 갈래별 칸 신설(기본값·품셈 범위 표시 · 범위 밖은 + 막지 않고 사유 입력 · 「유토곡선·운반표·기초단가에도 같이 닿음」 안내 한 줄). + + **자체검증** — 파이썬: 안 고르면 정본과 한 글자도 안 다름 · 고른 갈래만 갈아 끼움 · + 리핑암 1.0 을 고르면 보정량 11.5→10.0 ㎥ 이고 운반표 ÷C 도 같은 값으로 돎 · + 범위 밖(발파암 0.8)도 서고 `in_range=false` 로만 알림. 시험 7개 추가, 전체 `1296 passed`. + 화면: 브라우저에서 패널을 그려 조작 — 시작은 빈 칸(기본값은 placeholder) · 리핑암 1.0 은 + 범위 안이라 사유칸이 안 뜨고 · 발파암 0.8 은 경고+사유칸이 뜸 · 저장 몸통은 + `{ripping_rock:{compacted:1}, blasting_rock:{compacted:0.8, reason:"토질시험 값"}}` · + 칸을 비우면 그 갈래가 몸통에서 빠져 기본값으로 되돌아감. +- [ ] **④ 양식 갈아 끼우기 — 방향만 정하기** `[사용자 답 대기]` — 횡단도 아래 표의 열 구성을 + 양식 파일로 뺄지. 「정답 양식 하나를 찾는다」에서 「갈아 끼운다」로 방향을 바꿀지만 정하면 됨. + 양식 목록은 사용자가 줘야 함. 법면보호공 2↔4갈래도 여기 딸림. **코드 착수 전임.** +- [ ] **⑤ 사방댐은 밑그림만 접어 둠** — 아티팩트 5절 ㉠~㉢. 착수 시점 미정, 지금 하지 말 것. + +### 8-29. ⚠ 사용자 확정 대기 — 요약 (원문은 옮겼음) + +**⇒ 그 목록이 지금 어떻게 됐나** + +``` +확정 5차(2026-09-09)로 **대부분 닫힘** — 돌 종류 · 콘크리트 타설 · 지장목제거 · 제근 단위 · + 돌 무게 · 관급/사급 · 층따기 단위 · 버림 콘크리트 +살아 있는 것 시트 8번(자료) · 시트 9번(표토 축) · 규준틀 손율 · 물빼기 길이 · 높은 벽 +아직 원문이 없는 것 폐기물처리비 · 중기 조종원 노임 계수(기재부 예규) +``` + +⚠ **다시 물으려면 그 아카이브부터 볼 것** — 「어디까지 찾아봤나」가 거기 있음. 안 보고 물으면 같은 조사를 두 번 함. + +### 8-32. 남은 손질 (2026-09-08 — 옛 8-30 을 접음) + +**B08 은 동작 상태임.** 아래는 손대다 만 것이 아니라 **확인은 끝났고 손을 안 댄 것**들이다. + +- [x] **밑수 단위 「인」 6건 중 넷이 오독** — 이미 고쳐져 있었음(`4fc5b38d`). 마스터에 「인」 밑수 0건. +- [ ] **표 모양 넷에 깃발이 없음** `[사용자 답 대기 — B09 판정 기준]` — 전치형 21 · 2단 머리 6 · 좌우 두 판 9 · 뭉친 이름 7. + + 값이 틀린 것이 아니라 **마스터를 행-자원으로 읽는 다른 자리가 조용히 틀릴** 자리. + 깃발만 실으면 됨. ⚠ **B09 판정 기준을 먼저 물어 같은 잣대로 셀 것.** +- [x] **안내 문구 둘**(타설·동바리) — 둘 다 조건이 붙어 사실과 맞음. +- [ ] **관 줄 ㉠ — 관종(管種) 칸이 아예 없음** `[사용자 답 대기]` (2026-09-09 가름) + + 품셈이 관종으로 갈림 — `FP-12-11-02` 흄관(밑수 1 m · 1 개소, **표가 둘**) · + `FP-12-11-03` 파형강관(1 m). 지금은 **직경만** 있어 못 고름. 실무 울진이 파형강관인 것은 + **그 공사지 관행이지 우리 기본값이 아님.** ⇒ `pipe_material` 같은 칸 요청함. + 안 정하면 빈 값으로 두고 B08 이 「관종 미지정으로 공종을 못 고름」으로 드러냄(암 시공법과 같은 처리). +- [ ] **관 줄 ㉡ — 관이 아닌 점이 섞여 있음(세월교)** `[사용자 답 대기]` (2026-09-09 가름) + + 11점 중 **2점이 `facility: ford_bridge`(세월교)** 이고 `options` 가 비어 있음. + 그냥 세면 **세월교를 관으로 셈.** ⇒ 「`facility` 가 있으면 관이 아님」으로 봐도 되는지 확인 요청함 + (그러면 관은 9건). +- [ ] **관 줄 ㉢ — 유출부 기슭막이 이중계상 자리** `[사용자 답 대기]` (2026-09-09 가름) + + NO.85.05 에 `outlet_revet_length_m: 10` 이 있음. 기슭막이는 **구조물로도 배치될 수 있어** + 누가 세는지 정해야 함. 지금은 안 겹침(그 프로젝트 구조물은 돌쌓기(찰) 4 · 옹벽 1 · + 흙막이 1 · 큰돌쌓기 1). + ⚠ **관 줄이 서는 날 ㉡ 가드가 걸릴 자리임**(B09 지적) — 관 부설과 터파기·되메우기가 + 각각 오면 **같은 굴착을 두 번 셀 수 있음.** + +- [x] **관 줄 밑감 — 연장(m)** — 측점 `design.pipe_length_m` 로 들어오고 B08 이 읽음. + + ⚠ **남은 것은 위 ㉠·㉡·㉢ 답뿐임** — 답이 와야 관 줄이 섬. +- [ ] **규준틀 재료량 — 실무 관측값을 찾았음(참고 후보)** `[사용자 답 대기]` (2026-09-08) + + ⚠ 2026-09-09 — 조율 창이 **「개소당 목재 규격·수량」 화면 칸**을 넘겼음(층따기 깊이·표토 + 두께와 같은 집안). 손율은 원문에 있음(비탈 50% · 수평 80%) — **규격만 받으면 바로 섬.** + 지금 규준틀 4,921,267원이 **인력 품만의 값**임. + 품셈 11-2·11-3 [주]④ 가 「재료량은 **설계수량에 따른다**」라 미확보로 두었는데, + 울진 라이브러리 §8 에 실측이 있음: + **규준틀 수평 | 개소 | 각재 50×50 0.0044㎥ · 판재 T12 0.0029㎥ · 못 0.03㎏** + ⚠ **실무값이라 후보이지 기본값이 아님**(★법대로). 비탈 규준틀 값은 그 시트에 없음. + **정할 것** — 이 값을 쓸지, 설계수량 입력 칸을 만들지. +- [x] **밑수 대조 가드** — **내역에 실리는 25 줄이 전부 대조됨**(`8a78927d`). 마지막 한 줄(가설창고)에 밑수를 채웠음. + + ⓘ **마스터 자체는 여전히 반쯤 빔** — 밑수가 선 공종 163/477 · 단위 빈 일위대가 48. 다만 **우리가 안 쓰는 공종**이라 지금 금액엔 안 걸림. +- [x] **견적가격은 4순위** — 화면에 그 사유 문구가 이미 있음. +- [ ] **⚠ 폐기물처리비 — 「못 찾음」이 아니라 「원문을 안 갖고 있음」** `[자료 없음 — 원문 확보 먼저]` (2026-09-08) — + + `법률/` 40개에 **폐기물 관계 법령이 한 건도 없음**(건설폐기물법·폐기물관리법 미보유). + **원문 확보가 먼저.** + +``` +국가지점번호판 500m마다 임도규정 제26조5항 ⚠ **법정 의무인데 줄 없음** · 품셈 공종도 없음 +안내판·준공표지판·차단기 제26조6항·교본11장 줄 없음 · 품셈 없음 +공사 입간판·현수막 교본 11장(견적) 줄 없음 · 품셈 없음 +가설창고(컨테이너) 〃 줄 없음 · ⭐ **품셈 FP-11-01 있음** +수방대책용 자재 〃 줄 없음 · 품셈 없음 +``` + +``` + ⚠⚠ **법 조문 성격이 갈림**(2026-09-08 원문) — **제26조는 「임도의 **보수·관리**」 조항**이고 + 원문이 「…국가지점번호판을 제작하여 **500미터 마다 설치·관리하되, 필요시 거리를 조정할 수 + 있으며**」임. **관리 의무인지 신설 설계 수량 의무인지 원문만으로 안 갈림** — 실무가 + 2개소·1km 였던 것과도 얽힘. **사용자 확인 자리.** + ✅ **안내판은 의무 맞음** — 제26조⑥ 「시점 및 종점에 안내판 … **설치하여야 한다**」. + ⚠ **차단기는 법령·행정규칙에 없음**(교본 11장만). + ⚠ **편책은 임도 법령엔 없고 사방 행정규칙에 있음**(`사방사업의 설계·시공 세부기준:147` + 「편책·바자얽기」) — **공법 설명뿐 수량 밑수 없음.** 그대로 막힘. + ✅ **실무 확인(2026-09-08) — 번호판만 실물 근거가 있고 나머지 넷은 실무에도 없음.** + · 국가지점번호판 — 울진 1공구 수량집계 「**2 개소**」 · 2공구 「취수정·**국가지점번호판 2**」 · + 3공구도 구조물 구성에 포함. 규격 참고도는 도면으로 따로 있음. + · ⚠ **법정 500m 와 안 맞음** — 종합비교는 「**1km 간격**」으로 적고, 1공구는 연장 자체가 + **380m(토적집계) vs 1.20km(내역서)** 로 갈려 있어(판정 보류) **개소를 연장으로 역산 불가.** + ⇒ **지식DB 가 「연장÷500 을 확정 산식으로 쓰지 말라」 한 까닭이 실물로 확인됨.** + 실무는 **개소를 직접 세어 적었음.** + ⇒ **만들 모양 = 「개소 수를 넣는 칸」 + 참고로 연장÷500 을 제안값으로 보이기.** + · **안내판·차단기·가설창고·수방자재 — 실무문서 전수 무출현.** 넣는다면 **본이 될 실물이 + 없어** 사용자 협의로 새로 만드는 것임. + ✅ **편책 ≠ 목책 확정**(2026-09-08) — 품셈 **13-15-2 목책 설치**는 작업조건이 + **「벌도목 직경 26~30㎝」**이고 **벌목부**가 들어가는 **베어 낸 나무를 쓰는 공종**임 + (앞 절이 13-15-1 「목재 껍질벗기기」). 편책(「말뚝 9할박기, **가로목** 비탈면 밀착」)과 + **재료도 작업도 다름.** + ⭐ **다만 편책이 산림 품셈에 아예 없지는 않음** — **10-6-3 기타 임업자재**의 운반 자재 열에 + **「편책용 말뚝(목재, 파이프)」**이 그대로 있음(품셈이 편책을 아는 시설로 다룸). + **공종으로는 `5-15. 바자얽기` 가 가장 가까움**(말뚝 직경4~6㎝ 길이120㎝ 20개 · + 보통인부 3.26 · 특별인부 0.22 · 말뚝 1m당 2개). ⚠ **엮는 재료가 다름** — 편책은 「가로목」, + 바자는 「나뭇가지」. + ⇒ **「근거 없음」에서 「바자얽기(5-15)를 빌려 쓸지」로 좁혀짐** — 「어느 품을 쓸까」가 아니라 + **「빌려 쓸까 말까」**가 됨. +``` + +- [ ] **층따기 높이·폭 — 치수표를 찾았음(관행값 후보)** `[사용자 답 대기 — 원본 그림 확인]` (2026-09-08) — + + ⚠ 2026-09-09 — **깊이는 화면 칸으로 받게 됐음**(확정 ① · `ab51fa38`). 이 줄은 **관행값을 + 제안값으로 보일지**만 남음. + `original/산림과임업기술(임도)/2. 임도/6. 시공.md:93~95` + 「층따기 치수(cm) — **토사 깊이 50 이상 · 암 깊이 40 이상 · 폭 100 이상**」 + (그림 5-2-81 편절토·편성토 접속부 횡단면에 딸린 표). + 조건도 일치 — 「지표횡단물매가 **1:4 이상**으로 급하면 표토 제거 후 계단식 층따기」. + ⚠ **교본·법정이 아니라 기술서적**임(교본 세 곳은 여전히 「설계도서에 명시된 높이와 폭으로」). + ⇒ **관행값 후보로만.** ⚠ **판독 주의** — 원문 표가 마크다운 변환에서 한 줄로 뭉개져 있어 + **원본 그림 확인 전에는 확정하지 말 것.** +- [x] **층따기 사전 문구** — 고쳤음. + + ⚠ **남은 것 하나** — `원가_출력변수_사전 B2-9` 가 아직 「㎡·m」로 적혀 품셈 9-18(㎥)과 어긋남. 다음 사람이 또 ㎡ 로 낼 자리. +- [x] **표준도 원단위 보류 사유 문구** — 우리 말로 고치고 받아야 할 자료까지 적었음. + + ⚠ 같은 목록의 나머지 셋(철근·레미콘·아스콘)은 **영어 그대로 둠** — 한 번에 맞출 때 함께 할 것. + +### 8-34. ⭐ 2026-09-09 밤 감사에서 새로 나온 것 (데스크탑 메인) + +준비공·부대시설 축과 구조물 묶음 축을 「자국 목록」으로 훑어 나온 것들. **값을 임의로 +고치지 않고 사유로 드러내 둔 상태**이며, 아래 둘은 **사용자 확정이 있어야 값이 움직임.** + +- [ ] **⚠⚠ 표토제거 축 셋 — 실무·원문이 우리와 다름** `[사용자 답 대기 — 시트 9번]` (2026-09-09) + + 실무 내역서(영월 2024)와 품셈 원문을 떠 보고 나온 것. **값은 그대로 두고 사유만 실어 둠.** + 1. **밑수가 다름** — 실무는 「표토제거 답외구간 **8,962 ㎡**」이고 우리는 ㎥(면적 × 두께). + 셈 9-15-2 도 **T(표토두께) 0.2m 를 품의 조건**으로 두는 면적 축임. + 2. **운반 줄이 겹침** — 9-15-2 원문에 **L(운반거리) 20m** 가 들어 있어 **20m 압토가 품에 + 함**임. 실무 내역서에 운반 줄이 따로 없는 까닭이 그것. 우리는 제거 물량 **전량**을 + 표토 운반·적치」로 다시 실어 보냄 ⇒ **20m 초과분만** 세야 맞음. + 3. **대상이 법 문언과 어긋남** — 별표2 는 「**노면·절토대상지**」인데 우리는 절토·성토 + *사면적을 다 더하고 노면은 안 셈. 성토대상지는 별표2 (7) 이 「제거·정리」로만 두어 + 반·적치 의무를 안 검. **넘치는 쪽과 빠지는 쪽이 동시에 있어** 합계가 그럴듯해 보였음. + **「실무대로」 한 마디면 셋이 함께 닫힘.** + 그리고 `**FP-09-15` 는 부모 코드**임(잎이 답구간·답외구간). 실무가 「답외구간」을 쓰나 + 임의로 안 골랐음* — 3번 물음과 한 묶음. +- [ ] **⚠ 옹벽 터파기가 안 섬 — 실무 안에서도 갈림** `[사용자 답 대기]` (2026-09-09) + + 관측 원단위(울진 §7 반중력식 H=2.0)에 터파기 줄이 없어 **옹벽만 구조물터파기·되메우기· + 잔토가 0 줄**이었음(돌쌓기는 세 줄이 섬). **지금은 「터파기가 안 선 구조물: 옹벽」 줄을 + `in_bill: False` · `unit_data_missing` 로 세워 빠진 것이 보이게 해 둠.** + ⚠ 랩탑 보조 대조 — 소광리 「옹벽2.0」 여덟 줄에도 **터파기 없음**인데, 같은 시트 + 「식생옹벽블럭(H=2.0)」에는 **터파기 기초 0.82 + 비탈 1.77 · 되메우기 0.37 · 잔토 1.4** 가 있음. + ⇒ 여쭐 것은 「옹벽 터파기를 세나」가 아니라 **「반중력식만 왜 없나」**임 + (일위대가에 포함일 가능성 — 기초 콘크리트 밑수에 숨어 있는지 확인이 남음). + +**닫은 것 (2026-09-09 밤, 값이 움직였음)** + +### 8-7. ⚠ 이중계상 금지 규칙 — 원문을 남기는 자리 + +**담당 경계표는 두 페이지가 다 서면서 역할을 다해 이관했으나, 이 규칙 원문은 남긴다.** +오늘도 세 번 걸렸고 **B09 가드가 이 문장을 주석으로 인용**하고 있어 지우면 근거가 끊긴다. + +- **㉠ 할증은 `자재 총괄` 에서 딱 한 번.** 품셈 1-3-1 「품셈 항목에 할증 포함ㆍ표시된 경우 +**중복 적용 금지**」. `원단위표`·일위대가 재료비는 **할증 전 값**을 쓰고, 인계에는 +**할증 전/후 둘 다** 실어 역산 사고를 막는다. +- **㉡ `free_haul`(소운반 20m) 은 내역 줄을 만들지 않는다.** 품셈 1-2-7 「소운반 20m 이내는 +품에 포함」. **스위치 없이 무조건 제외** — 켜도 붙일 단가가 없다(인력운반 10-6 도 +「20m **초과분**」). 값은 내되 「내역 제외」로 표시하고 `무대+도자+덤프 = 총 운반토량` +검산에만 쓴다. +- ⚠⚠ **㉡ 정정 (2026-09-08 원문 판정) — 「20m 무조건 공짜」가 아님.** +품셈 **1-2-7의 1 가** 원문: 「품에서 **자재의 소운반은 포함**하며, 품에서 **포함된 것으로 +규정된** 소운반 거리는 20m 이내의 거리를 의미한다」 +⇒ **「그 품 표가 포함한다고 규정했을 때만」 0 임.** +⚠ **산림품셈 13-2-4 야면석채집 [주]에는 운반 얘기가 없음** — **「포함」이 규정되지 않았음.** +⇒ **별도 계상이 원문상 맞고, 20m 를 무조건 금액 0 으로 막는 우리 가드는 과함.** +실무도 두 사무소가 다르게 함 — **울진은 채집 단가에 운반을 넣었고**(채집 + 상차 + 덤프 L=0.1km +를 한 단가에), **영월은 갈랐음**(채집 8,999 / 소운반 27,094원, 인력운반 기본공식 그대로). +**어느 쪽도 이중계상이 아님 — 한 번만 세면 됨.** +⚠⚠ **운반이 두 다리로 갈림**(2026-09-08 실측): + +``` +㉮ 채취지 → 집적지 덤프 100m ← **별표2 「운반거리를 조사한다」가 요구하는 그 운반** +㉯ 집적지 → 시공지 인력 20m ← 품셈 1-2-7 소운반 +울진은 ㉮ 를 채집 단가에 **포함**, 영월은 ㉯ 를 **별도 줄**(27,094원/㎡)로 세움 +``` + + ⇒ **우리 무대 가드는 ㉯ 에만 걸어야 하고 ㉮ 는 새 줄임.** + ⚠ **둘을 다 세우면 이중계상** — 확정 문구에 **「어느 쪽이든 한 번만」**을 넣을 것. + **⇒ 고칠 문구** — 「**무대(free_haul) 20m 규칙을 토공과 ㉯(집적지→시공지)에만 적용**하고, + **자재 소운반은 품 표가 포함을 규정한 경우에만** 0 으로 볼 것. 규정이 없으면 **인력운반 + 기본공식**(1-2-7의 2)으로 별도 계상. **㉮ 채취지→집적지는 별도 줄이되 채집 단가에 이미 + 포함됐으면 또 세지 말 것.**」 **세 창 일치.** + +- **㉢ 배합(모르터·콘크리트) 분해는 B09 에서 한 번.** 원단위표는 「모르터 ㎥」까지만 낸다. +- **㉣ 작업효율 `E` 는 작업량 산정에만.** 시간당 사용료는 1일 8시간으로 나눈다(품셈 8-1-6). +양쪽에 넣으면 같은 효율이 두 번 곱해진다. +- **㉤ 열 방향 정합 검사** — `TC = NC + GC + JC` 는 행 방향이라 「같은 성분을 두 층에서 +세는」 어긋남을 못 잡는다. 열 합을 따로 본다. +- **㉥ 물빼기 파이프 ↔ 제잡비 윗단** — 물구멍을 자재로 세우고 제잡비는 아랫단으로 간다. +- **㉦ 큰돌쌓기 포함자재** — 품셈이 이미 품에 넣은 것을 자재로 또 세지 않는다. +- **㉧ 상태 환산은 내보내는 자리에서 한 번만** (2026-09-09 신설, 금액 직결). +「운반거리의 산정 시에 모든 수량은 **다짐상태**로 환산하여 계산하고, **내역서에 적용하는 +수량은 자연상태**로 한다」(설계실무 요령 — `config_system_design` 5-4-3 인용문). +⇒ 유토곡선 안쪽(띠·이동·잔량)은 **다짐 그대로**, 내역으로 나갈 때만 **÷C**. +⚠ `**L`(1.3·1.35·1.625)을 쓰지 않는다** — 품셈 10-11·10-12 가 `f = 1/L` 을 식 안에서 +**스스로** 곱하므로 우리가 또 들면 두 번 환산이다. 우리가 할 일은 **자연상태 물량을 +정확히 넘기는 것**뿐이다. +⚠ **방향은 나누기** — `C = 다짐 ÷ 자연` 이라 곱하면 뒤집힌다(거울 시험이 잠금). +⚠ 들어올 때도 같다 — 구조물 잔토는 **자연상태**로 오므로 곡선에 담기 전 **×C**(왕복 한 번씩). +⚠ **갈래를 모르는 몫은 환산하지 않는다** — 계수가 없다. 토사 계수로 눅이면 근거 없이 +금액이 움직인다(`ground_unknown_m3` 로 드러냄). +**실측 변화(내역 4줄)** — 도자 토사 15.65→17.39 · 리핑암 70.30→61.13 · +덤프 토사 33.76→37.51 · 리핑암 140.78→122.42 ㎥ (합 260.49→238.45, **−8.5 %**). +자체검증 — 새 시험 6 + TS 실행 시험 3 추가, 전체 **576 통과 / 22 건너뜀**. +공용 브라우저 실사용 경로로 API 재확인(`/quantity/earthwork-table`): 줄마다 +`volume_basis: compacted` + `natural_m3` + `conversion_c` 가 서고, 집계표 비고에 +「자연상태 환산(다짐 …㎥ ÷ C)」이 붙으며, 검산 차이는 **0** 유지(다짐끼리 비교). +사토 줄도 `natural_m3_by_ground` 를 냄(실측 rr 61.88 다짐 → 53.809 자연). + +### 8-31. 개발용 「확정 없이 다음으로」 단추 — 오해하지 말 것 + +**단계 확정 없이 다음 페이지로 넘어가는 개발 전용 우회로.** 서버가 정본이고 +(`ENVIRONMENT` 검사, 운영에서는 403) 화면은 보조(`import.meta.env.DEV`). +`project_workflow_stages.state` 한 칸만 바꾸며 **계산은 돌지 않는다.** +`DEV_UNLOCK:<옛상태>` 로 되돌리고, **이미 `COMPLETE` 인 단계는 건드리지 않는다.** + +## 9. B09 원가계산 + +> **표 다섯이 화면으로 섰고 코드 쪽에 남은 일은 없다** — 아래는 자료·결정이 채워져야 풀리는 것뿐이다. + +### 9-9. ⚠ 카탈로그가 서는 날 **한꺼번에 붙을 열한 줄** (2026-09-09 실측) + +품셈 표에 **「필요시 적용」·「별도 계상」·「별산」**이 적힌 줄들이다. **지금은 하나도 안 붙어 있다** — +다만 **안 붙는 까닭이 「조건부라서」가 아니라 「이름을 카탈로그에서 못 찾아서」**다. +⇒ **자재·기계 카탈로그를 세우는 날 조건 없이 다 붙는다.** 그날 「왜 금액이 늘었지」로 헤매지 +않도록 목록을 남긴다. **카탈로그 작업을 시작하는 사람이 이 목록을 손에 들고 시작할 것.** + + +| 공종 | 줄 | 조건 문구 | 내용 | +| ---------------------- | --- | ----------------- | ---------------------------- | +| FP-05-10 사방조림 | 3 | 별도 계상, 운반조견표 참조 | 운반비 72.4 kg | +| FP-10-08-03 케이블 크레인 운전 | 3 | 별도 계상 | 운반기구 손료 1식 | +| FP-12-10 맹암거 | 3 | 자재비 별산 | 부직포 ㎡ | +| FP-12-10 맹암거 | 5 | 별산(깬잡석 유용가능) | 잡석 구입 및 운반 ㎥ | +| FP-12-10 맹암거 | 6 | 필요시 적용 | 소운반 인부 리어카(L=50m)**2.0인** | +| FP-12-11-02 흄관 | 1 | 별산 | 흄관 1.0m | +| FP-12-11-02 흄관 | 3 | 별도 계상 | 잡재료비 | +| FP-12-11-03 파형강관 | 1 | 별산 | 파형강관 1.0m | +| FP-12-11-03 파형강관 | 2 | 필요시적용 | 커플링밴드 EA | +| FP-12-24-01 지수판 설치 | 0 | 뒷채움 자재비 및 운반비 별산 | — | +| FP-12-24-02 되메우기(노상재) | 0 | 뒷채움 자재비 및 운반비 별산 | — | +| FP-12-25 기초잡석 | 0 | **브레이커 사용할 때 제외** | 소할 할석공 0.06인 ⚠**금액이 서 있는 줄** | + + +**⇒ 그리고 「이름을 카탈로그에서 못 찾아」 안 붙는 기계** (2026-09-09 관부설에서 나옴) + + +| 기종 | 어디에 쓰이나 | 지금 | +| ------------- | ------------------------------ | ---------------- | +| **크레인 5ton** | 파형강관 관부설(12-11-3) | 카탈로그에 없어**안 붙음** | +| **크레인 10ton** | VR관(12-11-1) · 흄관(12-11-2) 관부설 | 〃 | + + +> ⓘ **원문 특이점 하나 — 손대지 않았음** (2026-09-09 대조) +> 파형강관 12-11-3 **배관공**이 ∅800 **0.25** · ∅1000 **0.22** · ∅1200 **0.41** 임 — +> 관경이 커지는데 **가운데만 작음**. 크레인·보통인부는 커질수록 늘어남. +> **원문 그대로**라 고치지 않았고, 나중에 「값이 이상하다」가 나오면 이 줄을 볼 것. +> ⚠ **지금 금액에 이미 반영돼 있음** — 내역서에 ∅800·∅1000 이 둘 다 서 있음 +> (2026-09-09 기준 79da822d 네 줄 427,254원 · 26275834 일곱 줄 734,498원). +> ⓘ **원문 오탈자일 수 있음** — 0.22 가 0.32 의 오식이면 그 자리에서만 값이 낮아짐. +> **우리가 판단할 것은 아니고** 실무자 확인·고시 정정 대상임. +> ⓘ **숨은 값 하나** — 커플링밴드는 표가 비었으나 [주]① 이 「**1EA/6m**」를 줌. +> 자재가 서면 m 당 1/6 EA 로 셀 수 있음(「필요시 별도 산정」 조건이 하나 더 붙음). + +⇒ 그래서 **관부설 세 공종이 인력 몫만**임(배수관 네 줄이 지금 그 값으로 서 있음). +카탈로그가 서는 날 **세 공종이 한꺼번에 굵어짐**. +⚠ 같은 표의 **기초콘크리트·거푸집·모래부설**은 값이 빈 칸이라 안 붙였음 — 위 「별산」 줄들과 같은 자리. + +> ⓘ **이 절이 「카탈로그가 서는 날 무엇이 붙나」의 지도임** — 조건부 열두 줄 + 크레인 둘 + +> 자재 여덟 줄. 그날 금액이 뛸 텐데 **왜 뛰는지를 이 목록이 미리 설명함.** + +⚠ **기본은 「안 붙임」으로 둘 것.** 붙여 놓고 빼는 것보다 **없다가 켜는 것**이 안전하다 +(2026-09-09 하루 내내 그 결이었다 — 지어낸 값이 나중에 확인된 값으로 읽힌다). +⚠ **맹암거 소운반 인부 2.0인이 제일 큼** — 붙으면 그 단가가 통째로 뒤집힌다. +ⓘ 곁들여: 맹암거 25,492원/m 안의 **보통인부 0.13인(22,369원)은 「부설인부」라는 정상 줄**이다. +2026-09-09 한때 이것을 조건부 줄로 잘못 짚었다가 줄 번호로 되짚어 걷어 냈다. + +### 9-10. 「막힌 줄일수록 이중계상이 숨는다」 — 확인된 셋 (2026-09-09) + +값이 0 이라 **어떤 검사에도 안 걸리던** 자리들이다. **막힌 줄을 풀 때는 그 줄의 성분부터 셀 것.** + +- [ ] `[대기: 카탈로그]` **운반** — 두 축에 두 줄 · 코드가 붙는 날 드러남 + + ⚠ **오늘 선 「기계 수송비」와 다른 축임**(2026-09-09 밤) — 수송비는 **기계를 현장까지** 나르는 것이고, + 여기 것은 **자재 운반**(맹암거 잡석 구입·운반 · 지수판 뒷채움 운반비 별산 등)임. 헷갈리면 + 같은 운반을 두 번 셈. 지금은 그 줄들이 **별산·조건부라 값이 0** 이라 안 걸림. +- [ ] `[대기: 카탈로그]` **조건부 열두 줄** — 위 9-9 · 카탈로그가 서는 날 드러남 + + ⚠ 그중 **기초잡석 소할**만은 **이미 금액이 서 있음** — 브레이커 갈래가 서는 날 **빠져야** 함 + (다른 열한 줄은 붙는 쪽, 이것만 빠지는 쪽) +- [ ] `[대기: 거리·설계수량]` **원문에는 있는데 못 실린 몫** — `B09_Estimation_KnownGaps` 에 세 자리를 적어 두었음 + + · 기초잡석 **운반(덤프트럭 15ton)** — 품셈 10-12 가 거리로 냄 ⇒ **사토장이 서면 함께 풀림** + · 규준틀 둘 — 지금 값은 **인력 품만**(손율은 원문에 있음: 비탈 50% · 수평 80%) + ⇒ 화면 칸으로 받을 것은 **개소당 목재 규격·수량** (층따기 깊이·표토 두께와 같은 집안) + +### 9-6. B09 미결 — 살아있는 것 + +2026-09-08 전수 재판정. **해소 2 · 성격바뀜 3 · 남의것 2 · 입력 문제 1** 은 지웠고 아래만 남았다. + +⚠ **미결이 아닌 것 하나를 여기 적어 둔다** — 「암 갈래별 시공법이 안 실려 온다」는 **입력 문제**임. +칸도 있고 저장도 되고 공종도 갈린다(`b269ea34` 에서 `FP-09-04`/`FP-09-05` 로 정확히 갈림). +값이 `None` 인 표본은 **시공법을 안 넣은 프로젝트**였다. 같은 오해가 또 나지 않게 남긴다. + +- [x] `[반나절]` **유가 지역 단가** — 시도별 자료를 받아 물렸음(`f39c195b`). 안 고르면 전국평균. + + ⚠ **현장 소재지 자동 연동은 안 함** — 「사업 지역」이 자유 글이라 시도 코드로 옮기려면 규칙을 지어내야 함. 자동으로 이으려면 **등록에 시도 칸**이 필요함. + ⚠ 원천의 시도 가름이 행정구역과 다름(`20`이 「전남광주」 한 줄 · `07`·`16` 없음) — 원문 그대로 둠. +- [ ] `[답 대기]` **물구멍 관 규격·간격** — 자재로는 오는데(단위 m) 규격·간격이 빈칸이라 단가를 못 고름. + + · **설계 기준이 정해지면** 풀림. (8-29 ⭘ 의 잠정 Ø50·2.0㎡ 와 짝) +- [ ] `[자료 대기 · 이것이 제일 큼]` **⚠ 사급 자재 단가 — 「못 구함」이 아니라 「누가 견적을 넣느냐」** (2026-09-08 성격 바뀜) — + + 나라장터 스냅숏 **27,485건 실물 검색에서 야면석·막자갈·고임돌·잡석·유공관·물구멍 전부 0건**. + 문서가 그 자재군을 **「지역골재 = 물가지·견적 경로」**로 이미 분류해 둠 — **API 로 못 채우는 + 것이 맞음.** ⚠ **그러나 국가계약법 시행규칙 §7(품셈 1-2-4)이 「견적가격」을 인정**하므로 + **구독 없이도 합법**이고 그 통로가 **6번 슬롯(적용 단가)** 임. + **대안 셋이 문서에 명시돼 있음** — ① 유료지 **1종만** 구독 ② 실무 관측값 라이브러리 + + **업체 견적 입력 UI** ③ 관급 전환. **「선택은 사업 판단(사용자)」**로 적혀 있음. +- [x] `[하루+]` **기계 수송비** — 세웠음(`fdc30ecf`). 거리·도로 구분을 넣으면 회당 단가가 섬. + + ⚠ **우리가 정한 둘**(원문이 안 정함) — 속도를 자주식 이동속도표에서 가져온 것 · 운반시간을 왕복으로 본 것. **실무자 확인이 붙으면 좋은 자리.** + ⚠ **아직 버려지는 표 하나** — 8-4-5 콘크리트기계 운전경비는 규격 칸이 22, 나머지 21 로 어긋나 그대로 둠. +- [ ] `[사용자 답 대기]` **수송비 회수(대수·왕복 횟수)** (2026-09-09 밤) — 단가는 「회당」으로 섰고 + + **몇 대를 몇 번 나르는지는 품셈이 안 정함.** 실무는 대개 기종당 1 왕복으로 잡는 것으로 보이나 + **원문 근거가 없어 임의로 정하지 않음.** ⇒ 수량 칸(설계 입력)으로 받을 것인지 여쭐 것. + ⚠ 곁들여 **트레일러(20t)와 트럭(10.5t) 가름**도 원문이 기계별로 안 정함 — 지금은 **두 갈래를 + 다 세워 두고 고르게** 했음. +- [x] `[잔손질]` **노임 신뢰도 표시** — 내역에 실린 직종만 화면에 알림. 금액은 안 막음. +- [ ] `[답 대기]` **지장목제거 품셈 항목** — 품셈이 벌목을 목적별로만 갈라 맞는 공종이 없음. + + · **어느 벌목 공종으로 볼지 사용자가 정하면** 풀림. (8-29 9-㉗ 과 한 벌) +- [x] `[다시 셈 끝]` **표를 못 읽어 값이 안 서는 자리** — 표 456 붙음·19 안 붙음 · 일위대가 289 전부 0 초과. + + ⓘ **세는 자리를 바꿨음** — 「표 몇 장이 안 읽히나」가 아니라 **「내역에 실릴 줄인데 금액이 안 서나」**로 셈. 그때 나온 구멍 셋 중 둘(성토·성토면다짐)은 아래에서 닫혔고 덤프 운반만 남음. +- [x] `[반나절]` **성토·성토면다짐** — 단가가 서게 했음(`4a6254ba`). **성토 59,477,858원 · 성토면다짐 17,827,251원**이 새로 섬. + + ⓘ **노체다짐(9-16-2)은 아래 답 대기 줄로 옮겼음** — 단가는 세웠고 남은 것은 「셀 것인가」임. +- [ ] `[대기: 사토장]` **⚠ 덤프 운반(8-2-8)은 「운반거리」가 있어야 섬 — 사용자·설계 입력 대기** (2026-09-08 조사) — + + 원문·표는 다 찾았음(`FP-10-12-01` 두 표: 적재기계 굴착기 K 0.9·E0 0.60(토사)/0.35(파쇄암)· + ㎝ 22초 + 덤프 t1~t5, V1 5㎞/hr(적재)·V2 6㎞/hr(공차)). + **모자란 것은 품셈이 아니라 현장값 셋** — ① **운반거리 L**(노선·사토장에서 옴) ② + **덤프 적재용량 T**(몇 톤 차를 쓸지) ③ **자연상태 단위중량 γt**. + ⇒ q = T·L/γt 라 셋 중 하나만 없어도 적재량이 안 나옴. **8-29 ㉯ 13번으로 올렸음**(2026-09-08). +- [x] `[하루+]` **중기운반 · 플레이트 콤펙터** — 둘 다 섰음(`fdc30ecf`·`6cf7de9e`). + + ⓘ 이제 아는 식은 넷 — 굴착기 사이클 · 불도저 · 다짐 둘(롤러·콤펙터) + 수송 사이클. +- [x] `[다시 셈 끝]` **어느 공종에도 안 붙은 표 19** — 그중 15 는 조림 사례표, 3 은 표가 아닌 조각. + + ⚠ **임도에 쓰일 것은 `F0375` 지수판 하나** — 구조물에 지수판이 서는 날 함께 볼 것. +- [ ] `[대상 없음 — 2026-09-09 밤 재확인]` **모르터·콘크리트 배합 분해** + + 콘크리트 계열 일위대가는 **이제 여덟이 서 있음**(레디믹스트 타설 셋·펌프카 타설 둘 등). + ⚠ **그래도 분해할 대상은 아직 없음** — 그 여덟은 전부 **레미콘을 사서 치는** 공종이라 품(노무)만 + 들어 있고 **현장 배합이 아님**. 마스터에 「모르터」가 든 공종도 여전히 0건. + · **현장 배합 줄(시멘트·모래·자갈)이 서기 시작하면** 그때 ㉢ 가드와 함께 살아남. +- [ ] `[대기: 치수]` **⚠ 「다른 표를 가리키는 참조」를 이을 것 — 산마루측구·소단측구** (2026-09-08) — + + 품셈이 그 두 표에 **수량을 안 적고 참조만** 둠(「철근가공조립(간단)의 **30 %**」· + 「거푸집 합판4회」·「수축줄눈」). 그래서 연장은 오고 공종코드도 붙는데 **금액이 안 섬.** + ⇒ **이을 길은 보임** — `B-FP-12-03#간단` 919,146.7원/ton 에 × 0.30 · 거푸집은 + `B-FP-12-04` 81,321.9원/㎡ 에 사용횟수 비율(1-7-1). + ⚠ **막힌 것은 밑수 하나이고 그것은 사용자 확정 대기임**(2026-09-08 B08 전수 확인) — + 「1m당 콘크리트 몇 ㎥ · 거푸집 몇 ㎡ · 철근 몇 ton」이 **품셈·지식DB·구조물 옵션 어디에도 + 없음.** 8-29 ㉯ 12번 참조. **치수가 정해지면 B08 이 그날 전개함.** + (맹암거 `FP-12-10` 은 표에 수량이 있어 25,492.1원/m × 40m = 1,019,685원으로 이미 섬.) +- [x] `[하루+]` **품의 할인·할증 26계열** — 칸을 세웠음(`f6f51f33`). 기본은 안 고름 = 한 원도 안 움직임. + + ⚠⚠ **「임도는 산지경사 할증이 늘 걸릴 자리」는 추정이었고 원문을 다시 읽어 뒤집었음** — 26계열의 [주]가 거의 다 **조림·숲가꾸기·방제 전용**을 지목함. **임도 토공에 붙이라는 지시가 원문에 없음.** 다음 창이 또 붙이려 들지 않게 여기 남김. + ⚠ 붙는 자리는 **일위대가의 품(인력) 줄** — B08 물량에 곱하면 자재·기계까지 부풀어 이중계상임. + ⚠ **율 표는 24개** — 1-4-24(장비품의 -20%)·1-4-26(적용시공량 규칙)은 성격이 달라 안 담음. +- [ ] `[사용자 답 대기 · B08 이 줄을 내야 함]` **⚠ 노체다짐(9-16-2)을 셀 것인가** (2026-09-09 밤) + + **단가는 세웠음**(커밋 `87c710a2`) — `Q = 1000×V×W×E×D×f/N` 로 서는 **첫 다짐 공식** 공종. + `1000×4×1.9×0.6×0.3×1.0÷6 = 228 ㎥/시간` ⇒ **527.40원/㎥**. + ⇒ 넣으면 **13,150.2㎥ × 527.40 = 6,935,414원**. + + **왜 아직 안 서나 — B08 이 그 줄을 안 냄. 그것은 의도된 결정이었음**(2026-09-08 매핑 기록). + 실무 내역 셋에 「노체포설·노체다짐」으로 가른 줄이 **없어서**, 「성토 본체 한 줄 + 성토면다짐(㎡) + 따로」로 맞춰 두고 **다짐은 그 단가 안 단계**로 뒀음. + ⚠⚠ **그런데 우리 성토 단가는 포설(굴착기)뿐임** — 실무 영월의 그 한 줄은 단가 안에 + **적사→성토→다짐 3단계**를 품고 있음. **즉 지금은 다짐 몫이 빠져 있음.** + + **⇒ 여쭐 것 하나** — 층다짐을 **줄로 세울지**(B08 이 성토와 같은 물량으로 다짐 줄을 냄), + 아니면 **성토 단가 안에 넣을지**. 품셈 [주]⑤ 는 「**대규모 성토지로서 층다짐이 필요한 경우** + 적용」이라 **늘 서는 줄은 아님** — 현장 조건 판단임. + ⚠ **두 곳에 다 넣으면 이중계상**임. + ⓘ [주]③ 「굴착기와 진동롤러 **조합**」은 **포설과 다짐을 함께 쓰라는 뜻**으로 읽었음 — + 다짐 줄에 굴착기를 또 넣으면 포설에서 센 굴착기가 두 번 섬(시험으로 못 박아 뒀음). + +- [ ] `[사용자 답 대기]` **품 할증을 여럿 고를 때 합산인가 곱인가** (2026-09-09 밤) — + + **원문에 없음.** 지금은 **합산**(10%+5% = 15%)이고 `LaborSurcharge.COMBINE_RULE` **한 곳**만 + 갈아 끼우면 곱(1.10×1.05−1 = 15.5%)으로 바뀜. 화면 근거에 「우리가 정함·원문에 없음」을 적어 둠. +- [x] `[하루+]` **설계서 구성표** — 세웠음(`e38b8323`). 그 뒤 중기경비계산서·산출기초를 세워 **법이 정한 13 중 9 가 섬**. + + ⚠ **「못 내는 다섯」이 아니었음** — 셋(일반·특별시방서·예정공정표)은 **설계자·발주청이 쓰는 문서**임. 우리가 더 낼 것은 **공사설명서 하나**(서식·설계하중 표기를 받아야 함). +- [ ] `[자료 대기]` **종자·비료도 사급 미결에 듦** — `출력변수사전 C2` 가 물가지·견적 품목에 **종자·비료**를 + + 더 적음. ⇒ 씨앗뿜어붙이기(5-24) 종자 0.025kg/㎡ · 비료 0.1kg/㎡ 도 **같은 미결**임. +- [x] `[반나절]` **제비율 데이터에 밑수·처리 규칙** — 실었음. 거울 시험이 코드와 맞대 봄. 금액 변화 없음. +- [ ] `[위키 AI 몫]` 지식DB 정정 요청 (**위키 AI 몫**) — `현행_20260413.md` §3·§4 병합셀 복원. + +## 7. 검증 리스트 — 페이지별 (다 만들었고 **확인만** 남은 것) + +> 여기는 **무엇을 · 어떻게 · 안 하면**만 한 줄씩 둔다(원문을 되풀이하지 않음). +> **끝난 줄은 지우고** 검증 폴더에 날짜별 기록을 남긴다. 번호는 한 줄기 — 닫힌 번호는 다시 안 쓴다. +> ⚠ **[확정]·[저장]은 전 측점을 다시 계산해 정본에 씀** — 누르기 전에 다른 창에 알릴 것 +> (`OWNERS.md` 규칙 6). + +**⚠ 이 목록을 쓸 때 지킬 것 (2026-09-09 밤 재정비에서 얻은 것)** + +- **화면 확인은 DOM 이 아니라 도면 알맹이·갈무리로.** CAD 표는 캔버스에 그려져 DOM 에 안 남아 +V-9 를 한 번 「안 뜬다」로 잘못 봤음. +- **프로젝트마다 달라지는 수를 기준으로 쓰지 말 것.** 「도면 36장」이 실제로는 34장이었는데 +틀린 것이 아니라 **횡단 장수가 프로젝트마다 다른 것**이었음. +- **줄 수·항목 수는 늘어남.** 「찰 11줄 · 메 8줄」이 지금은 15·13 임 — 숫자를 박지 말고 +**무엇이 들어야 하는지**로 적을 것. +- **「있다」와 「돈다」는 다름** — 가드를 만들어 두고 아무 데서도 안 부르던 것이 둘 있었음. +- **부분 성공이 완전 실패보다 위험함** — 값이 그럴듯해 어떤 검사에도 안 걸림. +- **보내는 쪽과 받는 쪽을 마주 걸 것** — 한쪽만 보면 양쪽 다 조용히 틀림. + +### 지금 사람이 볼 수 있는 것 — 4건 + + +| # | 확인할 것 | 어떻게 | 안 하면 | +| -------------- | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------- | +| ~~**V-11**~~ ⭕ | 반대 방향 검사가 **새 칸에도** 걸리나 | ✅ **시험으로 옮김**(2026-09-09 밤 · `test_b09_verify_guards`) — 칸을 늘려도·빠뜨려도 걸리는 것을 못 박음 | — | +| **V-12** | 준비공 **여섯 줄이 B09 에 다 가나** | 값을 채운 인계 한 벌로 `in_bill`·`blocked_kind` 확인(**V-5 와 한 벌로**) | 표토제거 2,359.03㎥ 가 다시 통째로 사라짐 | +| ~~**V-16**~~ ⭕ | 불도저 운반 **네 줄이 금액으로** 서나 | ✅ **화면 실측**(2026-09-09 밤) — 「네 줄」은 실은 **불도저 둘 + 덤프 둘**이었고 **불도저 둘은 금액으로 섬**: `3-1 dozer 운반 토사 17.39㎥ × 1,712.0 = 29,770원` · `3-2 리핑암 61.13㎥ × 3,911.3 = 239,105원`. **덤프 둘은 「일위대가가 아직 없습니다」** 로 뜸(운반거리 대기 — 아래 사토장 줄과 같은 것). 갈래마다 단가가 서는지 시험으로도 못 박음 | — | +| ~~**V-17**~~ ⭕ | 공구손료가 **이중으로 안 붙나** | ✅ **밑수가 겹치지 않음**(2026-09-09 밤) — 공구손료는 **주재료비 → 재료비**, 제잡비는 **노무비 → 경비**. 한 공종에 둘 다 있어도 이중계상이 아님(시험으로 못 박음). 지금은 **주재료비가 0** 이라 3% 를 넣어도 한 원도 안 움직임. ⚠ **석공사·철골공사는 특수공구라 건설품셈 1-2-6 이 「별도 계상」**으로 둠 — 일반 비율을 그대로 붙이면 안 되는 자리라 **칸 사유에 적어 둠** | — | + + +### ⚠ [저장]·[확정] 잠금이 풀려야 보는 것 — 3건 + +> 표토 축 확정 전까지 사용자가 저장을 멈춰 둠. **잠금이 풀리면 한 번에 몰아서 볼 것.** + + +| # | 확인할 것 | 어떻게 | +| -------- | ------------------------------------ | ------------------------------------------------------------------ | +| **V-19** | 표준단면을 고치고 [저장] 하면 **전 측점 면적이 따라오나** | 2026-09-09 에 이은 자리(`2eb2c972`) — 측구 상폭을 고쳐 저장한 뒤 안 만진 측점 면적이 새 값인지 | +| **V-20** | 표준도 제원(두께·날개벽)을 고르고 저장하면 **수량에 실리나** | 상부 두께·`wing_wall_type` 을 넣고 저장 → 입적·날개벽 줄 대조 | +| **V-21** | 실제 업로드 중에 **잠금 띠가 뜨나** | 자료를 올리는 동안 B03 에서 「○○○ 님이 올린 자료를 분석하는 중입니다」 확인(`018ebe7f`) | + + +### ⚠ 실무자 눈이 있어야 닫히는 것 — 4건 (사용자 답 대기와 한 성격) + + +| # | 물어야 할 것 | 왜 우리가 못 정하나 | +| -------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **V-1** | B08·B09 화면 **13항목 수치가 실무에 맞나** | 규칙대로는 도는데 실무 값과 어긋나면 정본이 통째로 다시 나감 — 점검표 아티팩트 [https://claude.ai/code/artifact/64675be3-6e7d-40bb-8cda-68bc229bd394](https://claude.ai/code/artifact/64675be3-6e7d-40bb-8cda-68bc229bd394) | +| **V-13** | 녹화 반영률 **100 %** 가 실무에 맞나 | **법은 100 %**(별표2 타.(1)), 실무 사례는 80 — 설계자 판단 자리 | +| ~~**V-14**~~ ⭕ | 관급/사급 **「발주기관 결정」 표시** 문구 | ✅ **고쳤음**(2026-09-09 밤 · 커밋 `89effeca`) — 표기를 **「미정(발주기관 결정)」** 으로, 경고 머리를 **「관급/사급 미정 — 발주기관이 정하는 자리입니다」** 로. **값(`unknown`)·판정은 그대로**이고 문구만 바꿨음(시험도 그 낱말로 고침) | +| **V-18** | 폐기물처리비를 **총원가 밖**에 두는 것이 맞나 | 규정 근거 **0건**으로 확정됐고 남은 것은 관행뿐 | + + +### 조건이 갖춰져야 도는 것 — 2건 + + +| # | 확인할 것 | 조건 | +| ------- | ------------------------------ | --------------------------------------------------------------------------------------------------------- | +| **V-2** | **투영 이월 코드를 지워도 되나**(0-2) | ① 노선 재확정을 더 돌린 뒤에도 투영 WARNING **0건**(2026-09-09 로그 전수 0건, 이어지는 중) ② **관을 다시 놓는 경로**가 설 것 — **둘 다일 때만** 지움 | +| **V-5** | **값이 채워진 첫 인계** 여섯 가지(B08→B09) | `./venv/Scripts/python.exe tmp/snapshot_b09.py before | + + +### 닫은 것 (2026-09-09 밤 · 근거는 검증 폴더와 아래 절) + +- **V-8 산출근거 문구 ↔ 길이** — ⭕ 어긋날 자리 없음. B08 줄이 +「돌쌓기(찰) H=2.5 · L=10.0m · **NO.4 ~ NO.4+10**」로 뜨고 정본 구간 80~90m 와 한 값 +(표기는 `stationLabel` 한 벌로 냄, 커밋 참조). +- **V-9 표준도 하단표** — ⭕ 뜨고 있음. `standard_sheet_3` 에 Table 엔티티 22행이 들어 있고 +갈무리로도 **찰 15줄**이 수량·단위까지 차 있음(메는 13줄). 「찰 11 · 메 8」은 옛 값. +- **V-10 표준도 4장** — ⭕ 도면 목록에 넷 다 뜨고 blank 0. **전체 장수는 기준이 못 됨.** +- **V-15 층따기 길이 칸** — ⭕ 칸이 서 있고 **면적 × 길이 → ㎥** 로 곱해짐. 길이가 비면 +막고 사유(`input_missing`). 시험 둘이 잠금. + +## 6. 보류 + +- **타사 사용자에게 프로젝트 공유** — 2026-09-06 사용자 보류. 회사 밖 사람에게 열람·참여를 여는 길은 당분간 만들지 않음. +- **구조물 명칭 조정** — 바꿀 이름 목록 미정. 정본은 `B05_Profile/B05_Profile_Structure_Types.json` 한 곳이라 목록만 받으면 두 화면이 같이 따라옴. +- **노선 자동 제안** — 0-2 계획노선 편집 위에, 평면·종단·횡단·유토곡선을 다 보고 제안하는 방식으로 뒤에 붙임(2026-09-06 사용자). +- **B06 종단곡선도 제어** — 뜻이 불명해 2026-09-06 사용자 지시로 삭제. + +