fix(b08): BOX 비계 단위 ㎡→㎥(공㎥) — 원단위 성분·묶음 조각 FP-12-19 · 사유 「비계 폭 1.0m 관측(울진)」(브레인 승인)

울진 단위 칸 「공/m3」 · 시종점 식의 ×1.00 은 연장일 수 없어 폭 1.0m 로 역산 · 값은 그대로(면 × 1.0) · B09 12-19 쪽은 안 건드림

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016VBGFXB9AbJBwXP19z75Qq
This commit is contained in:
2026-09-15 03:14:25 +09:00
co-authored by Claude Opus 5
parent ea81b7644e
commit 15551b9ea1
3 changed files with 11 additions and 3 deletions
@@ -41,6 +41,8 @@ NOTE_SHORING_SCAFFOLD = (
"(울진 2×2 「강재 3개월」) — 품셈 12-20 강관동바리 · 12-19 강관비계로 이음 ·"
" 시종점 두 면은 개소당 한 번(원문은 m당 칸)"
)
#: 비계는 공㎥(품셈 12-19 밑수) = 면 × 폭 — 울진 단위 칸 「공/m3」 · 시종점 식 ×1.00 은 연장일 수 없음.
SCAFFOLD_NOTE = "비계 폭 1.0m 관측(울진)"
NOTE_WING = "날개벽 수량 근거 없음(교본·실무 모두 · 판정 ⑤) — 날개벽 줄 안 섬"
NOTE_RUBBLE = (
"기초잡석 — 근거 둘(예제·울진 집계표)에는 잡석 줄이 없음 — 사용자 확정 3차 ② 로 세움"
@@ -104,7 +106,7 @@ def box_culvert(options: dict[str, Any]) -> tuple[list[Component], list[str]]:
f"{width:g}×{height:g} {haunch:g}²÷2×4",
"",
),
("비계", "", 2 * outer_h, f"외벽 양면 {outer_h:g}×2", ""),
("비계", "", 2 * outer_h, f"외벽 양면 {outer_h:g}×2 × 폭 1.0({SCAFFOLD_NOTE})", ""),
]
notes: list[str] = [SOURCES, NOTE_FORMWORK, NOTE_SHORING_SCAFFOLD, NOTE_WING, NOTE_RUBBLE]
if math.isclose(width, 2.0) and math.isclose(height, 2.0):
@@ -478,8 +478,9 @@
{
"code": "FP-12-19",
"name": "강관비계",
"unit": "",
"from_components": ["비계"]
"unit": "",
"from_components": ["비계"],
"why": "12-19 밑수는 공㎥ — 울진 기번3 단위 칸 「공/m3」 · 시종점 식의 ×1.00 은 연장일 수 없어(끝면은 연장과 무관) 비계 폭 1.0m 관측(울진)으로 면 × 1.0 = 공㎥"
},
{
"code": "FP-12-25",
@@ -49,6 +49,9 @@ def test_울진_2x2_m당_값을_연장에_곱한다() -> None:
assert got[("동바리", "")] == pytest.approx(3.92 * 10)
# 비계 — 벽체 m당 5.2 × 연장 + 시종점 두 면 13.52 는 한 번(원문은 m당에 넣었음 · 사유).
assert got[("비계", "")] == pytest.approx(5.2 * 10 + 13.52)
# 비계는 공㎥(12-19 밑수) — 울진 단위 칸 「공/m3」 · 시종점 식 ×1.00 은 연장일 수 없어 폭 1.0m.
scaffold = next(c for c in result.components if c.name == "비계")
assert scaffold.unit == "" and "비계 폭 1.0m 관측(울진)" in scaffold.basis
assert (result.billing_unit, result.billing_quantity) == ("m", 10.0)
text = " ".join(notes)
assert "관측" in text and "날개벽" in text
@@ -129,3 +132,5 @@ def test_인계_묶음이_조각을_세운다() -> None:
assert {"FP-12-01-01", "FP-12-04", "FP-12-38", "FP-12-03", "FP-12-20", "FP-12-19"} <= set(parts)
assert parts["FP-12-03"]["quantity"] == pytest.approx((179 + 157) * 10 / 1000)
assert parts["FP-12-20"]["quantity"] == pytest.approx(3.92 * 10)
assert parts["FP-12-19"]["unit"] == ""
assert parts["FP-12-19"]["quantity"] == pytest.approx(5.2 * 10 + 13.52)