feat(B05): 등록부 칸에 「비워 두는 것이 뜻」·「기본값의 까닭」을 값 옆에 적음

⚠⚠ **깨진 시험의 뿌리는 칸이 아니라 자리였음.** 정책 시험은 `tmp/tests` 라 **git 밖**이라
정본(추적됨)만 다른 창에 가고 예외 목록(추적 안 됨)은 안 따라감 ⇒ **다른 창에서만 깨짐.**
오늘 그 일이 두 번 났음. ⇒ **까닭을 값 옆(정본)에 두어 함께 움직이게 함.**

- 스키마에 칸 둘 신설
  · `empty_means` — **「비워 두는 것이 뜻인 칸」**(세 번째 갈래). 비면 계산 쪽이 기준값으로
    돌고 그 사실이 화면에 뜸. 값을 넣으면 그 값이 이김
  · `default_basis` — 기본값이 **도메인 확정값이 아닐 때** 그 뜻(「다단 없음」·「안 더함」).
    법정·확정 수치면 비워 둠 — 비어 있는 것이 「확정값」이라는 뜻
- 56곳에 까닭을 적음 — 전면 기울기 · 야면석 계수 · 채움 강도 · 비탈 기울기 · 물빼기 둘 ·
  개거 규격 · 뒷길이 · 돌 종류 / 단 수 · 올림 · 이동 · 조달 · 설치 측 · 추가 운반거리
- 정책 시험이 그 칸을 읽게 바꿈 + 까닭이 한 낱말이면 잡는 시험 둘 추가

⇒ 앞으로 등록부에 칸을 열 때 **예외 목록을 고치지 말고 까닭을 값 옆에 적을 것.**

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-09 12:37:50 +09:00
co-authored by Claude Opus 5
parent 60e7e137bb
commit 36f47dcc8d
2 changed files with 124 additions and 56 deletions
+112 -56
View File
@@ -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",
@@ -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):