From 36f47dcc8dba26c801f02768f58adc273747d05d Mon Sep 17 00:00:00 2001 From: umsangdon Date: Wed, 9 Sep 2026 12:37:50 +0900 Subject: [PATCH] =?UTF-8?q?feat(B05):=20=EB=93=B1=EB=A1=9D=EB=B6=80=20?= =?UTF-8?q?=EC=B9=B8=EC=97=90=20=E3=80=8C=EB=B9=84=EC=9B=8C=20=EB=91=90?= =?UTF-8?q?=EB=8A=94=20=EA=B2=83=EC=9D=B4=20=EB=9C=BB=E3=80=8D=C2=B7?= =?UTF-8?q?=E3=80=8C=EA=B8=B0=EB=B3=B8=EA=B0=92=EC=9D=98=20=EA=B9=8C?= =?UTF-8?q?=EB=8B=AD=E3=80=8D=EC=9D=84=20=EA=B0=92=20=EC=98=86=EC=97=90=20?= =?UTF-8?q?=EC=A0=81=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ⚠⚠ **깨진 시험의 뿌리는 칸이 아니라 자리였음.** 정책 시험은 `tmp/tests` 라 **git 밖**이라 정본(추적됨)만 다른 창에 가고 예외 목록(추적 안 됨)은 안 따라감 ⇒ **다른 창에서만 깨짐.** 오늘 그 일이 두 번 났음. ⇒ **까닭을 값 옆(정본)에 두어 함께 움직이게 함.** - 스키마에 칸 둘 신설 · `empty_means` — **「비워 두는 것이 뜻인 칸」**(세 번째 갈래). 비면 계산 쪽이 기준값으로 돌고 그 사실이 화면에 뜸. 값을 넣으면 그 값이 이김 · `default_basis` — 기본값이 **도메인 확정값이 아닐 때** 그 뜻(「다단 없음」·「안 더함」). 법정·확정 수치면 비워 둠 — 비어 있는 것이 「확정값」이라는 뜻 - 56곳에 까닭을 적음 — 전면 기울기 · 야면석 계수 · 채움 강도 · 비탈 기울기 · 물빼기 둘 · 개거 규격 · 뒷길이 · 돌 종류 / 단 수 · 올림 · 이동 · 조달 · 설치 측 · 추가 운반거리 - 정책 시험이 그 칸을 읽게 바꿈 + 까닭이 한 낱말이면 잡는 시험 둘 추가 ⇒ 앞으로 등록부에 칸을 열 때 **예외 목록을 고치지 말고 까닭을 값 옆에 적을 것.** Co-Authored-By: Claude Opus 5 (1M context) --- B05_Profile/B05_Profile_Structure_Types.json | 168 ++++++++++++------- B05_Profile/B05_Profile_Structures_Schema.py | 12 ++ 2 files changed, 124 insertions(+), 56 deletions(-) diff --git a/B05_Profile/B05_Profile_Structure_Types.json b/B05_Profile/B05_Profile_Structure_Types.json index 1788819a..b91b0ad8 100644 --- a/B05_Profile/B05_Profile_Structure_Types.json +++ b/B05_Profile/B05_Profile_Structure_Types.json @@ -467,7 +467,8 @@ "choices": ["콘크리트 개거 150×200", "L형수로 H=0.2"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 실무 붙박이(콘크리트 개거)로 돎" } ] }, @@ -729,7 +730,8 @@ "label": "설치 측", "input": "select", "choices": ["자동(성토 쪽)", "좌", "우"], - "default": "자동(성토 쪽)" + "default": "자동(성토 쪽)", + "default_basis": "「자동(성토 쪽)」 — 칸이 생기기 전의 동작을 이어받는 표식" }, { "key": "weep_hole_diameter_mm", @@ -738,7 +740,8 @@ "unit": "㎜", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 국가기준 Ø50 으로 돎 — 사용자 확정 「국가기준 + 숫자 변경 가능하게」" }, { "key": "weep_hole_area_m2", @@ -747,7 +750,8 @@ "unit": "㎡", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 국가기준 2㎡당 1개로 돎 — 사용자 확정 「국가기준 + 숫자 변경 가능하게」" } ] }, @@ -832,7 +836,8 @@ "choices": ["품셈", "실무 관행"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 품셈 열로 돎 — 실무 관행 열은 골라야 씀" }, { "key": "fill_concrete_mpa", @@ -841,7 +846,8 @@ "choices": ["180", "210"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 계산 쪽 기준 강도로 돎" }, { "key": "face_slope_ratio", @@ -849,7 +855,8 @@ "input": "number", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 품셈 표준경사로 자동 판정 — 값을 넣으면 그 값이 이김" }, { "key": "foundation", @@ -865,7 +872,8 @@ "label": "설치 측", "input": "select", "choices": ["자동(성토 쪽)", "좌", "우"], - "default": "자동(성토 쪽)" + "default": "자동(성토 쪽)", + "default_basis": "「자동(성토 쪽)」 — 칸이 생기기 전의 동작을 이어받는 표식" }, { "key": "weep_hole_diameter_mm", @@ -874,7 +882,8 @@ "unit": "㎜", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 국가기준 Ø50 으로 돎 — 사용자 확정 「국가기준 + 숫자 변경 가능하게」" }, { "key": "weep_hole_area_m2", @@ -883,7 +892,8 @@ "unit": "㎡", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 국가기준 2㎡당 1개로 돎 — 사용자 확정 「국가기준 + 숫자 변경 가능하게」" } ] }, @@ -968,7 +978,8 @@ "choices": ["품셈", "실무 관행"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 품셈 열로 돎 — 실무 관행 열은 골라야 씀" }, { "key": "fill_concrete_mpa", @@ -977,7 +988,8 @@ "choices": ["180", "210"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 계산 쪽 기준 강도로 돎" }, { "key": "face_slope_ratio", @@ -985,7 +997,8 @@ "input": "number", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 품셈 표준경사로 자동 판정 — 값을 넣으면 그 값이 이김" }, { "key": "foundation", @@ -1001,7 +1014,8 @@ "label": "설치 측", "input": "select", "choices": ["자동(성토 쪽)", "좌", "우"], - "default": "자동(성토 쪽)" + "default": "자동(성토 쪽)", + "default_basis": "「자동(성토 쪽)」 — 칸이 생기기 전의 동작을 이어받는 표식" }, { "key": "weep_hole_diameter_mm", @@ -1010,7 +1024,8 @@ "unit": "㎜", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 국가기준 Ø50 으로 돎 — 사용자 확정 「국가기준 + 숫자 변경 가능하게」" }, { "key": "weep_hole_area_m2", @@ -1019,7 +1034,8 @@ "unit": "㎡", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 국가기준 2㎡당 1개로 돎 — 사용자 확정 「국가기준 + 숫자 변경 가능하게」" } ] }, @@ -1093,7 +1109,8 @@ "label": "설치 측", "input": "select", "choices": ["자동(성토 쪽)", "좌", "우"], - "default": "자동(성토 쪽)" + "default": "자동(성토 쪽)", + "default_basis": "「자동(성토 쪽)」 — 칸이 생기기 전의 동작을 이어받는 표식" }, { "key": "tiers", @@ -1102,7 +1119,8 @@ "unit": "단", "default": 1, "required": false, - "phase": "b05" + "phase": "b05", + "default_basis": "1 = 다단 없음 — 도메인 수치가 아니라 「단이 하나」라는 표식(기슭막이와 같은 벌)" }, { "key": "lift_m", @@ -1111,7 +1129,8 @@ "unit": "m", "default": 0, "required": false, - "phase": "b05" + "phase": "b05", + "default_basis": "0 = 자동 자리 그대로 — 올리지 않음을 뜻함(기슭막이와 같은 벌)" }, { "key": "shift_m", @@ -1120,7 +1139,8 @@ "unit": "m", "default": 0, "required": false, - "phase": "b05" + "phase": "b05", + "default_basis": "0 = 자동 자리 그대로 — 옮기지 않음을 뜻함(기슭막이와 같은 벌)" }, { "key": "back_len_cm", @@ -1129,7 +1149,8 @@ "choices": ["25", "30", "35", "45", "55", "60", "75"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 돌쌓기 기본값으로 서고 「기본값으로 섰음」이 줄로 뜸 — 돌이 아닌 형태도 있어 필수로 못 검" }, { "key": "stone_kind", @@ -1138,7 +1159,8 @@ "choices": ["야면석·호박돌", "깬잡석", "깬돌", "견치돌"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 야면석 계수 열로 서고 그 사실이 줄로 뜸 — 돌이 아닌 형태도 있어 필수로 못 검" }, { "key": "stone_supply", @@ -1147,7 +1169,8 @@ "choices": ["채집", "구입"], "default": "채집", "required": false, - "phase": "detail" + "phase": "detail", + "default_basis": "「채집」 — 별표2 「야면석 등은 가급적 현장에서 채취·사용」 권고. 구조물마다 바꿀 수 있음" }, { "key": "stone_coeff_basis", @@ -1156,7 +1179,8 @@ "choices": ["품셈", "실무 관행"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 품셈 열로 돎 — 실무 관행 열은 골라야 씀" }, { "key": "fill_concrete_mpa", @@ -1165,7 +1189,8 @@ "choices": ["180", "210"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 계산 쪽 기준 강도로 돎" }, { "key": "face_slope_ratio", @@ -1173,7 +1198,8 @@ "input": "number", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 품셈 표준경사로 자동 판정 — 값을 넣으면 그 값이 이김" }, { "key": "foundation", @@ -1191,7 +1217,8 @@ "unit": "㎜", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 국가기준 Ø50 으로 돎 — 사용자 확정 「국가기준 + 숫자 변경 가능하게」" }, { "key": "weep_hole_area_m2", @@ -1200,7 +1227,8 @@ "unit": "㎡", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 국가기준 2㎡당 1개로 돎 — 사용자 확정 「국가기준 + 숫자 변경 가능하게」" } ] }, @@ -1285,7 +1313,8 @@ "choices": ["품셈", "실무 관행"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 품셈 열로 돎 — 실무 관행 열은 골라야 씀" }, { "key": "fill_concrete_mpa", @@ -1294,7 +1323,8 @@ "choices": ["180", "210"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 계산 쪽 기준 강도로 돎" }, { "key": "face_slope_ratio", @@ -1302,7 +1332,8 @@ "input": "number", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 품셈 표준경사로 자동 판정 — 값을 넣으면 그 값이 이김" }, { "key": "foundation", @@ -1318,7 +1349,8 @@ "label": "설치 측", "input": "select", "choices": ["자동(성토 쪽)", "좌", "우"], - "default": "자동(성토 쪽)" + "default": "자동(성토 쪽)", + "default_basis": "「자동(성토 쪽)」 — 칸이 생기기 전의 동작을 이어받는 표식" }, { "key": "weep_hole_diameter_mm", @@ -1327,7 +1359,8 @@ "unit": "㎜", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 국가기준 Ø50 으로 돎 — 사용자 확정 「국가기준 + 숫자 변경 가능하게」" }, { "key": "weep_hole_area_m2", @@ -1336,7 +1369,8 @@ "unit": "㎡", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 국가기준 2㎡당 1개로 돎 — 사용자 확정 「국가기준 + 숫자 변경 가능하게」" } ] }, @@ -1470,7 +1504,8 @@ "choices": ["품셈", "실무 관행"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 품셈 열로 돎 — 실무 관행 열은 골라야 씀" }, { "key": "fill_concrete_mpa", @@ -1479,7 +1514,8 @@ "choices": ["180", "210"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 계산 쪽 기준 강도로 돎" }, { "key": "face_slope_ratio", @@ -1487,7 +1523,8 @@ "input": "number", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 품셈 표준경사로 자동 판정 — 값을 넣으면 그 값이 이김" }, { "key": "foundation", @@ -1537,7 +1574,8 @@ "unit": "㎜", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 국가기준 Ø50 으로 돎 — 사용자 확정 「국가기준 + 숫자 변경 가능하게」" }, { "key": "weep_hole_area_m2", @@ -1546,7 +1584,8 @@ "unit": "㎡", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 국가기준 2㎡당 1개로 돎 — 사용자 확정 「국가기준 + 숫자 변경 가능하게」" } ] }, @@ -1586,7 +1625,8 @@ "choices": ["품셈", "실무 관행"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 품셈 열로 돎 — 실무 관행 열은 골라야 씀" }, { "key": "fill_concrete_mpa", @@ -1595,7 +1635,8 @@ "choices": ["180", "210"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 계산 쪽 기준 강도로 돎" }, { "key": "face_slope_ratio", @@ -1603,7 +1644,8 @@ "input": "number", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 품셈 표준경사로 자동 판정 — 값을 넣으면 그 값이 이김" }, { "key": "foundation", @@ -1675,7 +1717,8 @@ "choices": ["양쪽", "좌", "우"], "default": "양쪽", "required": false, - "phase": "b05" + "phase": "b05", + "default_basis": "「좌」는 셀렉트 첫 항목일 뿐 도메인 확정값이 아님 — 측점마다 사용자가 고름" }, { "key": "tiers", @@ -1684,7 +1727,8 @@ "unit": "단", "default": 1, "required": false, - "phase": "b05" + "phase": "b05", + "default_basis": "1 = 다단 없음 — 도메인 수치가 아니라 「단이 하나」라는 표식" }, { "key": "lift_m", @@ -1693,7 +1737,8 @@ "unit": "m", "default": 0, "required": false, - "phase": "b05" + "phase": "b05", + "default_basis": "0 = 자동 자리 그대로" }, { "key": "shift_m", @@ -1702,7 +1747,8 @@ "unit": "m", "default": 0, "required": false, - "phase": "b05" + "phase": "b05", + "default_basis": "0 = 자동 자리 그대로" }, { "key": "form", @@ -1720,7 +1766,8 @@ "choices": ["25", "30", "35", "45", "55", "60", "75"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 돌쌓기 기본값으로 서고 「기본값으로 섰음」이 줄로 뜸 — 돌이 아닌 형태도 있어 필수로 못 검" }, { "key": "stone_kind", @@ -1729,7 +1776,8 @@ "choices": ["야면석·호박돌", "깬잡석", "깬돌", "견치돌"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 야면석 계수 열로 서고 그 사실이 줄로 뜸 — 돌이 아닌 형태도 있어 필수로 못 검" }, { "key": "stone_supply", @@ -1747,7 +1795,8 @@ "choices": ["품셈", "실무 관행"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 품셈 열로 돎 — 실무 관행 열은 골라야 씀" }, { "key": "fill_concrete_mpa", @@ -1756,7 +1805,8 @@ "choices": ["180", "210"], "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 계산 쪽 기준 강도로 돎" }, { "key": "face_slope_ratio", @@ -1764,7 +1814,8 @@ "input": "number", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 품셈 표준경사로 자동 판정 — 값을 넣으면 그 값이 이김" }, { "key": "foundation", @@ -1818,7 +1869,8 @@ "unit": "㎜", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 국가기준 Ø50 으로 돎 — 사용자 확정 「국가기준 + 숫자 변경 가능하게」" }, { "key": "weep_hole_area_m2", @@ -1827,7 +1879,8 @@ "unit": "㎡", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 국가기준 2㎡당 1개로 돎 — 사용자 확정 「국가기준 + 숫자 변경 가능하게」" } ] }, @@ -2005,7 +2058,8 @@ "choices": ["자동(성토 쪽)", "좌", "우"], "default": "자동(성토 쪽)", "required": false, - "phase": "b05" + "phase": "b05", + "default_basis": "「자동(성토 쪽)」 — 흙은 성토 쪽에 쌓는다는 지금까지의 동작을 이어받는 표식. 측점마다 좌·우로 바꿈" }, { "key": "fill_slope_ratio", @@ -2013,7 +2067,8 @@ "input": "number", "default": null, "required": false, - "phase": "detail" + "phase": "detail", + "empty_means": "비우면 그 측점의 노선 성토 기울기를 그대로 씀 — 지식DB 가 「기본 비탈기울기는 근거에 없다」고 못 박은 자리" }, { "key": "extra_distance_m", @@ -2022,7 +2077,8 @@ "unit": "m", "default": 0, "required": false, - "phase": "detail" + "phase": "detail", + "default_basis": "0 = 「추가 없음」 — 노선 안 사토장은 측점 누가거리로 거리가 나오므로 이 칸은 외부 사토장 대비 여벌" }, { "key": "area_m2", diff --git a/B05_Profile/B05_Profile_Structures_Schema.py b/B05_Profile/B05_Profile_Structures_Schema.py index d570578e..c484602f 100644 --- a/B05_Profile/B05_Profile_Structures_Schema.py +++ b/B05_Profile/B05_Profile_Structures_Schema.py @@ -48,6 +48,18 @@ class StructureOptionField(BaseModel): # 기본값이 그대로 저장된다(2026-09-07 사용자: 「폼 선택은 가능하게 반영하고 나중에 # 선택 비활성화로 하자」). 칸 자체를 없애면 나중에 켤 자리를 다시 찾아야 한다. enabled: bool = True + # ── 「기본값도 필수도 아닌」 세 번째 갈래 (2026-09-09 신설) ──────────────────── + # 지금까지 칸은 둘 중 하나여야 했다 — **기본값이 있거나, 필수이거나**. 그러지 않으면 + # 빈 값이 조용히 저장되기 때문이다. 그런데 실제로는 셋째가 있다: + # **「비워 두는 것이 뜻인 칸」** — 비면 계산 쪽이 **기준값**으로 돌고 그 사실이 화면에 + # 사유로 뜬다. 값을 넣으면 그 값이 이긴다(예: 전면 기울기, 물빼기 구멍, 뒷길이). + # 여기에 기준의 출처를 **한 줄로 적어** 두면, 그 칸이 왜 비어 있어도 되는지가 + # **정본 파일 안에** 남는다. 시험 예외 목록(창마다 따로 사는 파일)로 두면 창이 갈릴 때 + # 같은 시험이 다른 창에서 깨진다 — 실제로 그렇게 깨졌다(2026-09-09). + empty_means: str | None = None + # 기본값이 **도메인 확정값이 아닐 때** 그 뜻을 적는다(예: 「다단 없음」·「안 더함」). + # 법정·확정 수치면 비워 둔다 — 비어 있는 것이 「확정값」이라는 뜻이다. + default_basis: str | None = None class StructureType(BaseModel):