fix(m02-df): 변환 흐름 화면 흠 넷 — 변수 예시값 · 표 찾기 실패 같은 뜻 · 다른 로직 서버 값 · 합계 끝수

- 변환: 설계 값 변수 예시값 = 줄 시험입력 · 없으면 check_master.시험입력 기본(글 수 → 수) · totalRound = null(옛 계는 끝수 없음)
- Model CfLogic.totalRound(없음 = 기본 계금 1원 미만 버림 · null = 끝수 없음) · Round totalRoundFor · roundBy/roundText 가 null 받음 · Summary · M01 흐름 보기 합계가 그것을 씀
- Compute: 함수 결과 오류는 오류 값(「#N/A」 등)으로 넘김(화면 Eval 과 같음 · 받는 칸으로 번짐 · 옛 엔진은 그 줄을 비움) — 서버가 빈 칸 0 으로 계속 세던 차이 없앰
- 화면 값 물음(Entry_Detail queriesOf): 인력 · 기계 · 유가 조건 찾기도 자리 물음 · 재료 검색어 틀은 채운 글 · 다른 로직 입력은 서버 /logic-value 로 받은 설계 값째 셈(그 안 조건 찾기 · 단가까지) · Eval 은 서버 출력이 있으면 그것
- Values.one_value: 인력 · 기계 · 유가 자리 물음 = group_find
- 전수 대조 시험입력 1,414/1,472(96.1%) · 기본 입력 1,429(97.1%) — 남은 49 는 sub4 범위규칙 칸 · 검색어 찾기 · 재료 값 차이

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VBToTCGk5dqDKeXCEP3vhk
This commit is contained in:
2026-10-02 00:56:28 +09:00
co-authored by Claude Opus 5.5
parent a774b4e97b
commit d2ab8ee8cc
14 changed files with 156 additions and 25 deletions
@@ -87,11 +87,17 @@ class _Flow:
self.links.append(one | ({"rule": rule} if rule else {}))
def design(self) -> None:
"""설계 값 상자 — 예시값 = 줄의 시험입력 · 없으면 check_master.시험입력 기본."""
given = store.cm.시험입력(self.row)
try:
given = mf._inputs(self.row, given) # 글로 적힌 수 → 수(옛 엔진과 같음)
except mf.FormulaError:
pass
variables = []
for s in self.row.get("입력") or []:
pick = s.get("고르기")
one = {"name": s["이름"], "type": "choice" if pick else "number"}
one |= {"unit": str(s.get("단위") or "-"), "example": plain(pick[0]) if pick else None}
one |= {"unit": str(s.get("단위") or "-"), "example": plain(given.get(s["이름"]))}
if pick:
one["choices"] = plain(pick)
if "범위" in s:
@@ -329,6 +335,7 @@ def convert(row: dict, ctx: dict | None = None) -> dict:
flow = {"key": row.get("키"), "name": row.get("이름") or ""}
flow |= {"resultUnit": row.get("결과단위") or "", "boxes": list(f.boxes.values())}
flow |= {"links": f.links, "userElements": []}
flow["totalRound"] = None # 옛 계는 끝수 없음(줄.끝수 묶음은 출력 상자 끝수로 실음)
return {"flow": flow, "notes": list(dict.fromkeys(f.notes))}