Files
eomsangdonandClaude Opus 5.5 39c147a8a4 feat(est-test): 기본환경으로 설정과 저장 작업 목록에서 삭제
- 계산 환경을 기본값으로 저장해 새 내역서에 적용
- 저장 작업을 data/removed 로 옮겨 목록에서만 뺌

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 21:17:20 +09:00

187 KiB
Raw Permalink Blame History

  • 산출근거 주석 지정/해제(popMainSetStr), 블럭 삭제(popMainBlockDel), 공사비역산 맞추기(popupTotal), 레벨 일괄 증감(mnuLevelUp/Down), 설계변경 초기화(mnuChangeInit), 원가계산서 초기화(popupInit), 기성 회차 입력 초기화(mnuFileAccomInit), 연차공사 배분 초기화(TFRMANUAL popInit) 및 물가변동 입력 초기화(TFRMESCALATION popInit) 구현

    • 자체 검증:
      1. 산출근거 주석 지정/해제 (popMainSetStr, 0xf08b1c) 및 음수 비목/Index 유형 보존:
        • REA TFRMCOST/TFRMESTBASE의 팝업 메뉴 popMainSetStr / mnuSetGuSuc ("주석으로 지정", Ctrl+J, 0xf08b1c) 스펙 근거 기반 구현.
        • 단가산출(CostMainDat) 화면의 산출근거 행에서 Index를 -1(주석)로 지정하거나 원래 유형으로 복원.
        • 음수 유형 및 비목 행(-2 재료비, -3 경비, -5 소계) 온전한 보존·복원:
          • 주석 지정 시 _origIndex: curIndex뿐만 아니라 _origSCheck: curSCheck를 명시적으로 보존하고 Index = -1, SCheck = -1로 전환.
          • 주석 해제 시 _origIndex(또는 스냅샷 Index_)와 _origSCheck(또는 SCheck_, OCheck)를 통해 원래 비목 유형(-2, -3, -5 등)과 Index로 100% 정밀 복원 후 임시 속성 제거.
          • 호표 제목 행(Index > 0) 또는 소계 구분선(Index === -20)은 주석으로 지정할 수 없도록 안전 가드 적용.
          • 다중 선택 시 제목 행이나 비산출근거 행이 포함되면 전체 변경을 중단하고 원자성(Atomic) 보장.
          • 저장 및 재열기 왕복 검증: JSON 직렬화/역직렬화 후에도 _origIndex, _origSCheck 및 원래 비목 정보가 보존되어 온전하게 복원됨을 검증.
        • native-text.js에서 Index === -1인 행은 소계(LinkIndex: 61) 계산 시 if (num(previous.Index) !== -1) 조건에 따라 자동으로 합산에서 제외되므로 산출식 수치 무결성 완벽 보장.
      2. 블럭 삭제 (popMainBlockDel, 0xf08adc) 및 실제 파일 참조 보호:
        • REA TFRMCOST/TFRMHEAD/TFRMMACH/TFRMEST 전역의 popMainBlockDel ("블럭삭제", Ctrl+Del, 0xf08adc) 스펙 근거 기반 구현.
        • EstBlockActions.deleteBlockRows(state): 선택된 범위/블럭의 행들을 일괄 삭제.
        • 호표 제목 행(Index > 0)이 포함된 경우 호표 전체 행을 일괄 삭제 범위로 확장.
        • 참조 보호 검증: 다른 항목(EstMainDat, HeadMainDat 등)에서 참조 중인 코드가 포함된 경우 숫자 및 문자열 형태의 LinkIndex(5, 6, 21, 101, 103, 104, 105)와 연결 코드를 정규화 대조하여 "다른 항목에서 사용 중입니다. 연결을 먼저 해제하세요."로 안전 차단.
        • 삭제 완료 후 선택 해제 및 블럭 시작/끝 상태 초기화.
      3. 원가계산서 공사비역산 자리수 맞추기 (TFRMWONGABASE popupTotal):
        • REA TFRMWONGABASE 팝업 popupTotal ("공사비역산 자리수 맞추기") 스펙 근거 기반 구현.
        • EstWonga.alignTotal(rows, targetCost, unitDigits, options, bases):
          • 원가계산서 총도급공사비(LinkIndex 55) 행을 지정 단단위(1,000원, 10,000원 등)로 절하 맞춤.
          • 단순 Cost 덮어쓰기가 아닌, 실제 calculate(TotalFix: true) 엔진을 호출하여 이윤 및 부가가치세 행을 수렴 조정하고 전체 원가 명세와 목표 금액(A+B+C+D === Total)을 일관되게 맞춤.
          • 실패 시 안전 롤백 및 기존 상태 보존: 복제본(structuredClone)을 통해 먼저 역산 계산을 수행하며, 순환 참조나 수렴 실패 시 원본 rows의 Cost를 임의 변경하지 않고 기존 상태를 100% 보존하며 에러 처리. 목표 금액 완전 도달 확인 후에만 원본 rows에 결과 동기화.
          • 조정된 계산 결과를 원본 rows에 정확히 반영하고 state.project.options.TotalFix = true 설정.
          • 저장 및 재열기 왕복 검증: JSON 직렬화/역직렬화 후 재계산하더라도 이윤, 부가세, 총도급공사비가 변형 없이 동일하게 유지됨을 검증.
        • UI 연동: 편집(E) 메뉴에 공사비역산 자리수 맞추기(data-action="align-wonga-total") 등록 및 EstActions.form 연동.
      4. 레벨 일괄 증감 (mnuLevelUp, mnuLevelDown, mnuCostLevelUp, mnuCostLevelDown):
        • REA TFRMESTMAIN/TFRMEST의 mnuLevelUp ("레벨 일괄증가", 0xd0e374), mnuLevelDown ("레벨 일괄감소") 스펙 근거 기반 구현.
        • 내역서(EstMainDat), 단가산출(CostMainDat), 일위대가(HeadMainDat), 기계경비(MachMainDat)에서 선택된 행들의 Level을 일괄 +1 또는 -1 조정(범위: 0~9 클램프).
        • 지원되지 않는 화면(자재, 노임 등)이나 미선택 시 안전 거부 처리.
        • UI 연동: 상단 LEVEL 메뉴에 레벨 일괄 증가 (+1)(data-action="level-batch-up"), 레벨 일괄 감소 (-1)(data-action="level-batch-down") 등록.
      5. 설계변경 초기화 (mnuChangeInit) 및 참조 무결성 보강:
        • REA TFRMESTMAIN의 메뉴 mnuChangeInit ("설계변경 초기화") 스펙 근거 기반 구현.
        • EstBlockActions.resetChangeAction(state):
          • 불완전 복원 원천 차단: baseline이 없거나 baseline.tables가 누락된 경우, 무차별적인 _ 복원을 엄격히 차단하고 "확정된 당초 내역(baseline)이 없습니다. 완전 복원이 불가능하여 초기화를 진행할 수 없습니다." 에러 발생.
          • 수량 연결 참조 무결성 및 Excel 고유 식별자 동일성 입증 검사:
            • 수량산출 연결(quantities, quantitySheets.items의 TargetKey/TargetCode): 당초 내역(baseline.tables.EstMainDat)에 없는 신규 행을 가리키는 연결 발견 시 즉시 초기화 차단.
            • Excel 수량 연결(excelQuantityLinks): 단순 인덱스 범위 검사가 아니라, 연결 대상의 안정된 고유 식별자(PkID)를 통해 당초 행 존재 여부를 대조. 행 중간 삽입·삭제·재정렬이나 중복 코드가 있더라도 Code, Name, Size, Unite, Level의 동일성(Identity)을 엄격히 검증하여 다른 항목을 가리키는 위험을 원천 차단.
          • 사용자 확인 대화상자(confirm)를 통해 오조작 방지.
          • 정밀 테이블 및 필드 스펙 격리: baseline 생성 스펙과 정확히 일치하는 7개 대상 테이블(EstMainDat, HeadMainDat, HeadTitleDat, CostMainDat, CostTitleDat, MachTitleDat, Wonga)만 복원하여, 수량 연결(quantities), 기성(progress), 연차(annual) 등 다른 업무 데이터와 연결 구조를 100% 온전하게 보존.
          • 다른 업무 원본 필드 보존: 전체 필드의 무차별 _ 삭제 대신, baseline 스펙에 정의된 18개 핵심 필드(Code, Name, Size, Unite, GN, TU, TC, 단위단가 4종, 비목단가 4종, LineData, VSusic, Cost)의 _ 속성만 선택적으로 정리. 경비성 복원 정보(_prevSCheck), 순공사비 복원 정보(_origLinkIndex, _origName), 주석 복원 정보(_origIndex, _origSCheck) 등 다른 업무 속성을 완벽하게 보존.
          • 신규 및 삭제 행 복원: 설계변경 도중 추가된 신규 행(NewItem: true)을 제거하고 삭제된 당초 행을 100% 원래 행 수 및 순서로 원상 복구.
          • baseline 객체를 안전하게 제거하고 프로젝트 작업 모드를 일반 내역서 모드로 환원.
          • 저장 및 재열기 왕복 및 Undo 검증: 당초 확정 후 변경된 내역을 JSON으로 저장하고 재열기한 상태에서도 resetChangeAction을 통해 당초 수량/단가/금액으로 정확히 복원되며, EstApp.change를 통한 Undo(실행 취소) 이력 보존 검증 완료.
        • UI 연동: 편집(E) 메뉴에 설계변경 초기화(data-action="reset-change") 등록 및 handle("reset-change") 연동.
      6. 원가계산서 항목 초기화 (TFRMWONGABASE popupInit):
        • REA TFRMWONGABASE 팝업 popupInit ("항목 초기화") 스펙 근거 기반 구현.
        • EstWonga.resetWonga(rows, options, bases) & EstBlockActions.resetWongaAction(state):
          • 공사비역산 고정액(TotalFix: true) 옵션을 false로 해제.
          • 당초 보존값(VSusic_, Cost_, CalcIndex_)이 있는 경우 원래 수식 및 단가로 안전 복원.
          • 일반 재계산 엔진(calculate)을 호출하여 당초 수식과 직접공사비 기준금액에 따라 원가계산서 전체 항목을 깨끗하게 재계산.
          • UI 연동: 편집(E) 메뉴에 원가계산서 초기화(data-action="reset-wonga") 등록 및 handle("reset-wonga") 연동.
      7. 기성 회차 입력 초기화 (mnuFileAccomInit):
        • REA TFRMESTMAIN의 메뉴 mnuFileAccomInit ("기성 회차 입력 초기화") 스펙 근거 기반 구현.
        • EstBlockActions.resetProgressInputsAction(state):
          • 선택된 기성 회차의 금회 기성 및 사정 입력 데이터(round.inputs)를 깨끗하게 리셋.
          • 확정된 회차(round.locked: true)는 입력을 초기화할 수 없도록 안전 차단 ("확정된 회차는 입력을 초기화할 수 없습니다. 확정을 먼저 해제하세요.").
          • 사용자 확인 대화상자(confirm)를 통해 실수로 인한 기성 입력 삭제 방지.
          • 실행 취소(Undo) 이력 보존 및 JSON 직렬화/역직렬화(저장 재열기) 왕복 보증.
        • UI 연동: 기성 화면 툴바에 회차 입력 초기화(data-action="reset-round-inputs") 버튼 등록 및 handle("reset-round-inputs") 연동.
      8. 연차공사 배분 초기화 (TFRMANUAL popInit - 웹 보조 기능 명시):
        • REA TFRMANUAL의 팝업 popInit 분석 근거 재확인: REA 원본의 popInit이 전체 차수 삭제인지 단일 차수 수식 리셋인지 동등성 근거가 불충분하므로, 이를 단정하지 않고 웹 보조 기능("연차 차수 배분 초기화 (웹보조)")으로 명확히 구분하여 표기.
        • EstBlockActions.resetAnnualAction(state):
          • 등록된 연차공사 차수와 배분 수식(project.annual = [])을 웹 보조 차원에서 초기화.
          • 내역서(EstMainDat) 및 원가계산서(Wonga)의 본선 원본 데이터를 100% 온전하게 보존.
          • 빈 상태에서 재호출 시 안전 거부 처리 및 사용자 확인 대화상자(confirm)에 웹보조 성격 안내.
          • 실행 취소(Undo) 지원 및 JSON 저장/재열기 왕복 검증 완료.
        • UI 연동: 연차공사 화면 상단 툴바에 연차 차수 초기화(웹보조)(data-action="reset-annual") 버튼 등록 및 handle("reset-annual") 연동.
      9. 물가변동 입력 초기화 (TFRMESCALATION popInit):
        • REA TFRMESCALATION의 팝업 popInit ("물가변동 입력 초기화") 스펙 근거 기반 구현.
        • EstBlockActions.resetEscalationAction(state):
          • 물가변동 화면(escalation)에서 적용제외 수량(excludeQuantities) 및 조정 옵션(options)을 깨끗하게 리셋.
          • 내역서 본선 행 및 기준 단가를 100% 온전하게 보존.
          • 물가변동 미설정 또는 빈 상태에서 재호출 시 안전 거부 처리 및 사용자 확인 대화상자(confirm) 지원.
          • 실행 취소(Undo) 이력 보존 및 JSON 직렬화/역직렬화(저장 재열기) 왕복 보증.
        • UI 연동: 물가변동 툴바에 물가변동 입력 초기화(data-action="reset-escalation") 버튼 연동 및 handle("reset-escalation") 등록.
      10. UI 연동 및 700줄 제한 엄수:
        • native-block-actions.js(636줄), native-wonga.js(268줄), native-extra.js(699줄)에 모듈화 배치하여 단일 소스코드 파일 700줄 제한 완벽 준수.
        • index.html(225줄) 편집(E) 및 LEVEL 메뉴 등록.
    • 관련 테스트:
      • pytest resources/tester/test_est_row_actions.py 14개 전수 통과:
        • test_reset_escalation_action: 물가변동 적용제외 수량 및 옵션 초기화, 본선 내역/단가 보존, JSON 저장 재열기 왕복, Undo(실행 취소) 지원, handle("reset-escalation") 연동 및 빈 상태 안전 거부 검증 완료.
        • test_reset_annual_action: 연차공사 2개 차수 배분(40%/60%) 계산 검증, JSON 저장 재열기 왕복, resetAnnualAction 실행 후 차수 초기화 및 본선 내역/원가 데이터 보존, 빈 상태 안전 거부, handle("reset-annual") 연동 및 Undo 지원 검증 완료.
        • test_reset_progress_inputs_action: 미확정 기성 회차의 입력 초기화, 확정된 회차의 초기화 시도 시 안전 차단, JSON 저장 재열기 왕복 후 초기화 검증, handle("reset-round-inputs") 연동 및 Undo 지원 검증 완료.
        • test_reset_change_action: baseline 부재 시 안전 차단, 신규 행 참조 수량 연결 시 안전 차단, Excel 수량 연결(excelQuantityLinks)의 안정된 식별자(PkID) 검증(행 중간 삽입·순서 재정렬·중복 코드 발생 시 신규 행 참조 차단 및 내용 변조 시 동일성 입증 실패 차단), 신규 행 추가 및 기존 행 변경 후 JSON 저장 재열기 왕복, 설계변경 초기화 시 신규 행 제거 및 원래 행/수량/단가 완전 복원, 타 업무 필드(_origLinkIndex, _prevSCheck) 및 수량 연결(quantities) 보존, Undo(실행 취소) 지원 검증 완료.
        • test_reset_wonga_action: 공사비역산 실행(1,250,000원 절하 및 TotalFix=true) 후 JSON 저장 재열기 왕복, 원가계산서 초기화(resetWongaAction) 실행 시 TotalFix 해제 및 당초 수식/금액(1,270,500원) 복원, handle("reset-wonga") 연동 검증 완료.
        • test_align_wonga_total_action: 원가계산서 10,000원 단단위 절하 맞춤, 실제 calculate(TotalFix: true) 호출을 통한 이윤·부가세 역산 조정, 명세 합산 일치(totalMatch), JSON 저장 재열기 후 일관성 유지, 순환 참조 등 계산 실패 시 기존 rows 상태 완전 보존 검증 완료.
        • test_toggle_cost_comment_and_block_delete: 산출근거 행 주석(-1) 지정 및 _origIndex, _origSCheck 보존, 비목 행(-2, -3, -5)의 원래 비목 복원, JSON 저장 재열기 왕복 검증, 호표 제목 및 구분선 지정 거부, 다중 선택 원자성 보장, 블럭 행 일괄 삭제 및 문자열/숫자 LinkIndex 참조 호표 삭제 차단 검증 완료.
        • test_level_batch_adjust_actions: 선택 행 레벨 일괄 +1/-1 증감, 0~9 상하한 클램프, 비지원 테이블 및 미선택 시 안전 거부 검증 완료.
        • test_block_actions_range_selection_and_clear: 블럭 시작/끝 지정, 범위 선택, 전체 선택, 블럭 해제 및 예외 검증 완료.
      • pytest resources/tester/test_est_row_actions.py resources/tester/test_est_estimate.py resources/tester/test_est_business.py: 36 passed in 21.60s.
  • 단가산출 산출근거 비목 지정/해제(popMainSetNC/GC/JC/TC/BimogFree) 구현 및 순공사비·경비성 안전 가드 보강

    • 자체 검증:
      1. 순공사비·경비성 토글 안전 가드 및 원자적 일괄 검증 보강:
        • 명시적 0/1/2 이력 보존 및 복원: toggleJcBimog에서 경비성(3) 전환 시 원래 SCheck(0:비목별, 1:재료, 2:노무)을 _prevSCheck에 명시적으로 보존. 해제 시 해당 이력 또는 원본 SCheck_가 존재하는 경우에만 정확한 이전 값으로 복원.
        • 이력 없는 경비성 3 임의 변환 차단: _prevSCheck 및 SCheck_가 없는 기존 3 행이나 원래 유형을 알 수 없는 행의 임의 0 변환을 안전하게 차단.
        • 다중 선택 원자성(Atomic) 보장: 복수 행 선택 토글 시 사전 검증 계획(plans)을 수립하여 한 행이라도 거부 대상이 포함되면 전체 변경을 중단하고 앞선 행도 변경되지 않도록 원자적 일괄 적용 보장.
        • JSON 저장 및 재열기 왕복 보증: JSON 직렬화/역직렬화 후에도 _prevSCheck 및 SCheck_가 보존되어 당초 SCheck(0/1/2)로 100% 온전하게 복원됨을 검증.
        • 원본부터 순공사비(54)인 행의 해제 시도나 대체 시도 역시 _origLinkIndex나 LinkIndex_ 등 원래 유효 유형이 확인되지 않으면 오류로 차단하고 기존 행 속성 보존.
      2. 단가산출 산출근거 비목 지정/해제 (popMainSetNC, popMainSetGC, popMainSetJC, popMainSetTC, popMainSetBimogFree):
        • REA TFRMCOST/TFRMESTBASE의 팝업 메뉴 비목 지정(0xf0c0f0, 0x10d815c) 스펙 근거 기반 구현.
        • 단가산출(CostMainDat) 화면에서 산출근거 행의 OCheck 및 SCheck를 노무비(-1), 재료비(-2), 경비(-3), 소계(-5)로 지정하거나 일반 산출식(0)으로 해제.
        • UI 연동: 편집(E) 메뉴에 산출근거 비목 지정/해제(data-action="set-cost-line-kind") 등록 및 EstActions.form 대화상자 지원.
      3. 700줄 제한 엄수:
        • native-business-actions.js: 643줄, native-extra.js: 696줄, index.html: 211줄, resources/tester/test_est_row_actions.py: 422줄.
    • 관련 테스트:
      • pytest resources/tester/test_est_row_actions.py 5개 전수 통과:
        • test_toggle_safety_guards_prevent_arbitrary_zero_conversion_without_history: 복원 정보 없는 원본 54 행 해제/대체 차단 및 원본 경비성(3) 임의 0 변환 차단 검증.
        • test_jc_bimog_multi_selection_atomic_and_json_roundtrip: 다중 선택 시 거부 행 발생 시 앞선 행 변경 롤백(원자성), SCheck=0 지정/해제 및 JSON 재열기 왕복 복원 검증.
        • test_set_cost_line_kind_action: 산출근거 행의 노무비(-1) 지정, 재료비(-2)의 일반 해제(0) 및 타 화면 안전 거부 검증.
      • pytest resources/tester/test_est_row_actions.py resources/tester/test_est_estimate.py resources/tester/test_est_business.py: 27 passed in 19.26s.
  • 데이터 사용위치 검색(popUsesSerch / TFRMUSESDATASERCH) 구현

    • 자체 검증:
      1. REA 스펙 근거:
        • REA TfrmUsesDataSerch (0x10d819c) 및 popUsesSerch(내역서, 일위대가, 단가산출, 기계경비 전역 팝업 메뉴) 기반 구현.
        • 임의의 품목 행(자재, 노임, 견적, 표준, 일위대가, 단가산출, 기계경비, 내역서)에서 데이터 사용위치 찾기 실행 지원.
      2. EstExtra.findDataUsages(project, target) 검색 엔진 구현:
        • 대상 항목의 Code(우선) 또는 정규화된 Name+Size를 기준으로 내역서(EstMainDat), 일위대가(HeadMainDat), 단가산출(CostMainDat), 기계경비(MachMainDat)의 참조 행을 전수 검색.
        • 대상 항목 자기 자신의 대표 행은 검색 결과에서 안전하게 제외.
        • 일위/단산/기계의 경우 상위 공종 코드(curGroup)를 함께 추적하여 위치 이동 시 정확한 묶음(state.group)으로 진입 지원.
      3. UI 연동 및 대화상자 이동 기능:
        • index.html 상단 툴바에 사용위치 버튼(data-action="uses-data-search") 및 편집 메뉴에 데이터 사용위치 찾기 추가.
        • EstExtra.showUsesSearchDialog(targetRow)를 통해 검색된 위치 목록(구분, 코드, 품명/산출근거, 규격, 단위, 수량, 금액) 표시.
        • 이동(goto-use-location) 클릭 시 대화상자를 닫고 대상 테이블(navigate), 대상 묶음 그룹(state.group), 페이지(state.page), 선택 행(state.selection)으로 즉시 포커스 이동.
      4. 700줄 제한 엄수:
        • native-extra.js: 554줄, native-business-actions.js: 685줄, native-views.js: 140줄, index.html: 210줄.
    • 관련 테스트:
      • pytest resources/tester/test_est_row_actions.py 통과 (test_uses_data_search_finds_usages_across_tables: 자재 M001의 일위/단산/내역 4건 검출 및 그룹 보존, 일위 U001의 내역 1건 검출, 이름 일치 항목 검출, 미사용 항목 0건 반환 검증 완료).
      • pytest resources/tester/test_est_row_actions.py resources/tester/test_est_estimate.py 6개 전수 통과 (0 실패).
  • 일위대가 공종 할증계산(TFRMHALJUNGBIUL) 및 자재단가 부가세계산(TFRMCONVERTTOGANGUB) 구현

    • 자체 검증:
      1. 일위대가 공종 할증계산 (TFRMHALJUNGBIUL):
        • REA TFRMHEAD의 DoHalJungClick (0xf5b7fc) 및 TFRMHALJUNGBIUL(명칭, 불러올비목, 적용율, 적용비목, 0xdb4b14) 근거 기반 구현.
        • native-haljung.js의 EstHalJung.apply(project, tableKey, groupCode, { name, size, rate, sourceKind, targetKind }):
          • 불러올비목(규격): 0=비목별, 1=재료비의, 2=노무비의, 3=경비의, 4=합계의 (OCheck).
          • 적용비목: 0=비목별, 1=재료비에, 2=노무비에, 3=경비에 (SCheck).
          • 비목 매핑 정확성 보장: sourceKind가 특정 비목(1=재료비, 2=노무비, 3=경비)이고 targetKind = 0(비목별)인 경우, 기본 경비(JC)로 왜곡되지 않고 해당 원천 비목(SCheck = sInfo.ocheck)으로 정확히 가산되도록 보정.
          • 묶음 내 소계(LinkIndex = 51, 68) 직전 위치에 LinkIndex = 58(비율) 행을 안전하게 자동 삽입하고 즉시 재계산 반영.
          • 0 또는 잘못된 할증율 및 존재하지 않는 공종/화면 요청 안전 거부.
        • UI 연동: native-views.js에서 일위대가 화면 활성화 시 할증계산 버튼(data-action="haljung-calc") 노출 및 대화상자 연동.
      2. 자재단가 부가세계산 (TFRMCONVERTTOGANGUB):
        • REA TFRMSTUFFC의 팝업 popChangeCost 및 TFRMCONVERTTOGANGUB(부가세포함/제외, 단단위계산, 0xf616f0) 근거 기반 구현.
        • native-vat.js의 EstVat.apply(project, indices, { calcMethod, diget, digetMethod }):
          • 계산방법: 0 = 부가세포함(×1.1), 1 = 부가세제외(÷1.1).
          • 단단위계산: 원단위 또는 지정 자리수(1=십원, 2=백원..) 이하에 대해 사사오입/절하/절상 단단위 처리.
          • 근거 불충분한 row.Kind 변경 기능 비활성화: REA 스펙상 StuffcDat에 Kind 필드가 소비되지 않으므로 혼선 방지를 위해 자재구분 변경 옵션 제거 및 안전 처리.
          • 선택 행 또는 전체 자재단가(Cost1~6, InputTC, TC) 일괄 변환 및 Undo 지원. ValueIndex별(최저/평균/최고/선택/직접) 단가 및 재계산 후 원본 단가 보존 검증 완료.
        • UI 연동: native-views.js에서 자재단가 화면(StuffcDat) 활성화 시 부가세계산 버튼(data-action="vat-calc") 노출 및 대화상자 연동.
      3. 700줄 제한 엄수:
        • native-haljung.js: 91줄, native-vat.js: 58줄, native-business-actions.js: 593줄, native-views.js: 140줄.
    • 관련 테스트:
      • pytest resources/tester/test_est_business.py 18개 통과 (test_haljung_calculation_apply_to_head_and_cost_groups, test_vat_calculation_exclude_include_and_unit_rounding_for_materials 검증 보강 통과).
      • 핵심 EST 테스트 45개 전수 통과 (0 실패).
  • 일위대가 공종 단위환산 계산(TFRMUNITECALC) 및 낙찰률 당초단가(100%) 복원(TFRMBIMOGBIUL/TFRMNACCHALAPPLY) 구현

    • 자체 검증:
      1. 일위대가 공종 단위환산 계산 (TFRMUNITECALC):
        • REA TFRMHEAD의 팝업/도구 버튼 popUniteCalc (단위환산 계산, 0xf59bd8) 및 TFRMUNITECALC(명칭, 규격, 수량, 단위) 근거 기반 구현.
        • native-business.js에 convertGroupUnit(project, groupCode, { name, size, factor, unit }) 함수 구현:
          • 선택한 일위대가 공종(묶음)의 제목 행(Index > 0)에 명칭(Name), 규격(Size), 단위(Unite) 적용.
          • 특수행 제외: 비율 행(LinkIndex=58, 62), 낙찰률 행(LinkIndex=52), 소계 행(LinkIndex=51, 68) 및 계산 안 함/고정금액 행(CalcIndex=1, 3)은 수량(GN) 배수 변경에서 안전하게 제외하여 백분율 왜곡 및 중복 팽창 방지.
          • 일반 비목 행의 수량(GN)에만 환산 계수(factor)를 부동소수점 곱으로 적용.
          • AutoCalc: false 등 프로젝트 옵션 보존 및 0 또는 유효하지 않은 계수 거부.
        • UI 연동: index.html 및 native-views.js에서 일위대가 화면(HeadMainDat) 활성화 시 단위환산 버튼(data-action="unit-calc") 자동 노출.
        • 대화상자(EstActions.form)를 통해 사용자 입력 접수 후 EstApp.change()로 트랜잭션 및 Undo 지원.
      2. 낙찰률 당초단가(100%) 복원 (TFRMBIMOGBIUL, TFRMNACCHALAPPLY):
        • REA btnUndo (Hint: "당초단가(100%)로 복원합니다.") 근거 구현.
        • native-business.js의 bid(project, rates):
          • 연속 낙찰률 적용 시에도 최초 단가와 최초 옵션을 잃지 않도록 row.PreBidRates가 이미 존재하면 덮어쓰지 않고 최초 단가 유지.
          • O${field}도 최초 단가(PreBidRates[field])를 기준으로 낙찰률을 계산하여 다회차 적용 시의 누적 왜곡 방지.
          • 원본 프로젝트의 SourceRefresh 설정값은 next.options._preBidSourceRefresh ??= project.options.SourceRefresh로 최초 1회만 보존.
        • restoreBid(project):
          • 원래의 SourceRefresh가 true이더라도 재계산 도중 원천 단가로 복원 단가가 다시 덮이지 않도록, SourceRefresh: false 상태로 복원 재계산 수행 후 마지막에 원래 사용자의 SourceRefresh 옵션 상태를 안전하게 복원.
          • PreBidRates 및 생성된 낙찰 단가를 복원하고, 원본 파일에 이미 존재하던 O* 필드(OTU/ONU/OGU/OJU/OSU)는 임의 삭제하지 않고 영구 보존.
          • 저장·재열기(JSON 왕복), 수동/자동 계산 모드, 원천 단가와 다른 초기 단가 상태에서도 최초 단가 100% 온전 복원 확인.
        • 설계변경 화면 도구 모음에 당초단가(100%) 복원(restore-bid) 버튼 연동.
      3. 700줄 제한 엄수:
        • native-business.js: 692줄, native-business-actions.js: 505줄, native-actions.js: 699줄, native-views.js: 136줄.
    • 관련 테스트:
      • pytest resources/tester/test_est_business.py 16개 통과 (test_unit_calc_group_conversion_preserves_percentages_subtotals_fixed_and_other_groups 포함).
      • pytest resources/tester/test_est_change_workflow.py 15개 통과 (test_bid_rates_consecutive_apply_source_refresh_and_roundtrip_restore 추가 통과).
      • 핵심 EST 테스트 43개 전수 통과 (0 실패).
  • 자료 오류 검색(issues) 및 불일치 데이터 확인: REA TFRMNAMESIZECHECK(명칭·규격·단위 불일치) 및 TFRMPERSENTCHECK(단위 백분율(%) 불일치 데이터 검색) 검출 구현

    • 자체 검증:
      1. REA TFRMNAMESIZECHECK(명칭 불일치 및 중복 데이타 확인) 근거 기반 검출 및 동기화 구현:
        • native-issues.js의 scan()에서 기존 품명(Name), 규격(Size) 비교에 더해 단위(Unite) 불일치(연결 단위 차이) 검출 로직 추가.
        • 원천 데이터(자재 StuffcDat, 노임 LaborcDat, 표준 SilJukDat, 견적 EstiMateDat, 일위 HeadMainDat, 단가 CostMainDat, 기계 MachMainDat)의 실제 명칭·규격·단위(sourceName, sourceSize, sourceUnite)를 이슈 항목에 보존.
        • UI 렌더링에 원천 실제 명칭 표시 및 원천명칭 반영/원천단위 반영 개별 버튼(data-issue-sync-row), 상단 도구 모음에 불일치 원천 명칭/규격 일괄 반영 버튼(data-issue-sync-all) 제공.
      2. REA TFRMPERSENTCHECK(단위 백분율(%) 불일치 데이터 검색) 근거 기반 검출 추가:
        • REA TFRMPERSENTCHECK ("위의 데이타는 백분율(%)로 계산되어야 할 항목들입니다(할증, 낙찰율, 제잡비, 조달수수료 등). 그러나 단위가 %가 아니기 때문에 백분율로 계산하지 않습니다. 확인하세요.") 근거 구현.
        • 일위대가(HeadMainDat), 내역서(EstMainDat), 기계경비(MachMainDat), 단가산출(CostMainDat)의 비목 상세 행 중 백분율 연산 특수행(LinkIndex = 52, 57, 58, 62, 67)인데 단위(Unite)가 % 또는 %가 아닌 항목을 검출(단위 백분율(%) 불일치).
      3. 불일치 필드별 안전 반영 및 단위 왜곡·규격 삭제 방지:
        • 단위(Unite)는 수량 및 단가 산식과 직결되므로 일괄 반영(sync-all) 대상에서 완전히 제외하고, 개별 행에서 명시적 승인(원천단위 반영) 시에만 처리하도록 분리.
        • 규격(Size)은 원천 규격이 비어 있지 않은 유효 문자열일 때만 반영하여, 빈 원천 규격으로 기존 내역 규격을 덮어써 지우는 현상 방지.
        • 품명(Name) 불일치는 품명만 원천 값으로 안전하게 동기화하고 기존 규격·단위를 보존.
        • 일괄 반영 범위는 전체 스캔 결과가 아니라 화면의 현재 필터 조건(tableFilter, typeFilter)에 해당하는 currentFiltered 항목만 대상으로 한정.
        • 반영 시 EstApp.change() 트랜잭션을 통해 실행 취소(Undo) 지원 및 데이터 무결성 보존.
      4. 700줄 제한 준수:
        • native-issues.js 372줄로 엄수.
    • 관련 테스트:
      • pytest resources/tester/test_est_issues.py 12개 통과 (test_data_issues_detect_percentage_unit_mismatch 추가).
      • 브라우저 Undo 복원 및 원천 단위/규격 안전 처리 검증 완료.
  • 인쇄 서식 옵션 검토 및 안전 조치: PrintApplyField(단가 0원 누락 위험 방지) 및 PrintSumBottom(공종/소계 중복 합산 및 단가 합산 왜곡 차단) 안전 처리

    • 자체 검증:
      1. 결함 분석 및 안전 조치:
        • PrintSumBottom: 표시되는 모든 행을 단순 누적할 경우 공종/소계와 상세 항목이 중복 합산되어 실제 공사금액의 2배 이상으로 뻥튀기되고, 단위가 다른 수량 및 단가(TU)를 합산하는 논리적 왜곡이 발생함.
        • PrintApplyField: REA의 적용 단가 필드 표시 의도를 '단가 0인 행 필터링'으로 오해하여 삭제할 경우, 공종 제목 및 정상적인 0원 항목·음수 정산 항목이 누락되는 중대 위험이 발생함.
        • REA 원문의 정확한 세부 집계/필터 알고리즘 근거가 불충분하므로, 서식 데이터의 왜곡 및 행 삭제를 즉시 차단하고 미지원 처리.
      2. 코드 정리 및 데이터 무결성 보존:
        • native-forms.js: PrintApplyField에 의한 행 삭제 필터 및 PrintSumBottom에 의한 단순 <tfoot> 합산 렌더링을 완전히 제거하고, 모든 공종(Level>0), 소계, 0원 항목, 음수 변경분 행이 원본 그대로 보존되도록 복원.
        • native-report.js: 불안정한 체크박스 UI 노출을 비활성화하고, 공람용 옵션 등 검증된 서식 기능만 안정적으로 제공.
        • 바이너리 레코드 오프셋(import-print.cjs / export-print.cjs)은 데이터 무결성을 위해 안전하게 0/1 값을 읽고 쓸 수 있도록 유지하되 잘못된 화면 처리를 차단.
      3. 700줄 제한 준수:
        • native-report.js 352줄, native-forms.js 445줄, export-print.cjs 67줄, import-print.cjs 75줄로 엄수.
    • 관련 테스트:
      • pytest resources/tester/test_est_documents.py 16개 통과 (test_print_apply_field_and_sum_bottom_preserve_all_rows_and_no_destructive_filtering 추가).
      • 전체 연계 회귀 시험 54개 전수 통과 (0 실패).
  • 공람용 서식(내역서 117, 내역서총괄표 118, 일위대가 115, 일위대가총괄표 116) 인쇄 옵션 및 공람방법(수량만/단가만/수량·단가) 렌더링 구현

    • 자체 검증:
      1. REA TFRMESTPRINTPRIVATE 및 DatPrintOption.opt의 PrintGongMethod 설정 연동:
        • 인쇄 미리보기(native-report.js) 서식 선택 시 공람용 서식(115, 116, 117, 118)에 대해 공람용 방법 셀렉트(PrintGongMethod: 0=수량만, 1=단가만, 2=수량·단가) 노출 및 설정 동기화.
      2. native-forms.js 열 정의 및 마스킹 로직 구현:
        • 공람용 내역서(117) 및 일위대가(115):
          • PrintGongMethod = 0(기본값, 수량만): 단가 및 금액 열(TU, TC, NC, GC, JC, SC / NU, GU, JU, SU, TC)을 숨기고 공통정보 및 수량(GN)만 인쇄.
          • PrintGongMethod = 1(단가만): 수량(GN)을 숨기고 단가 및 금액 열만 인쇄.
          • PrintGongMethod = 2(수량·단가): 수량과 단가/금액을 모두 인쇄.
        • 공람용 총괄표(116, 118): PrintGongMethod = 0 시 금액 비목을 제외하고 공통 레벨·공종 열만 안전하게 출력.
        • 일반 표준 서식(1, 2, 103, 106)은 변경 없이 기존 전체 열 출력 및 데이터 무결성 보존.
      3. 700줄 제한 준수:
        • native-report.js 342줄, native-forms.js 439줄로 엄수.
    • 관련 테스트:
      • pytest resources/tester/test_est_documents.py 15개 통과 (test_public_view_forms_print_gong_method_options 추가).
      • 전체 연계 회귀 시험 52개 전수 통과 (0 실패).
  • 계약심사(review) 화면 변경 행 필터링(전체/변경/사유작성/사유미작성) 및 심사 사유 일괄 적용 구현

    • 자체 검증:
      1. native-review.js 보기 필터(review-filter) 및 사유 일괄 적용(review-batch-reason) 신규 구현:
        • 계약심사 테이블 상단에 항목 필터 셀렉트(전체 항목, 변경 항목만, 사유 작성 항목, 사유 미작성 변경항목) 추가.
        • 대규모 내역서에서 수량/단가 변경이 발생한 항목이나 사유 작성이 누락된 변경 항목만 즉시 선별하여 검토할 수 있도록 개선.
        • 개별 행 선택 체크박스(reviewSelection) 및 일괄 사유 적용(data-review-batch-reason) 지원: 선택된 행들에 대해 공통 사유를 한 번에 입력·반영하며, 선택이 없는 경우 현재 화면에 표시된 필터링 대상 행 전부에 대해 일괄 반영.
        • 심사 입력 초기화(review-clear) 시 선택 세트도 함께 정리되도록 상태 무결성 보존.
        • 입력된 사유는 contractReview.edits[key].Reason으로 안전하게 저장되며, 실행 취소(Undo) 및 심사결과요약서(서식 171) 인쇄/엑셀 내보내기 연동 보존.
      2. 모델 및 계산 무결성 검증:
        • 기존 심사 수량/단가 계산기(EstReview.calculate)와 사본 열기(EstReview.copy) 로직은 변경 없이 100% 동일하게 유지.
      3. 700줄 제한 준수:
        • native-review.js 258줄로 700줄 이하 엄수.
    • 관련 테스트:
      • pytest resources/tester/test_est_review_workflow.py 8개 통과 (test_review_view_filtering_and_batch_reason_application 추가).
      • 전체 연계 회귀 시험 50개 전수 통과 (0 실패).
  • 자료 오류 검색(issues)의 원가계산서(Wonga) 산출식(VSusic) 참조 유효성 검사 및 실제 계산기(calculate) 의존성/값/오류 로직 단일화 구현

    • 자체 검증:
      1. native-wonga.js의 계산 엔진 로직 단일화(evaluateRows 공통화):
        • scan과 calculate가 별도의 파서/DFS/참조 로직을 갖지 않고, 동일한 evaluateRows 함수를 공유하여 전방 참조, 의존성 순서, 실제 재귀 계산, 범위(CalcIndex 2, 3 제외 행 필터링), 순환 참조 감지(active Set) 로직을 100% 동일하게 실행.
        • 저장된 Cost=0이어도 수식이 있는 선행 참조 행(예: B=A*2)의 실제 재귀 계산 결과를 평가에 사용하여, A=1/B와 같은 유효한 나눗셈이 오래된 0값으로 인해 0 나눗셈으로 오탐되는 결함 원천 해결.
        • 오류 발생 시(onError 콜백) scan은 해당 원인 행을 등록하고 기존 Cost로 대체하여 후속 행으로의 연쇄 전파를 방지.
      2. native-issues.js의 실제 프로젝트 기초금액(direct) 전달:
        • issues.scan(project) 호출 시 project.calculation.direct로부터 실제 NC, GC, JC, SC, TC, 노무비, 재료비, 경비, 실적, 직접공사비를 추출해 EstWonga.scan의 bases 인자로 전달하여 기초 비목 0 판정 및 오탐 방지.
      3. 700줄 제한 준수:
        • native-wonga.js 163줄, native-issues.js 274줄로 700줄 이하 엄수.
    • 관련 테스트:
      • pytest resources/tester/test_est_issues.py 9개 통과 (test_wonga_scan_parity_with_calculate_forward_refs_old_cost_bases_ranges_and_cycles 추가).
      • 전체 연계 회귀 시험 51개 전수 통과 (0 실패).
  • 자료 오류 검색(issues)의 단가산출(CostMainDat) 상세 행 연결 자료(자재·노임·기계 등) 부재 및 중복 검출 확장 구현

    • 자체 검증:
      1. native-issues.js의 scan() 테이블 검사 대상 확장:
        • 기존 검사 대상(EstMainDat, HeadMainDat, MachMainDat)에 CostMainDat를 추가하여, 단가산출 호표 상세 행에서 자재(LinkIndex: 5), 노임(LinkIndex: 6), 기계(LinkIndex: 105), 표준(LinkIndex: 21), 견적(LinkIndex: 101), 일위(LinkIndex: 103), 산근(LinkIndex: 104) 등 원천 자료를 참조하는 상세 행(Index === 0 && Code)에 대해 연결 자료 존재 여부(연결 자료 없음) 및 원천 코드 중복(연결 코드 중복)을 전수 검사하도록 개선.
        • 오류 항목 클릭 시 data-issue-table="CostMainDat"로 해당 호표(group) 및 상세 행으로 정확히 이동하고 선택 행을 하이라이트 표시하도록 연동 보존.
    • 관련 테스트:
      • pytest resources/tester/test_est_issues.py 5개 통과 (test_data_issues_detect_cost_main_dat_missing_and_duplicate_links 추가).
      • 전체 연계 회귀 시험 76개 전수 통과 (0 실패).
  • ESTX 내보내기 시 웹 전용 작업 데이터(예정공정표 schedule, 추가 서식 문서 documents) 누락 방지 및 기본 빈 상태 대조 차단 구현

    • 자체 검증:
      1. export-estx.cjs 및 import-estx.cjs 검토 및 수정:
        • import-estx.cjs에서 원본 ESTX 로드 시 기본 빈 공정표(schedule: [])를 명시적으로 초기화.
        • export-estx.cjs에서 원본 가져오기 기본 상태(schedule: [])와 대조하여, 유효 필드 유무와 무관하게 project.schedule?.length > 0 (빈 문자열·0값만 가진 행, 임의 필드 행 포함) 존재 시 공정 데이터 누락 방지를 위해 JSON 저장 안내와 함께 차단(웹 예정공정표는 ESTX에 저장할 수 없습니다. JSON 저장을 사용하세요.).
        • project.documents의 공백 문자열(" ") 역시 사용자가 입력한 내용으로 취급하여 text.length > 0 검사로 누락 없이 JSON 저장 안내와 함께 차단(웹 추가 서식 문서는 ESTX에 저장할 수 없습니다. JSON 저장을 사용하세요.).
        • 원본 ESTX에서 불러온 기본 빈 상태(빈 schedule [], 빈 documents {} 또는 미입력)에서는 정상적으로 ESTX 바이너리 패치가 통과되어 기존 기능 유지.
    • 관련 테스트:
      • pytest resources/tester/test_est_attachments.py 6개 통과 (일반 행, 빈 문자열/0값 행, 임의 필드 행, documents 공백 문자열 저장 차단 단위 검증).
      • pytest resources/tester/test_est_native_export.py 15개 통과 (test_estx_export_schedule_and_documents_safety_guards 실제 파일 기반 정상 패치 및 빈 행/0값/공백 문서 차단 실측 검증).
      • 전체 연계 회귀 시험 92개 통과 (0 실패).
  • 예정공정표(schedule) 공정 항목 상/하 순서 이동(schedule-move) 및 전체 비우기(schedule-clear) 조작 구현

    • 자체 검증:
      1. native-schedule.js에 공정 행 상/하 이동(moveRow) 및 전체 비우기(clearSchedule) 구현:
        • 연속된 공정 항목 배열(project.schedule)에 대해 인접 행과 위치를 맞교환하는 moveRow(project, index, direction) 지원.
        • 상단 경계(index === 0, direction === -1) 및 하단 경계(index === length - 1, direction === 1) 도달 시 비활성화(disabled) 및 배열 범위 침범 방지.
        • 공정표 상단 툴바에 공정 전체 비우기(data-action="schedule-clear") 버튼을 추가하고 확인 대화상자(confirm) 후 안전하게 초기화 지원(목록이 비어있으면 disabled).
        • 모든 조작은 EstApp.change(..., false)를 통해 수행되어 실행 취소(Undo)로 변경 전 공정 순서 및 데이터 완전 복원 가능.
      2. 모델 검증 및 계산 무결성:
        • 이동 후에도 EstSchedule.calculate(project)를 통해 left, width, weight, 가중평균 progress, 전체 시작일/종료일이 정상 재계산됨을 확인.
        • Excel 내보내기/불러오기(EstExchange) 및 JSON 작업본 저장 시 순서 유지 확인.
    • 관련 테스트:
      • pytest resources/tester/test_est_documents.py 14개 통과 (test_schedule_move_row_and_clear_operations 추가).
      • 전체 연계 회귀 시험 85개 전수 통과 (0 실패).
  • 동원인원·자재·장비 집계(resources) 화면 비목별(노임·자재·기계·표준·견적) 필터링 및 공종별 전개 조회 구현

    • 자체 검증:
      1. native-extra.js의 view === "resources" 렌더링 확장:
        • 전체 집계뿐만 아니라 비목 구분(노임 kind: 6, 자재 kind: 5, 기계 kind: 105, 표준 kind: 21, 견적 kind: 101, 전체 all) 필터 셀렉트(id="resource-kind-filter") 추가.
        • 내역 공종별 세부 소요 전개 체크박스(id="resource-by-work")를 추가하여, 체크 시 EstResources.calculate(project, true)를 호출해 공종코드(WorkCode) 및 공종명(WorkName) 열을 포함한 세부 전개 테이블 표시.
        • 필터링 결과 건수 표시((총 N건)) 및 오류 메시지 보존.
      2. native-business-actions.js 이벤트 연동:
        • resource-kind-filter change 시 state.resourceKind를 갱신하고 EstApp.render() 호출.
        • resource-by-work change 시 state.resourceByWork를 갱신하고 EstApp.render() 호출.
      3. 원천 서식(print-catalog.json) 및 EstForms.data 일치 확인:
        • 112(동원인원 공종별), 113(소요자재 공종별), 114(동원장비 공종별), 163(동원실적 공종별), 164(동원견적 공종별) 서식과 13(동원인원), 110(소요자재), 111(동원장비), 161(동원실적), 162(동원견적) 총괄 서식 간의 데이터 일관성 및 금액/수량 무결성 보존.
    • 관련 테스트:
      • pytest resources/tester/test_est_documents.py 13개 통과 (test_resource_view_filtering_and_by_work_expansion 추가 검증).
      • 전체 회귀 시험 69개 전수 통과 (0 실패).
  • 기계경비(MachMainDat ↔ MachTitleDat) 당초 계약 단가 비교·설계변경 조회 및 데이터 보호(적용 미지원) 구현

    • 자체 검증:
      1. native-machine.js 검토 및 수정:
        • REA f18804 기계경비 계산 엔진(EstMachine.calculate)과 MachTitleDat를 대조한 결과, 기계경비 호표 단가는 MachMainDat의 상세 산출 공식에 의해 결정되며, MachTitleDat의 TC_/NC_/GC_/JC_는 설계변경 비교를 위한 당초 계약값임.
        • 당초 계약값은 현재 기준단가의 근거가 아니므로, 현재 단가를 과거 계약값으로 덮어쓰는 파괴적인 개별/일괄 적용 UI를 비활성화(canApply: false, 적용 버튼 미노출).
        • 코드 호출 시에도 안전하게 예외를 발생(기계경비 호표는 MachMainDat 산출 결과이며 당초 계약값으로의 덮어쓰기 적용은 지원하지 않습니다.)시켜 사용자 데이터 오염 및 자동 재계산 충돌을 원천 차단.
        • 신규 항목(TC_ === null)에 대해 0으로 왜곡하지 않고 originalPrice: null, difference: null, status: "신규(당초없음)"으로 안전하게 분기 표시.
        • 화면 안내 문구에 기계 호표 단가는 MachMainDat 산출 공식에 의해 결정되며 당초값 덮어쓰기는 지원하지 않음을 명시.
      2. UI 및 서식 연동:
        • index.html, native-app.js, native-extra.js, native-report.js, native-model.js, native-forms.js 연동을 통해 사용 내역(machine-usage) 및 설계변경(machine-change)의 안전한 조회·인쇄 서식 지원.
    • 관련 테스트:
      • pytest resources/tester/test_est_basic_prices.py 5개 통과 (기계경비 당초/현재 비교, 신규 항목 TC_ null 안전 처리, 파괴적 apply 차단 및 데이터 불변 보존, Edge 브라우저 화면 조회 실측 검증).
      • 전체 연계 회귀 시험 56개 전수 통과 (0 실패).
  • 호표(일위대가·단가산출·기계경비) 상세 행 이동(move-estimate-up, move-estimate-down) 및 단가산출 다중 -20 구간·참조 수치 무결성 보존 구현

    • 자체 검증:
      1. native-business.js에 moveGroupDetailRows(rows, groupCode, selection, direction, table) 구현 및 산출근거 다중 구간/참조 수치 무결성 검증 보완:
        • 일위대가(HeadMainDat), 단가산출(CostMainDat), 기계경비(MachMainDat)의 호표 상세 행에 대해 연속 선택 행의 상/하 이동 지원.
        • 호표 제목 행(Index > 0) 이동 차단 및 제목 행 건너뛰기 방지.
        • 선택 행이 해당 호표 범위를 벗어나거나 인접 호표의 영역을 침범하지 않도록 상/하 경계 보호(경계 도달 시 이동 없이 원래 인덱스 보존).
        • 합계/소계/구간비율 행(LinkIndex 54, 55, 58, 59, 61, 62) 및 합계 수식표지(\x1a) 포함 행의 이동 및 건너뛸 수 없도록 안전 차단.
        • 다중 소계 구간 시작 표지(Index === -20)의 개별 보존 및 다중 선택 경계 보호: 이동에 참여한 국소 교환 위치 사이에서만 -20 표지를 정확히 교환하여, 호표 내 다른 소계 구간의 -20 표지(예: D0000000005의 다중 소계 구간)가 0으로 초기화되거나 왜곡되지 않고 완전히 유지되도록 수정. 선택 범위 내에 복수 -20이 포함되거나 범위 중간에 -20이 끼어 있어 단일 경계 스왑으로 보장할 수 없는 경우는 보수적으로 이동 차단.
        • 고유 식별자(rowKey) 매칭 및 앞줄 참조(\x0c) 수식/수치 불변 사전 검증(validateCostOrderIntegrity): PkID 유무와 관계없이 rowKey(row, index)를 통해 전수 매칭하여, PkID 누락 행에서도 정확한 전/후 대조 보장. 호표 최종 금액(rows[0].TC)뿐 아니라 각 소계(LinkIndex === 61)·비율(LinkIndex === 58) 행의 최종 금액, 그리고 앞줄 참조(\x0c)를 사용하는 모든 행의 LineData 수식 문자열이 완전히 동일하게 보존되는지 검증. 앞줄 참조(\x0c) 행이 포함된 복수 행 동시 이동은 안전한 구분을 위해 단일 행 이동으로 제한하고 차단.
        • 동일 결과값 선행 행 교환 시 뒤따르는 직전 결과 참조 대상 왜곡 방지 및 일반 행/변수 재정의 보수적 차단: 뒤따르는 행이 특정 선행 결과를 직전 참조(\x0c)하는 구간에서, 동일 비목과 동일 결과값을 가진 선행 후보 행들이 2개 이상 존재할 때 이들 간의 순서 교환은 참조 대상이 왜곡되므로 보수적으로 이동 차단(직전 결과를 참조하는 행이 뒤따라 참조 대상 구분이 불명확하므로 이동할 수 없습니다.). LinkIndex 58뿐 아니라 일반 행(LinkIndex !== 61)의 \x0c 앞줄 참조 역시 선행 후보 행이 2개 이상일 때의 순서 교환을 보수적으로 차단. 동일 변수명 중복 할당(변수 재정의) 구간에 포함된 행들의 교환 시 전역 변수 사전 순서 의존성 왜곡을 방지하기 위해 이동 차단(동일 변수(...)를 재정의하는 구간에서는 참조 대상 보존을 위해 이동할 수 없습니다.).
      2. native-business-actions.js 및 native-views.js 연동:
        • 툴바의 행 이동 버튼(move-estimate-up, move-estimate-down)이 내역서(EstMainDat)뿐 아니라 호표 화면(HeadMainDat, CostMainDat, MachMainDat)에서도 활성화되도록 노출.
        • 호표 화면 조작 시 moveGroupDetailRows를 호출하고 EstApp.change()를 통해 작업본 반영 및 실행 취소(Undo/Redo) 지원.
    • 관련 테스트:
      1. pytest resources/tester/test_est_change_workflow.py 13개 전수 통과:
        • 일위대가 상세 행 이동 및 Edge 실측 시험.
        • 단가산출(CostMainDat)의 실제 사례(D0000000004 인부소계 구간)에서 상세 행 이동 후 소계(14,373.6) 및 호표 총액(16,421) 완벽 보존 검증.
        • 다중 -20 구간을 가진 실제 사례(D0000000005)에서 상세 행 이동 후에도 -20 표지 2개 및 1차 소계(1,383.4), 2차 소계(1,407.8)가 모두 보존됨을 검증.
        • A/B 동일값 선행 행 교환 시 직전 결과 참조 대상 왜곡 재현 및 보수적 차단 검증.
        • LinkIndex 58 이외 일반 행의 \x0c 앞줄 참조 모호성 차단 검증.
        • 동일 변수(W) 재정의 구간 행 교환 보수적 차단 검증.
        • 소계 행(LinkIndex 61), 비율 행(LinkIndex 58), 변수 산식 행(D0000000000의 Q식), 소계 수치가 왜곡되는 구간 침범 이동, 범위 중간에 -20이 포함된 이동, 앞줄 참조 복수 행 이동의 안전 차단 검증.
        • Edge 브라우저에서 단가산출 상세 행 이동, 소계 보존 및 실행 취소(Undo) 원복 실측 검증.
      2. 원본 ESTX 무결성 보호 시험 14개 통과 (pytest resources/tester/test_est_native_export.py).
      3. 핵심 비즈니스 및 가격 회귀 시험 28개 통과 (test_est_basic_prices.py, test_est_standard.py, test_est_estimate.py, test_est_business.py).
      4. 주 수량 회귀 시험 12개 통과 (test_est_quantity_workflow.py).
  • 자재단가(StuffcDat) 및 노임단가(LaborcDat) 사용 내역 화면과 기초단가 개별/일괄 적용 구현

    • 자체 검증: ative-basic-prices.js를 신규 구현하여 자재단가(LinkIndex === 5) 및 노임단가(LinkIndex === 6)를 원천(StuffcDat, LaborcDat)과 비교하는 사용 내역(material-usage, labor-usage) 및 설계변경(material-change, labor-change) 화면 제공.
      1. 자재는 GU, 노임은 NU 비목으로 원천 기초단가 반영 및 SCheck > 0 재분류 비목 보존.
      2. 수동계산(AutoCalc = false) 시 원천 단가·비목은 변경하되 해당 행의 기존 금액(GC, NC, TC)을 강제 계산하지 않고 보존하며, AutoCalc=true 전환/재계산 시 수량(GN)을 반영해 전체 전파되도록 규칙 일치.
      3. 화면 네비게이션, 인쇄 서식, 모델 검증 등록 및 EstApp.change() 연동 Undo/Redo 지원.
    • 관련 테스트: pytest resources/tester/test_est_basic_prices.py 4개 통과(단위 시험 및 Edge 브라우저 자재/노임 단가 적용, Undo 원복 검증).
  • 견적단가 사용 내역 화면(estimate-usage) 및 기초단가(EstiMateDat) 개별/일괄 적용 구현

    • 자체 검증: ative-estimate.js를 신규 작성하여 견적단가 원천(EstiMateDat, LinkIndex === 101)과 내역 행 간 단가 비교(usage), 차이 검출, 개별 적용(pplyRowPrice), 일괄 적용(pplyAllPrices) 구현.
      1. 원천 비목 보존: 원천 비목 분할(InputGC, InputNC, InputJC) 유지 및 SCheck > 0 재분류 비목 보존.
      2. 수동계산(AutoCalc = false) 시 원천 단가·비목은 변경하되 해당 행의 기존 금액을 보존하고, AutoCalc=true 전환/재계산 시 수량(GN)을 반영해 갱신되도록 수동계산 규칙 일치.
      3. 화면 네비게이션, 인쇄 서식(estimate-usage, estimate-change), 모델 검증 등록 및 EstApp.change() 연동 Undo/Redo 지원.
    • 관련 테스트: pytest resources/tester/test_est_estimate.py 4개 통과(단위 시험 및 Edge 브라우저 개별/일괄 적용, Undo 원복 검증).
  • 표준시장단가 사용 내역 화면에서 개별 및 일괄 기초단가 내역 적용·실행 취소 구현

    • 자체 검증: ative-standard.js에 표준시장단가 원천(SilJukDat)과 내역 행(EstMainDat, LinkIndex === 21) 간 단가 차이가 있는 항목을 선별(canApply)하고, 개별 행 단위 적용(pplyRowPrice, data-standard-apply-row) 및 전체 차이 항목 일괄 적용(pplyAllPrices, data-standard-apply-all) 기능을 구현.
      1. 적용 시 원천 자료의 고유성 검증: 원천 코드가 없거나 중복된 경우 임의 적용을 차단하고 예외 메시지 출력.
      2. 원천 비목 보존 및 계산 규칙 일치:
        • 원천(SilJukDat)이 재료/노무/경비/실적 비목 분할(InputGC, InputNC, InputJC, InputSC)을 제공할 경우 이를 그대로 단가 비목(GU, NU, JU, SU)으로 반영.
        • 사용자가 설정한 비목 재분류(SCheck > 0: 재료/노무/경비 몰아주기)가 있을 경우 이를 임의로 해제하지 않고 해당 대상 비목으로 기초 단가 총액을 보존.
        • 수동계산(AutoCalc = false) 상태에서는 기존 내역 편집 및 est_estimate_classification_refreshes_only_selected_source_and_preserves_manual_mode 규칙과 일치하도록, 원천 단가 및 비목 분할은 반영하되 해당 행의 기존 금액(GC, NC, JC, SC, TC)을 강제 계산하지 않고 보존. 이후 AutoCalc=true로 전환하거나 재계산을 실행할 때 수량(GN)을 반영한 정식 금액으로 전파.
      3. 화면 상단 툴바에 적용 대상 건수(기초단가 일괄 적용 (N건))를 표시하고 대상이 없으면 비활성화(disabled).
      4. 작업본 반영은 EstApp.change()를 통해 이루어지므로 실행 취소(Undo)로 변경 전 단가 및 금액을 단계별로 완전 복원 가능.
    • 관련 테스트: pytest resources/tester/test_est_standard.py 5개 통과(수동계산 AutoCalc=false 보존 및 재계산 전환, 단위 시험 및 Edge 브라우저 개별/일괄 적용, Undo 원복, 비목 분할 보존, SCheck 보존 등), 연계 회귀 39개 통과.
  • 수량산출 항목 단위(Unite) 편집 및 Title 테이블 메모 필드 보존을 통한 ESTX 저장·재열기

    • 자체 검증: native-quantity.cjs 수량산출 화면에 단위(Unite) 편집 열 추가 및 export-quantity.cjs의 withoutLabels에 Unite 라벨 변경 차단 방지 반영. native-engine.js의 saveTitles()에서 CostTitleDat·HeadTitleDat·MachTitleDat의 식별자(PkID, Index, RecNo, Flag)뿐만 아니라 BLOB/메모 필드(DifineMemo, SpaceMemo, EscData)를 원본 Title 행 기준으로 보존(기존 Title에 없을 시 Main 값이 오염 생성되지 않도록 필터링).
    • 브라우저 검증: 임시 서버(127.0.0.1:5186)와 Edge에서 설치 main.estx를 열어 수량 항목 단위를 m2로 변경 후 ESTX 내보내기/다운로드, 브라우저 재열기 및 다른 수량 항목 보존·실행 취소 확인. (대용량 프로젝트 약 164MB에 따른 브라우저 임시 저장 용량 부족 경고 확인).
    • 관련 테스트: pytest resources/tester/test_est_quantity_workflow.py 12개 통과, 기존 test_est_native_export.py 14개는 수정 전 기반 통과 상태이며 이번 Title 보존 전용 시험(test_recalculation_and_native_export_keep_original_title_identities_when_sample_exists) 1개 통과(58.08s, 인덱스 .idx 동일성 및 단위 m2 보존).
    • 남은 제한: 원본 EST와의 실행 동등성은 미확인.
  • 수량산출서 항목 추가·삭제 및 내역 연결·JSON 저장/재열기 지원

    • 자체 검증: native-quantity.cjs의 수량산출 화면에 수량 항목 추가(data-quantity-add-item) 및 각 수량 항목 행에 삭제(data-quantity-delete-item) 버튼을 구현.
      1. 항목 추가 시 기존 항목 코드(r000000, r000001 ...)와 중복되지 않는 새 고유 코드 자동 생성(r######), 품명/규격/단위/수량 초기화 및 EstApp.change() 등록.
      2. 항목 삭제 시 안전성 보장: 산출 행의 산출근거(LineData) 결과 표지(\x12...\x12) 및 row.markers에서 참조 중인 항목은 산출 행 결과 표지 수와 마커 수 불일치로 인한 계산 오류를 방지하기 위해 임의 삭제를 차단하고 사전 안내 메시지 출력. 미참조 항목에 대해서만 확인(confirm)을 거쳐 안전하게 삭제.
      3. 품명·규격·단위 및 연결 내역 대상 지정(TargetKey / TargetCode) 후 JSON 작업본 저장 및 재열기 지원.
      4. ESTX 바이너리로 표현 불가능한 임의 행 구조 변경(신규 산출서/항목 증감)에 대해서는 기존 ESTX 저장 시의 불변 무결성 보호를 유지하고 JSON 보관 안내.
    • 관련 테스트: pytest resources/tester/test_est_quantity_workflow.py 12개 통과 (신규 항목 추가, 참조 중인 항목 삭제 차단 안내 및 미참조 항목 안전 삭제 단위 시험 반영).
  • 자료 오류 검색의 수량산출 항목 내역 대상 연결 검사, 해당 산출서 이동 및 검색 화면 내역 연결 지정

    • 자체 검증: native-issues.js의 scan() 함수를 실제 수량 적용(totals()) 규칙과 정확히 일치하도록 개편:
      1. TargetKey 우선 매칭(id:${row.PkID}): 두 행의 코드가 동일해도 TargetKey로 고유하게 연결된 경우 정상 판정하여 오탐 방지. 잘못된 키는 수량 대상 내역 없음으로 탐지.
      2. TargetKey가 없을 시 TargetCode ?? LinkCode 대체값으로 매칭하며, Level > 0인 공종/비고 행 제외 규칙 일치.
      3. 수량산출서(quantitySheets) 및 수식표 직접 작성(quantities) 항목 모두 검사하며 미연결/대상 부재 항목을 unlinked로 추출.
      4. 오류 검색 화면에서 수량산출 오류 항목에 대해 산출서 열기 버튼을 제공하여, 클릭 시 quantity 뷰 및 해당 quantitySheet 코드로 즉시 전환·선택되도록 구현.
      5. 자료 오류 검색 화면에서 미연결 또는 대상 부재인 수량 항목에 대해 바로 내역 행을 선택할 수 있는 드롭다운(data-issue-target-select)을 제공하여, 오류 검색 화면을 벗어나지 않고도 TargetKey(id:${row.PkID}) 및 TargetCode를 즉시 지정하고 EstApp.change()를 통해 JSON 작업본에 즉시 반영 및 실행 취소 가능하도록 구현.
      6. native-links.cjs의 existingTargets()에서 고유한 PkID가 존재할 때만 TargetKey(id:${row.PkID})로 안전하게 연결하고, PkID가 없는 동일 코드 행 간의 모호한 연결은 기존대로 미연결 유지 및 경고 처리 보존.
    • 관련 테스트: pytest resources/tester/test_est_native_export.py::test_existing_quantity_links_respect_native_mode_and_avoid_ambiguous_targets resources/tester/test_est_issues.py 5개 통과, test_est_quantity_workflow.py 12개 통과. Edge 브라우저 '산출서 열기' 클릭 시 수량산출서 전환 이동 및 오류 화면 내역 연결 드롭다운 선택 시 작업본(TargetKey) 즉시 연결 실측 확인.
  • 테일스케일 전용 독립 서버 감시 프로세스(watch-server.cjs) 및 대용량 IndexedDB 캐시 복원

    • 자체 검증: server.cjs의 외부 바인딩을 EST_TEST_HOST=100.65.141.15:5175로 한정(127.0.0.1 접속 시 ECONNREFUSED 차단 확인). Node 내장 --watch 기반 감시 프로세스(watch-server.cjs)를 구현해 data/ 및 로그를 제외한 .js·.cjs 소스 변경 시에만 자동 재기동되도록 구성(파일 touch 시 자동 재기동 및 헬스 200 확인). server.cjs를 require하는 테스트 실행 시 watcher hang 없음 확인(test_est_quantity_workflow.py 12개 2.69s 통과).
    • 대용량 임시 저장 보완: native-app.js에서 sessionStorage(약 5~10MB) 용량 초과 시 IndexedDB(est-independent-cache)로 자동 대체 저장·복원하도록 개선하여, 대용량(main.estx 약 157MB JSON) 작업 시 새로고침 유실 문제를 해결함. IndexedDB 트랜잭션 waitForTx(tx) 대기 및 순차 직렬화 큐(cacheQueue)를 적용해 연속 입력 시 덮어쓰기 레이스 컨디션을 방지하고, 탭별 고유 인스턴스 ID(sessionStorage의 est-tab-instance-id) 및 Chromium 탭 복제 시 window.name 리셋 감지를 적용해 복제 탭(Duplicate tab) 분리 격리 및 부모 작업본 초기 상속을 구현함. 실제 headless Edge 기반 Playwright 회귀(resources/tester/test_est_browser_cache.py)로 소형 데이터 격리, 대용량 main.estx(22MB 바이너리, 157MB JSON) 업로드 후 이름 수정→IndexedDB 저장→새로고침 복원(76개 전체 내역행 유지), 캐시 실패 안내 메시지 검증 및 탭 복제(Duplicate Tab) 상속·독립 격리 시험 통과(3 passed in 13.04s).
    • 백그라운드 상태 감시 및 자동 알림: tools/est-test/monitor.cjs를 통해 15초 주기로 orca.exe CLI(shell: false, timeout 4~5s)를 호출하여 CODEX 워크트리의 안티그래비티 작업 상태와 EST 5175 서버 헬스를 조회하고, 상태 변경 시에만 monitor.log에 기록(최대 512KB 순환). 안티그래비티 완료/대기 전이 시 Codex Orchestration Run(run_cdb1558b9280)으로 단발성 자동 알림(status/messageId=msg_2c7bca748f91)이 실제 전달됨을 확인(중복 폭주 방지 플래그 적용, 민감 환경변수 미기록, 재시작/자동지시 없음).

Codex · EST 독립 테스트 앱 (2026-11-04)

  • 원본 메뉴·단추 대조(CAD 제외 약 880개)에서 나온 핵심 미구현 처리. 대조표 = 작업 폴더 tmp/est-audit/gap_*.md.

    • 처리기만 있고 단추가 없던 동작 4개 연결 — 레벨 일괄 증가·감소(LEVEL 메뉴), 원가계산서 초기화(원가계산서 메뉴), 설계변경 초기화(설계변경 화면). 처리기마다 단추가 있는지 보는 지킴 시험 test_est_action_bindings.py 추가.
      • 검증완료: 옛 코드에서 시험 실패(4개 검출)·새 코드 통과, test_est_row_actions.py 포함 16개 통과. ORCA 브라우저에서 두 행 레벨 2→3→2 왕복·되돌리기 복원, 원가 초기화 확인창, 당초 없음 차단 문구 확인.
    • 단가 고르기(원본 TFRMSERCHPROJECT·TFRMDBLCLICKRTN) — 내역서·일위대가에서 7종 자료 검색·여러 개 선택·선택 행 아래 넣기, 선택 행 연결 바꾸기(변경 전후 확인·같은 코드 전체 변경). 넣거나 바꾼 행만 원천 단가 재조회, 실패 시 되돌림. 자기 일위대가 순환·제목·요율 행 차단.
      • 검증완료: test_est_pick.py 5개 통과(검색·넣기·단가 반영·바꾸기·차단·일위대가 경로). ORCA 브라우저에서 보통인부 넣기 → 노무단가 172,068 반영, 경유로 바꾸기 → 재료단가 1,376 반영, 되돌리기 2회로 76행·도급액 79,603,000 복원.
      • 남음: 단가산출 산출근거(LineData) 행 넣기, 원본 「Main값우선」 선택, 기계경비 상세 행.
    • 수량 항목 끝수 처리(원본 TFRMMULLANG mnuAuto·mnuTrunc·mnuUp·mnuRound 0~5) — 결과 코드 뒤 방식+자리수(1 반올림·2 절사·3 올림)로 항목·결과 표지 함께 바꿈, 중복 코드 거부. 새 항목 코드가 끝수 붙은 코드의 앞 7자리와 겹치던 오류 수정. ESTX 수정 저장은 명확한 문구로 거부. 연결 내역코드 칸의 선택 상자가 옆 칸을 덮던 배치 수정.
      • 검증완료: test_est_quantity_format.py 4개(1.2345 → AUTO 1.23·올림1 1.3·반올림3 1.235·AUTO 복귀, 거부 3종, 코드 생성, 설치 main.estx 저장 거부 문구), 수량·ESTX 저장 시험 포함 50개 통과. ORCA 브라우저에서 선택 상자로 올림 1자리 → 재계산 1.3·코드 r00000031 확인, 샘플 다시 열어 원상 복구.
      • 남음: 끝수 변경의 ESTX 저장(원본 항목 코드 키 변경 — 인덱스 재생성 필요).
    • 찾기 창(원본 TFRMESTSERCH·TFRMCOSTWORDCHANGE) — 검색어·처음부터/현재위치부터·다음찾기로 행 이동(호표 자동 전환·쪽 이동), 단가산출 한 건씩 바꾸기 후 다음 위치, Ctrl+F. 이전 값(*_) 필드는 찾지 않음.
      • 검증완료: test_est_find.py 3개, 단추·단가 고르기·행 동작 포함 24개 통과. ORCA 브라우저에서 Ctrl+F로 창 열기, 내역 「합판거푸집」 8·15·22·26행 순서 이동, 단가산출 마지막 호표 행 찾기(호표 D0000000006 전환·선택 표시), 바꾸기 후 다음 위치(323행)·되돌리기 원상 확인.
      • 남음: 통합검색(TFRMMULTISERCH — 다른 공사·폴더 자료 검색).
    • 공내역 파일로 저장(원본 mnuFileNullSaveClick 0x10cdc44 → 0x113cf38) — 디스어셈블 근거: EstMainDat·HeadTitleDat·HeadMainDat의 TC·NC·GC·JC·SC 비움, PrintGongMethod 0 = TU~SU 비움·1 = GN 비움·2 = 금액만. 웹 사본은 자동계산 끔·원가 금액 비움(원본 WongaDat 처리는 미확인). JSON 또는 원본 구조 ESTX로 내려받기.
      • 검증완료: test_est_blank.py 2개(세 방법·원본 불변·잘못된 방법 거부, 설치 sample.estx 공내역 ESTX 저장·재읽기에서 수량 유지·단가·금액 0·기초자료 유지), 관련 11개 통과. ORCA 브라우저에서 메뉴 → 수량만 남김 → JSON 내려받기(GN 133·TU 0·TC 0), 현재 작업 불변, 사본을 열어 합계 0 유지 확인 후 샘플 복구.
    • 수량산출서 복사·순서(원본 TFRMMULLANG 공종복사·붙여넣기) — 현재 산출서 아래에 복사(새 코드·내역 연결 비움), 위로·아래로. 순서 변경 ESTX 저장은 명확한 문구로 거부. 단추 지킴 시험이 .cjs 화면 파일도 보도록 넓힘.
      • 검증완료: test_est_quantity_sheets.py 3개(복사 위치·코드·연결 비움·원본 불변, 끝에서 멈춤, 설치 main.estx 순서 변경 저장 거부), 수량 관련 23개 통과. ORCA 브라우저에서 토공 복사 → 「토공 복사본」 선택·연결 빈칸, 아래로 → 토공·포장·복사본 순서 확인 후 샘플 복구.
    • 산출 줄 수량 지정·해제(원본 TFRMMULWORD popSetMulLang·popSetFree) — 드래그한 숫자를 결과 표지로 감싸 새 항목(품명·규격·단위 표지 옮김), 커서 위치 결과 해제·미사용 항목 삭제, 내역 연결 항목 해제 거부. 이 편집은 ESTX 저장을 명확한 문구로 거부(이전에는 「행 삭제」로 잘못 안내).
      • 검증완료: test_est_quantity_sheets.py 5개(지정 위치·항목·계산 6, 중복·숫자 아님 거부, 해제 원상, 연결 항목 거부, 설치 main.estx 해제 후 저장 거부 문구), 수량 관련 25개 통과. ORCA 브라우저에서 「= 3」 드래그 → 수량 지정 → r000001 잔토처리 ㎥ 3, 커서 두고 지정 해제 → 원래 줄·항목 복귀, 샘플 복구.
    • Excel 내역 열 맞춰 가져오기(원본 TFRMEXCELTOEST 내역서 탭 — tvViewEst 열 Code·Pr·Name·Size·GN·Unite·TU·TC·NU·NC·GU·GC·JU·JC·Bigo) — 시트·시작행·끝행·항목별 열 문자, 미리보기, 순공사비 위 추가·바꾸기. 단위·수량 없는 줄 = 공종 제목(Level 1), 금액은 다시 계산, 수식 셀은 저장된 계산값. 합계단가만 있는 줄은 비목 임의 배분 없이 거부.
      • 검증완료: test_est_excel_map.py 3개(열 문자·쉼표 숫자·빈 줄·잘못된 입력, 제목·상세 구분·PkID 중복 없음·순공사비 위 배치·금액 계산, 합계단가만 거부·바꾸기 모드), 관련 9개 통과. ORCA 브라우저에서 openpyxl로 만든 수식 포함 xlsx를 서버로 읽어 시트 2개 표시·미리보기, 5행(제목 2) 가져오기 → 순공사비 45,293,066 → 61,798,566 확인 후 샘플 복구.
      • 남음: 일위대가·단가산출·표준·견적·자재·노임 탭, 원본 「셀부호 밀기·당기기」.
    • 연결 자료와 함께 복사·붙여넣기(원본 TFRMOTHERLOAD) — 내역 행의 자재·노임·실적·견적 행과 일위대가·단가산출·기계경비 호표를 하위까지 모아 다른 공사에 붙여넣기. 같은 코드는 붙여넣을 공사 자료 유지(덮어쓰지 않음), 기계경비 적용기준은 붙여넣을 공사에 없을 때만 옮김.
      • 검증완료: test_est_transfer.py 2개(빈 공사로 옮겨 연결 오류 0·금액 동일·하위 기계경비 호표 포함·PkID 중복 없음, 같은 코드·적용기준 덮어쓰지 않음), 관련 시험 통과. ORCA 브라우저에서 샘플 내역 3행 복사 → 새 내역 붙여넣기 → 연결 자료 12건 추가·금액 1,285,046·417,024·680,414 원본과 동일·계산 오류 0, 샘플 복구.
      • 남음: 두 공사 나란히 보기.
    • 프로젝트 추가(원본 mnuFileLoadProjectAs) — 다른 공사 파일(ESTX·JSON)의 순공사비 위 내역 전체를 하위 자료와 함께 이 공사 순공사비 위에 합침. 같은 코드 자료 유지.
      • 검증완료: test_est_transfer.py 3개 통과(합친 뒤 순공사비 2배·계산 오류 0·빈 공사 거부). ORCA 브라우저에서 메뉴 확인, 샘플에 샘플 합치기 → 35행·같은 코드 46건 유지·순공사비 45,293,066 → 90,586,132, 샘플 복구. 파일 고르기 창 자체는 자동 조작 불가로 기존 가져오기 경로(/api/import)를 그대로 씀.
    • 낙찰률 적용 범위(원본 TFRMBIMOGBIUL 내역서낙찰·공종별) — 전체낙찰율/비목별, 전체·선택한 줄·선택한 공종 하위, 낙찰 적용된 줄 제외. 기존 계산(EstBusiness.bid)에 행 묶음 지정만 더함. 편집 메뉴에 낙찰률 적용·당초단가 복원.
      • 검증완료: test_est_bid.py 2개(공종 하위만 변경·밖 불변, 적용된 줄 제외·빈 선택·제목 없음·음수 거부), 낙찰 관련 업무·설계변경 시험 포함 41개 통과. ORCA 브라우저에서 「구조물공」 선택 → 전체 80% 공종별 → 하위 4줄만 변경·순공사비 45,293,066 → 42,598,790, 되돌리기 원상.
      • 남음: 근거자료낙찰 탭(공종별 낙찰율 목록), 「연금·건강보험료·안전관리비 고정」.
    • 예정공정표 눈금 단위(원본 TFRMSCHEDULE mnu1Day·5Day·10Day·15Day·20Day·1Week·1Month) — 기간 칸 머리에 눈금 날짜, 막대 뒤 눈금선, 60개 초과 시 앞 60개.
      • 검증완료: test_est_schedule_scale.py(1주·1개월·10일 눈금 위치·날짜, 60개 자르기, 빈 기간, 잘못된 단위 거부) 통과. ORCA 브라우저에서 1개월 → 1주 전환 시 머리 날짜 03-01·03-08… 11개, 글자 간격 47px 이상 확인 후 샘플 복구.
    • 원가계산서 사용자 양식(원본 TFRMWONGABASE popupSaveAs·popupFormats·popupLoadFrom, TFRMFORMATFILELIST 등록·삭제·열기·파일) — 서버 보관함 data/forms.json(forms-store.cjs, 종류 wonga·document), 등록·목록·열기·삭제·파일 내려받기/불러오기. 금액 제외, 열 때 도급액 고정 해제(저장 금액을 쓰는 옵션이라 금액 없는 양식에서 0이 됨을 확인).
      • 검증완료: test_est_forms_library.py 2개(등록·같은 이름 교체·목록·삭제·잘못된 종류/이름/내용 거부, 금액 제외·잘못된 행 거부·다른 동작 무시) 통과. ORCA 브라우저에서 등록 → 목록 31행 → 원가 표를 3행으로 줄인 뒤 열기 → 31행 복구·도급액 79,603,324(고정 해제) → 삭제·보관함 비움, 샘플 복구.
      • 남음: 기본양식으로 저장(새 공사 기본값), 갑지·표지 문서 양식.
    • 정산원가계산서(원본 popJunSangCalc 0xd0eb28→0xd0f6fc, popJungSangShow 0xd0ea24, 재계산 0xca31c8 — 디스어셈블 근거) — 당초금액 초기화(SC := Cost, 55 → 0, JungSangInit), 작성/해제 토글(JungSangShow), 차액 행(LinkIndex 66, (감)/(증)) 재계산마다 갱신, 원가 화면 당초금액·정산금액 열. 엔진은 66 행 수식을 계산하지 않음.
      • 검증완료: test_est_jungsang.py 2개(차액 글자·빈 행 재사용, 당초 복사·55 해제·재계산 차액·해제 시 66 비움·SC 유지·열 순서), 대조·업무 시험 포함 통과. ORCA 브라우저에서 작성 → 열 「당초금액, 정산금액」·차액 (증)324(도급액 고정 해제분)·오류 0, 해제 → 「원가금액」 복귀, 샘플 복구.
      • 남음: 당초분·정산분 색상 옵션.
    • 무관자료 삭제(원본 mnuNotLinkDelete·DelSort → f039f0, MulDelete → 1116db0 — 디스어셈블 근거) — 내역서에서 LinkIndex 5·6·21·101·103·104·105·Code(설계변경 Code_ 포함)로 하위까지 따라가 쓰는 자료만 남김, 묶음 머리 앞 빈 줄 정리, 내역서순 재배열(코드 유지), 내역 미연결 수량산출서 삭제. 원본의 한 번 훑기 누락(기계경비 안에서만 쓰인 일위대가 하위)은 웹에서 끝까지 따라가 막음. LinkIndex 211–218 코드 비우기는 뜻 미확인으로 하지 않음.
      • 검증완료: test_est_cleanup.py 3개(안 쓰는 자재·일위 삭제·합계 불변·오류 0, 내역서순 순서·코드 유지, 빈 줄·수량산출서) 통과. 설치 main·sample·산림토목 ESTX에서 정리 전후 도급액·오류 수 같음. ORCA 브라우저에서 내역서순 정리 → 자재 30 → 17·도급액 79,603,000 유지·되살리기 복원.
    • 품명정리·자재/견적단가 등록(원본 ActionNameDeivde 0xf5a2b4·TfrmNameDevide 0xf595c0/0xf59640, popMainStuffcReg/EstimateReg → c_f00264/c_f00670 — 디스어셈블 근거) — 커서 자리 나누기·삭제할 칸·빈 단위만 채움·호표 목록 동기화, 등록 시 같은 품명·규격 거부·호표 거부·M/W+PkID 10자리 코드·자재 Cost1=TC=재료단가·견적 NC/GC/JC·원래 행 연결. 원본은 품명정리를 2개 이상 선택 때만 돌리나 웹은 1개도 허용.
      • 검증완료: test_est_name_reg.py 2개(나누기·삭제할 칸·제목 동기화·호표 아님 거부, 자재/견적 등록 코드·가격·연결·금액 불변·중복/호표 거부·계산 오류 0) 통과. ORCA 브라우저에서 내역 행 자재 등록 → M0000000038·연결 5, 일위대가 「레미콘타설(…)」 3자리 나누기 → 품명 「레미콘」·규격 「타설(인력운반타설)철근구조물」, 샘플 복구.
    • 정렬·데이타 위치정리·호표 정리·근거(메모)(원본 BarSort 0x110ADEC·TfrmSiljukSort, mnuTableSort 0x10CCAEC·TFRMTABLESORT, popTitleSort 0x10D88EC, mnuGunguEdit/Del·DifineMemo — 디스어셈블 근거) — 관급구분별 가나다·Index 재번호·빈 행 제외(30줄 채우기는 안 함), 품명 오름/내림·시작번호·묶음 통째 이동, 번호만 재매김·제목표 동기화, 메모 WPTools 글자 읽기 전용 보기·삭제. 원본 위치정리 콤보 글자 뒤바뀜은 웹에서 실제 순서대로 표기.
      • 검증완료: test_est_tidy.py 2개(관급구분·빈 행·실적 코드 정렬·화면 거부, 위치정리·번호정렬·제목 동기화·도급액 불변·오류 0) 통과. ORCA 브라우저에서 설치 main.estx 메모를 넣어 보기 → 「2015년 건설표준품셈 … 잔디블록」 글자 표시, 삭제 → null, 자재 정렬 → 빈 행 12개 제외, 샘플 복구.
      • 남음: 메모 편집(원본 서식 저장), 위치정리 드래그 이동.
    • 통합 검색(원본 TFRMMULTISERCH 자료 7종·검색어·검색위치) — 검색위치는 이 앱 저장 작업(search-store.cjs, /api/search), 고른 자료를 하위 연결째 현재 공사로 가져옴(EstTransfer). 원본 「Main Data에서 검색」·폴더 고르기는 웹 서버에 원본 자료 폴더가 없어 저장 작업으로 대신함.
      • 검증완료: test_est_multi_search.py(낱말 모두 포함·자료 종류·제외 작업·깨진 파일 무시·빈 검색어/종류 거부) 통과. ORCA 브라우저에서 저장 작업 59개 대상 「콘크리트」 단가산출 85건 → 없는 D0000000140 가져오기 → 연결 자료 3건·단가산출 21행 추가·단가 28,878 원본과 같음·오류 0, 샘플 복구.
    • 엑셀형 수량산출서(원본 TFRMMULEXCEL, MulMainDat.Editor = OLE2 .xls BIFF8)
      • 1단계 읽기 — xls-read.cjs(복합문서·SST/CONTINUE·LABELSST·NUMBER·RK·MULRK·LABEL·BOOLERR·FORMULA 저장값), 가져올 때 sheet.excel, 수량산출 화면 읽기 전용 격자(수식 셀 굵게).
        • 검증완료: test_est_xls_read.py 2개(설치 main.estx 엑셀형 6개·토적계산표 B2·No.1·20·수식 16개, OLE 아님 거부·격자 그리기), 수량 시험 포함 22개 통과. 엑셀형 붙인 뒤에도 ESTX 원본 그대로 저장 동일. ORCA 브라우저에서 토적계산표 격자 표시·수식 칸 16개 확인 후 샘플 복구.
      • 남음: 셀 편집·수식 계산·4방향 합계·품명/규격/수량 지정(항목과 셀 대응 근거 미확인), .xls 저장.
    • 수량산출 누계(원본 TfrmMulWord ActionAdd Ctrl+U → 0x11155c4, 재계산 0x111c0b0 — 디스어셈블 근거) — 원본 F·a 표지를  쌍·row.totals 로 읽고, 위쪽 품명 줄(포함)/앞 누계(제외)부터 줄마다 첫 결과 합을 표지 반올림(F+6자리+방식+자리)으로 매 계산 갱신, 커서 자리 누계 넣기. 원본 TFRMMULNAMEINPUT 「누계계산」 단추는 실제로 지정해제와 같은 처리라 따로 만들지 않음.
      • 검증완료: test_est_quantity_total.py(소계 범위·앞 누계 제외·반올림 표지·값 갱신 6,003·넣기 이름·표지 안 거부·원본 F 표지 읽기) 통과, 수량 시험 포함 26개 통과. ORCA 브라우저에서 「소계」 줄 끝에 누계 → ⟦누계⟧9⟦누계⟧(6+3), 샘플 복구.
    • 갑지·표지·공사설명서·시방서(원본 TFRMGABGI·TFRMCOVER·TFRMESTEDITOR, DatGabgi/DatCover/DatExplean/DatSiBang.opt — 디스어셈블 근거) — midas-read.cjs MIDAS 레코드·WPTools 글자 읽기 → project.docs, 편집 창, 공사명↔공사 이름 동기화, 공사금액 자동입력 두 방식·한글금액(일 생략 없음), 설명서·시방서 갑지 붙여넣기, 인쇄 미리보기 8·9·10·11. 문서 편집 작업은 ESTX 저장 거부.
      • 검증완료: test_est_docs.py 3개(한글금액·금액 줄·원가 도급액, 미리보기·모델 통과, 설치 sample.estx 갑지 「연습공사」·결재란·표지 2012년도·원본 재저장 동일·편집 시 ESTX 거부) 통과. ORCA 브라우저에서 갑지 편집 → 공사금액 「금 칠천구백육십만삼천원(₩79,603,000)」, 인쇄 미리보기에 결재란·위치·공사명·개요·금액·발주처 표시(단일 표 쪽 나누기에서 갑지 제외 수정), 샘플 복구.
      • 남음: 서식·여백·글꼴·표, 양식목록(문서), 공사금액 자동변경, 작업모드 2·4의 C 판.
    • 기타경비 계산·산업안전보건관리비 비교(원본 TfrmWongaDiget 모드 4·1, 0xd0bc80·0xd0b298 — 디스어셈블 근거, 내장 요율표 없음) — 작은 기초금액 식 선택·요율 입력·비교 줄(CalcIndex 2), 대상액(직접공사비 또는 재료비 소계+비과세+직접노무비)·관급/1.1·1.2배·기초금액(기본 5,349,000 원본 상수).
      • 검증완료: test_est_wonga_tools.py 2개(샘플에서 원본이 적어 둔 식 (A + 4) × 0.0315 × 1.2·비교 ((A + 4) + J/1.1) × 0.0315 그대로 재현·오류 0, 기타경비 작은 쪽·비교 줄·잘못된 입력 거부) 통과. ORCA 브라우저에서 안전관리비 비교 → 같은 식·도급액 유지, 기타경비는 직접공사비 행 없는 샘플에서 원본처럼 거부, 샘플 복구.
      • 남음: 구성비·요율 전환(CalcBase), 약어 표시(SName), 제비율 기준 문서 보기(원본 한글 파일).
    • 수량산출서 검색·전체보기(원본 TFRMMULLANG btnSerch·btnAllDisplay — 빈칸·|·괄호 무시 포함 검색) — 고르기 줄을 native-quantity-sheets.js 로 옮겨 700줄 제한 유지.
      • 검증완료: test_est_quantity_sheets.py 검색 시험 포함 수량 시험 22개 통과. ORCA 브라우저에서 「집수」 검색 → 항목에 집수정이 있는 「배수」만·선택 이동, 전체보기 → 3개 복귀, 샘플 복구.
    • 원가 행 자리수(Diget·DigetIndex) 반영 — 웹 원가 엔진은 행 자리수를 계산에 쓰지 않음(선택항목 자리수 조정은 값만 기록). 설치 자료 중 sample.estx 만 Diget 사용(도급액 3·산업안전 3, DigetIndex 0)이고 산업안전 1,660,273 처럼 천단위가 아닌 값이 있어 DigetIndex 0 의 뜻(사사오입/없음) 확정 불가 — 근거 확보 전 엔진 변경 보류. 기성 원가계산서 편집(절하·한줄 삽입 등)도 같은 근거가 필요해 보류.
    • 견적서 작성(원본 mnuEstiMatePrn → TfrmEstiMatePrn 0x10c1994·그리기 0x10c4768 — 디스어셈블 근거) — 공사별 설정(project.estimatePrint), 원본 .einf INI 세 구역 저장·두 구역 불러오기, 레벨 행 선택, 7열, 1쪽 머리·공급자·합계금액(아래에서 위로 Checked 금액, 한글), 첫/나머지 쪽 줄수, 미리보기·인쇄. 수탁공사변환·XML 역변환 비교는 원본에서 숨긴 개발용 메뉴라 범위 밖.
      • 검증완료: test_est_estimate_print.py(전체/레벨 2 행, 쪽 27·36·7, 합계 「일금:구천칠백일십구만구천원정 (₩97,199,000원정)」, INI 왕복, 미리보기 글) 통과. ORCA 브라우저에서 상호·레벨 2 → 2쪽·28줄·합계·공급자 표, 공사 설정 저장 확인 후 샘플 복구.
      • 남음: 견적서 Excel 변환, 글꼴·크기·여백 세부값.
    • 조달청 XML 검사·자리수자동수정(원본 TfrmJDLConvert 0xe7d4bc 검사 1·8·10·11, TfrmXMLDigetCheck btnOk 0xcc848c — 디스어셈블 근거) — 비목값·−20~소계 사이 재료/노임 연결 줄 자리수, 7개 표 코드 중복·소문자, 기계 코드 17자리, 수정은 오류 1 줄 Diget·DigetIndex 0 후 재계산. 원본은 오류가 있으면 변환을 멈추나 웹은 기존 내보내기를 막지 않고 검사 창으로 알림(샘플 기계 코드가 11자리라 모두 막히는 것을 피함).
      • 검증완료: test_est_xml_check.py(규칙 1의 −20/61 구간·SCheck, 중복 문구, 소문자, 17자리, 수정 대상만 풀림) 통과. ORCA 브라우저에서 샘플 검사 → 자리수 0·중복 0·소문자 0·장비코드 8건.
    • 계약심사 자동입력(원본 TfrmInvest 심사평가결과·주요심사내용 0x10bfc98 — 디스어셈블 근거) — 총공사비 행 Cost_/Cost, 절감율 Trunc(×10000)×0.01, cp949 16바이트 맞춤·증액 「+」, 7개 표 NewItem 「○○ 조정 : 이름(규격) 외N 종」(N 원본 셈). 심사 사본에 설계 원가 Cost_ 보존.
      • 검증완료: test_est_review_auto.py(네 줄 글·증액 부호·총공사비 없음·주요심사 두 줄) 통과, 계약심사 관련 시험 44개 통과. ORCA 브라우저에서 수량 0.9배 심사 → 사본 → 자동입력 「설계 97,199,324 · 심사 96,952,167 · 절감 −247,157 · −0.25 %」, 샘플 복구.
      • 남음: 위치·사업개요·사업기간·기타사항 칸(Invest.Dat 10개 RTF).
    • 데이타 자동연결(원본 ActionAutoLink 0x10d54f4·TfrmDataAutoLink 0x10d3008·10d2a48·맞춤 10e0e58 — 디스어셈블 근거) — 9개 선택·Over Write, 정규화·맞춤 단계·노임 맞바꿈·기계 주연료·건너뛰기 규칙·쓰는 값 원본대로, 전체 순서 노임→자재→견적→표준→기계(내역·일위만)→단가산출→일위대가.
      • 검증완료: test_est_autolink.py(노임 품명만·규격 재시도 맞바꿈·단위 정규화·일위 비목 단가·SCheck 3·Over Write·이미 연결 건너뜀·전체 끊기) 통과. ORCA 브라우저에서 샘플 전체자동(Over Write) → 7행 연결·순공사비 45,293,066 그대로, 되돌리기 원상.
      • 남음: 전역변수( 표지 — 설치 자료 사용 0건, 단가산출 엔진 깊은 변경이 필요해 보류).
    • 하단/상단으로 집계·공종 다듬기·단가산출 들여쓰기·레벨 확인(원본 f01a90·f018d0·f01750, 0x113eb44, 0xf0770c, 0xd10840 — 디스어셈블 근거) — 「소 계」(53, Level −10) 넣기 규칙, 내역 엔진에 53 행 합(닫는 공종 안쪽부터, 상세 행) 추가, LeftSpace 계산·이름 칸 들여 보이기, 들여쓰기 n 칸·분수 세 줄 함께, 레벨 나무(60−Level 칸 [레벨]·비목 소계). 다시 집계 시 겹침 방지는 웹 보완.
      • 검증완료: test_est_est_tools.py 2개(소계 넣기·재실행 0·첫 소계 = 공종 합·도급액/순공사비 불변·상단 집계로 원상, 들여쓰기·LeftSpace·레벨 나무) 통과, 대조·업무·설계변경·연차·ESTX 저장 시험 111개 통과(엔진 변경 회귀). ORCA 브라우저에서 하단 집계 11줄(토공 2,382,484 등 공종 합과 같음)·도급액 유지, 공종 다듬기 59칸 들여쓰기, 레벨 나무 표시, 샘플 복구.
    • 묶음 인쇄·간지(원본 TEstPrint.Print 0x10fef98, TFRMESTPRINT2·TFRMPRINTLISTCHECK·TFRMESTPRINTPRIVATE — 디스어셈블 근거) — 인쇄표 차례·Checked 서식, 간지(Name2 가운데·겹테두리), 한 문서 이어 인쇄, 간지 쪽 번호 숨김, 공사별 선택 저장(project.printBatch). 원본은 서식마다 따로 인쇄 작업·간지는 쪽 번호를 소모하지 않음 — 웹은 브라우저 쪽 번호라 간지도 쪽 수에 들어감(번호만 숨김).
      • 검증완료: test_est_print_batch.py(공통 행 제외·간지→서식 차례·간지 끔·선택 저장) 통과. ORCA 브라우저에서 인쇄표 40개 목록·4개 선택 → 간지 4·서식 4·표 3, 샘플 복구.
      • 남음: 설정값 일괄적용(간지 글꼴·여백 13항목), 번호자동매김·시작 쪽, 끌어서 차례 바꾸기.
    • 기계경비 공식 모음(원본 TfrmMachGongSic 0xf146f0·MachText.Dat, TfrmMachText 0xd3d58c, 구공식변환 0xd90c60 — 디스어셈블 근거) — 서버 양식 보관함 종류 machformula, 삽입·추가·삭제·번호 1..N·저장, 단가산출 현재 행 아래로 본문 줄 넣기, 옛 394바이트 레코드 변환. 원본이 기계경비 연결 때 덧붙이는 요약 4줄은 형식 확인 전이라 빼둠.
      • 검증완료: test_est_mach_formula.py 2개(구공식 두 공식·본문 CR·크기 오류, 줄 넣기 PkID·위치, 보관함 종류) 통과. ORCA 브라우저에서 공식 추가·저장 → 보관함 등록 → 단가산출 호표 아래 2줄 넣기 → 보관함 정리·샘플 복구.
    • 기본환경으로 설정·목록에서 삭제(원본 TfrmOption btnSave, TfrmWorkFileList btnDelete) — 계산 환경 14개 키를 서버 보관함(종류 options)에 저장해 새 내역서에 적용, 저장 작업은 data/removed 로 옮겨 목록에서만 뺌(지우지 않음).
      • 검증완료: test_est_defaults.py(환경 키만 고름·보관함 종류) 통과. ORCA 브라우저에서 내역 소수 3자리 → 기본환경 → 새 내역서에 3 적용, 시험 작업 저장 → 목록에서 삭제 → 목록에서 빠지고 removed 로 이동 확인 후 시험 파일·기본환경 정리.
    • 대조 합계(CAD 제외 882개): 구현 283 · 부분 193 · 없음 273 · 제외 133.
    • 남은 핵심(실무 빈도순): 3. 수량산출서 — 누계·4방향 합계, 제출용 전체 인쇄. 7. 무관자료 삭제, 데이타 정리(정렬·번호), 품명정리. 8. 원가계산서 — 정산원가계산서, 기타경비·요율 대화, 서식 저장·불러오기, 기성 원가 편집.
      • 도메인 값이 필요해 사용자 협의 뒤: 산업안전보건관리비 비교, 조달청 표준공사코드, 현재데이타 갱신(단가 DB), 품셈 열람.
  • 연차 수수료의 원본 연결값 LinkIndex_가 57로 보존된 경우 ESTX 재열기에서 원가 계산에 반영하고, 없는 경우 저장 차단을 유지한다.

    • 자체 검증: 설치 sample의 조달수수료 2건을 연차 사본으로 저장하고 관급 수수료 제외 옵션을 켠 상태에서 재열어 원가 전 항목과 인덱스 바이트가 일치함을 확인. 기존 연결값이 없는 경우 저장 거부. 연차·기성·인덱스 관련 통합 회귀 43개 통과. 99·고정 행·기존 연결값 57 조합에만 적용하며 원본 EST 실행 비교는 하지 못했다.
  • 원본 ESTX에서 인덱스가 빠진 DBISAM 표가 있으면 수정본 출력 시 이를 차단한다. 변경 없는 원본 반환은 유지하고 설치 자료·합성 결손 사례를 확인한다.

    • 자체 검증: 설치 ESTX 24개에서 유효한 DBISAM .dat의 짝 .idx 누락이 없음을 확인. 합성 파일의 인덱스를 제거하면 원본 그대로 반환은 가능하고 값 수정 저장은 오류로 차단. 관련 인덱스·연차·기성 읽기 시험 5개 통과. 인덱스 재생성 구현은 별도로 미완료.
  • 연차 사본의 안전한 ESTX 저장 범위를 실제 파일로 확인하고, 원본 복원에 필요한 관급 수수료 정보가 소실되는 경우 저장을 차단한다.

    • 자체 검증: 사용자 지정 통영 ESTX의 50% 차수 사본을 ESTX로 저장·재열어 내역 144행의 수량·비목·금액, 원가와 인덱스 바이트가 일치함을 확인. 관급 수수료 행을 99로 바꾸는 차수는 원래 57 정보가 원본 ESTX에서 사라지면 안전관리비 원가가 달라질 수 있음을 설치 sample에서 재현. 이전 연결값이 보존되지 않는 경우 저장을 명시적으로 거부한다. 원본 프로그램 실행 검증은 하지 못했다.
    • 독립 읽기 도구 PyDBISAM 1.2.1도 시험했지만 저장본과 변경 전 원본 모두 같은 필드형 오류로 열지 못해 독립 판정 근거로 사용하지 않았다.
  • 원본 기성 ESTX에서 AccomMainTable.Dat를 읽어 표를 확인하는 기능을 추가한다. 원본·작업본 변경 없이 합성 테이블과 오류 조건, 서버 및 화면 연결을 검증한다. 원본 회차 변환과 쓰기는 실제 자료 확인 전까지 차단한다.

    • 자체 검증: DBISAM 서명·코드/누계 필드 검사, 원본 표 읽기, 표 누락·서명 손상 거부, 별도 서버 API 및 Edge에서 파일 선택·201행 페이지 이동과 현재 작업 불변 확인. 파일을 읽는 도중 다른 입력창을 열어도 덮어쓰지 않는다. 합성 자료·기성·연차·서명 시험 18개 통과. 실제 원본 기성 파일은 확보하지 못해 호환성과 원본 실행 결과는 미확인이다.
  • 임도 원본 장비운반 산식의 괄호 누락을 유사 원본 자료와 대조해 별도 보정본에 반영하고, 연결 단가·계산·저장 재열기를 확인한다. 원본 ESTX는 유지한다.

    • 근거: 설치된 산림토목·오수차집관거 등의 같은 왕복 운반식은 분수 합계의 닫는 괄호 뒤에 ×2×60을 둔다. 원본의 0.56은 18.3/40+2/20의 시간 단위 반올림과 일치하고, 왕복 분 단위 산식 결과는 (18.3/40+2/20+0/10)×2×60=66.9이다. 이는 원본을 실행해 확인한 값이 아니라 유사 자료·단위에 근거한 보정이다.
    • 자체 검증: 서버에 2025년 산불진화임도 설치사업 실시설계 (장비운반 산식 보정 검토본)을 별도 저장(ID aab5f5f5e7633447a07e14e9)하고 재열기·2회 반복 계산에서 오류 0과 결과 불변을 확인했다. 산근 내 수치 대입 설명도 변경 결과와 일치시켰다. 원본 단가 113,252→366,863원, 연결 내역 226,504→733,726원, 순공사비 267,387,307→267,894,529원. 원본의 도급액 고정 옵션 때문에 도급액은 508,328,000원으로 유지된다. 원본 ESTX 해시 변경 없음.
  • JDL 파일에 대소문자만 다른 중복 표가 있으면 가져오기를 중단하고 정상 파일 호환성을 확인한다.

    • 자체 검증: Main.txt와 MAIN.TXT의 서로 다른 내용 중 하나가 조용히 선택되던 문제 재현 후 중복 오류 확인. JDL·업무 시험 50개 통과.
  • JDL 내역 출력 시 총액이 같아도 비목 금액이 다르면 저장 금액을 보존하고 왕복을 검증한다.

    • 자체 검증: 총액은 20으로 같지만 단가가 재료비 20·저장 금액이 노무비 20인 행에서 기존에 재료비로 잘못 출력되는 실패를 재현. 수정 후 노무비 20을 유지하고 JDL·업무 회귀 49개 통과. 설치 다리공사 파일 132개 내역을 JDL 왕복하여 재료비 2,129,366,589·노무비 4,411,679,576·경비 1,448,805,997원 각각 유지. JDL 검사 DLL 인증은 미확인.
    • 추가 검증: 사용자 지정 임도·통영 ESTX도 JDL 왕복 시 내역 73·91건과 재료비·노무비·경비 각각 일치. 임도 원본 산식 오류 1건은 그대로 남아 있어 오류 없는 자료로 판정하지 않음.
  • JDL 내역의 퍼센트 수량을 가져오기·내보내기에서 같은 기준으로 계산하고 고정 금액 왕복을 검증한다.

    • 자체 검증: 일반 내역 10%×200=20, 고정 내역 100%×30=30을 출력·재가져와 합계 50 유지. JDL·업무·오류 검사 61개 통과. 원본 JDL 검사기 통과 여부는 미확인.
  • 서명 강화 이후 ESTX 시험 파일의 엔진 서명을 실제 17바이트 형식에 맞추고 실패한 저장 시험을 다시 확인한다.

    • 자체 검증: 실제 ESTX 저장·수량 편집 시험 41개 중 39개 통과, 합성 파일 서명 누락으로 실패한 2개는 시험 자료 수정 후 재실행 통과. 손상 서명 거부 시험도 통과. 원본 프로그램 실행 시험은 아님.
  • 시작 명령이 자동 갱신 감시를 사용하고 접속 주소 안내가 실제 바인딩과 일치하는지 확인한다.

    • 자체 검증: 시작 명령이 감시 프로그램을 실행하도록 변경, 감시 재시작 시험 1개 통과. 기존 서버의 테일스케일 주소 HTTP 200과 감시 프로세스 확인. 시작 명령 자체의 별도 실행 시험은 하지 않음.
  • 비목 합계 수식에 뒤따르는 숫자 대입식을 구분하고 앞선 비목·변수 변경 전파와 원본 회귀를 확인한다.

    • 자체 검증: 비목 100→120과 변수 5→4 변경 시 합계 20→30 전파. 설치 ESTX 24개 비교에서 산식 오류 14→13건, 저장 결과 일치 114,379→114,381건, 파일별 일치 감소 없음. 원본 실행 비교는 미실시.
  • JDL 일위대가의 퍼센트 고정 금액 출력에서 수량과 금액의 계산 관계를 일치시키고 재가져오기를 검증한다.

    • 자체 검증: 고정 금액 10을 100%×10으로 출력하여 수량·단가·저장 금액 일치, 재가져온 내역 합계 20 확인. JDL·업무 시험 47개 통과. 외부 JDL 인증은 미확인.
  • JDL 기계경비 퍼센트 상세의 적용 금액이 호표 합계와 명확히 일치하면 고정 금액으로 편집·재출력한다. 모호한 경우 합계 보존을 유지한다.

    • 자체 검증: 수량 10%와 단가 50의 금액 5를 편집 금액 6으로 바꿔 JDL 출력·재가져오기 유지. 모호한 1% 사례는 기존 합계만 보존하며, 원본 수량은 첫 가져오기 화면에 표시한다. JDL·업무·오류 검색 59개 및 최종 JDL 회귀 27개 통과. 원래 특수 산식과 외부 인증은 미확인.
  • JDL 기계경비의 특수 상세도 저장 금액 합계가 명확히 호표와 일치하면 개별 고정 금액으로 가져와 편집·출력한다. 특수 산식은 해석하지 않는다.

    • 자체 검증: 합성 JDL의 일반·특수 상세 120을 각각 불러와 특수 금액 변경 후 합계 130, JDL 재가져오기 유지. 합계 불일치·모호한 퍼센트 행은 기존 호표 합계 경로 유지, 수량 2의 합계 일치 사례 확인. JDL·업무·오류 검사 58개 통과. 특수 산식·외부 JDL 인증은 미확인. 이후 산식·JDL·업무·오류 검색 통합 회귀 107개 통과.
  • JDL 특수 일위 상세의 저장 비목 합계가 호표와 정확히 일치하면 상세별 고정 금액으로 가져와 편집·출력한다. 불일치나 행 식별이 모호한 경우 기존 합계 보존을 유지한다.

    • 자체 검증: 정상·특수 상세 합계 350인 합성 JDL에서 특수 상세 금액 변경 후 360으로 내역까지 재계산·JDL 왕복. 원천이 없는 특수 행의 저장 금액 보존, 합계 불일치 시 기존 합계 경로 유지. JDL·업무·오류 검사 57개 통과. 특수 산식과 외부 JDL 인증은 미확인.
  • 단가 표지 뒤 남은 미선언 C가 대입식의 단가와 동일한 설명인 경우 수식에서 구분하고, 단가·수량 변경 전파와 실제 원본 자료 회귀를 검증한다.

    • 자체 검증: 교량 원본 행과 단가·수량 변경 후 반복 재계산 및 동원 수량 계수 확인. 변경된 단가가 뒤의 숫자 대입에도 반영되며, C가 선언되거나 숫자 대입이 다른 경우 보호한다. 설치 ESTX 24개 변경 전후 수식 오류 15→14, 저장 결과 일치 114,378→114,379, 파일별 일치 감소 없음. 산근 시험 49개와 추가 보호 시험 통과. 실제 교량 자료에서 원천 단가 24,200→30,000 변경 후 220,500원·동원 계수 7.35가 두 번의 계산에서 안정적으로 유지됨을 확인.
  • JDL 출력에서 단가산출 호표의 비목별 저장 금액과 내역·일위 연결을 단가산출 자료로 보존하고 재가져오기를 검증한다. 원래 산출근거는 JSON에 보존하고 변환 시 알린다.

    • 자체 검증: 합성 자료의 단가산출→직접 내역·일위 연결 및 직접비 625 재가져오기 확인. 설치 교량 ESTX를 JDL로 전환·재가져와 단가산출 호표 41개와 내역 합계 7,989,852,162원 유지. JDL·업무 시험 41개 통과. 상시 서버 API에서 JDL 단가산출 100→120 수정 후 저장·재열기 시 연결 104와 내역 합계 290 확인. 원래 산출근거와 외부 인증은 미지원.
  • JDL 일위대가의 고정 금액 상세와 저장 합계 차액을 각각 보존해 다시 출력하고, 편집 후 재가져오기와 합계를 검증한다.

    • 자체 검증: 합성 JDL의 상세 200과 저장 차액 5.25를 가져와 차액 7로 변경한 뒤 출력·재가져오기 시 두 상세와 합계 207 유지. JDL·업무 시험 40개 통과. 고정 금액을 독립 단가로 출력하므로 재가져온 정수 상세는 일반 연결 행으로 표시될 수 있다.
  • 대량 JDL 공종 가져오기에서 내역을 공종별로 미리 묶어 반복 전체 검색을 없애고 공종 누락·중복 검사를 유지한다.

    • 자체 검증: 3,000공종·6,000상세의 그룹 순서와 합계 27,000원, 부모 누락·중복 공종 거부 확인. JDL·업무 시험 39개 통과. 별도 주요 EST 업무·계산·입출력 회귀는 278개 통과(대용량 원본 저장과 브라우저 캐시 시험 제외).
  • DBISAM 엔진 서명 전체를 확인해 손상된 ESTX 테이블을 정상 자료로 읽지 않도록 하고 실제 파일·손상 사례를 검증한다.

    • 자체 검증: 기존 16바이트 접두 일치 후 마지막 해시 바이트가 다른 테이블과 자재 등 주요 테이블의 서명 손상을 거부해 조용한 누락을 방지. 설치 ESTX 24개 읽기, 정상 main.estx 변조 거부, 실제 원본 저장·인덱스 보존 포함 관련 시험 18개와 추가 손상·산식 회귀 39개 통과.
  • JDL 중첩 일위대가를 호표의 입력 순서와 관계없이 하위부터 출력한다. 순환 참조는 고정 단가와 경고로 보호하고 실제 금액을 검증한다.

    • 자체 검증: 부모 선행·하위 선행 순서 모두 하위 일위 연결과 120원 재가져오기 유지. 순환 참조는 고정 단가 및 경고, 직접 자기 참조는 상세 출력 차단. 15,000단계 의존성 순서 계산과 JDL·업무 시험 38개 통과. 원본 JDL 검사 DLL 인증은 미확인.
  • 중첩 일위대가를 JDL 상세로 내보내고, 상세를 연결할 수 없는 하위 호표는 고정 단가와 경고로 보존한다. 자기 참조 보호와 재가져오기를 검증한다.

    • 자체 검증: 부모·하위 순서를 바꾸어도 재가져오기 합계 120원과 하위 연결을 유지한다. 자기 참조 및 순환 시 안전한 고정 원천으로 보존한다. JDL·업무 시험 38개 통과.
  • 수량 문서 행별 해석에서 필요한 위첨자 서식만 조회하고 중복 서식과 실제 저장 결과를 검증한다.

    • 자체 검증: 3,000개 서식과 3,002행, 중복 서식 선언·표지 재정의에서 기존 해석과 일치. 설치 ESTX 저장·재읽기·인덱스 보존을 포함한 수량·원본 저장 시험 56개 통과(6분 18초).
  • JDL 일위대가 상세의 기계·단가산출 등 일반 연결을 가능한 범위에서 출력하고, 연결과 금액의 재가져오기를 검증한다.

    • 자체 검증: 기계 상세→일위대가→내역 연결을 JDL 왕복해 300원과 기계 연결을 확인. 실적·견적·산근·일반 기계는 고정 원천으로 전개해 40원 유지, 중복 일위 상세는 상세 출력 방지. JDL·업무 시험 36개 통과. 설치 교량 자료 JDL 왕복 내역 합계 7,989,852,162원 유지. 원본 DLL 검증은 미확인.
  • JDL에서 가져와 금액을 편집한 일반 기계 상세를 조건이 충족될 때 JDL 기계 상세로 출력하고 재가져오기·합계를 검증한다. 복잡하거나 불일치한 구성은 기존 고정 단가를 유지한다.

    • 자체 검증: 합성 JDL 기계 상세 금액 110·50을 편집 후 내역 수량 2에 반영하고 JDL로 저장·재가져와 상세·단가 합계 160과 내역 합계 320 확인. 중복 호표·비목 합계 불일치의 상세 출력 차단 및 JDL·업무 회귀 33개 통과. 상시 테스트 서버의 실제 JDL 가져오기·변경·내보내기·재가져오기 API에서도 상세 110과 내역 합계 320 확인. 세부 금액은 고정 단가로 출력하며 원본 상세 산식·수량 관계는 복원하지 않는다. 실제 JDL과 원본 검사 DLL 인증은 미확인.
  • 대용량 수량산출서의 저장 시 각 행에 필요한 표지만 읽도록 변경하고 원본 서식·공유 표지·실제 파일 저장을 검증한다.

    • 자체 검증: 3,002행 합성 문서에서 전역·행별 표지 재정의와 위첨자를 기존 해석과 대조. 설치 ESTX 추가·삭제·이동·편집 후 재읽기 및 인덱스 보존을 포함한 관련 회귀 56개 통과(6분 12초). 큰 ESTX의 다른 처리 시간은 남아 있다.
  • JDL 기계 상세의 수량·단가를 곱한 비목별 합계가 제목과 일치하는 경우 상세 금액을 편집 가능하게 가져온다. 해석이 모호하거나 불일치한 경우 기존 합계 보존을 유지한다.

    • 자체 검증: 합성 JDL의 수량 2 상세를 비목별 100·50으로 계산해 가져오고 금액 편집 후 합계 160 확인. 단순합과 수량 적용 합이 모두 일치하는 모호한 경우 등은 합계 보존. JDL·업무·오류 검색 시험 45개 및 모호성 추가 시험 통과. 실제 JDL 자료와 원본 실행 비교는 하지 못함.
  • JDL 출력에서 중복 자원 코드와 내부 고정금액 코드 충돌로 다른 단가에 연결되는 문제를 차단하고 왕복 검증한다.

    • 자체 검증: 중복 자원 세 개를 모두 내보내며 모호한 내역은 저장 금액으로 독립 전개하고, 기존 LITERAL2 코드와 내부 고정금액이 충돌하지 않음 확인. JDL·업무 회귀 30개, 중복 자원 세 건과 중복 일위대가의 잘못된 상세 연결 방지 별도 시험 통과. 설치 교량 자료의 JDL 출력·재가져오기 내역 합계 7,989,852,162원 유지. 변환 불가 구성 경고는 유지한다.
  • 수량산출 행 이동·삭제 시 문서 표지의 반복 전체 검색을 줄이고 공유 표지 보호 및 실제 ESTX 저장을 검증한다.

    • 자체 검증: 표지 빈도를 한 번 집계하여 공유 표지 삭제·이동 차단. 숫자가 비슷한 표지와 추가 표지 1만 개 시험, 실제 설치 ESTX 이동·삭제·재열기 및 인덱스 보존을 포함한 수량·원본 저장 회귀 55개 통과(6분 21초). 문서 해석의 다른 반복 처리에는 이 최적화를 적용하지 않았다.
  • 선택 구간 합계를 변수에 대입한 산식을 계산한다.

    • 자체 검증: 가시설 원본의 Q 대입과 이후 변수 참조 재현, 산근·수량 업무 시험 63개 통과. 설치 자료 24개 변경 전후 비교에서 이번 산식 보완 전체의 오류 25→15건, 저장 결과 일치 114,371→114,378건, 파일별 일치 감소 없음.
  • 산출근거 숫자 뒤 길이 단위 자를 인식한다.

    • 자체 검증: 교량 자료의 목형 산식 재현, 산근·수량 업무 시험 62개 통과. 설치 자료 24개 변경 전후 비교에서 이번 산식 보완 전체의 오류 25→16건, 저장 결과 일치 114,371→114,377건, 파일별 일치 감소 없음.
  • 산출근거 설명의 중괄호 안 등호를 계산식 구분에서 제외한다.

    • 자체 검증: 강판 규격 {T=22} 원본 산식 재현, 산근·수량 업무 시험 61개 통과. 설치 자료 24개 변경 전후 비교에서 앞선 M.S.L 보완을 포함해 수식 오류 25→18건, 저장 결과 일치 114,371→114,375건, 파일별 일치 감소 없음.
  • 원본 수식 옆 수평 구분선을 분수로 인식하는 사례를 조사한다.

    • 진행: 리터럴 옆 구분선만 제외하는 변경으로 오류가 추가 감소했지만 해양 자료의 저장 결과 일치가 30건 감소해 변경을 되돌렸다. 후속 변수와 원본 저장값의 관계를 확인한 뒤 처리한다. 원인: 같은 원본의 H1 식은 음의 수심 변수를 사용하지만 바로 뒤 숫자 대입은 양수이며 저장값 5.3도 양수 대입과 일치한다. 이를 임의 수정하지 않으면 후속 Q가 200.15 대신 229.12가 되어 차이가 전파된다.
  • 산출근거의 평균해수면 표기(M.S.L)를 수식 변수와 구분한다.

    • 자체 검증: 실제 해양 자료의 대괄호 및 같은 줄 표기 재현 시험, 산근 회귀 45개 통과. 설치 자료 24개 변경 전후 비교에서 수식 오류 25→22건, 저장 결과 일치 114,371건 유지, 파일별 일치 건수 감소 없음. 나머지 오류는 계속 조사한다.
  • 수량산출서의 ESTX 저장 안내를 현재 지원 범위에 맞춘다.

    • 자체 검증: 화면과 README의 이전 안내를 수정하고 수량 업무 시험 15개 통과, 변경 코드 포맷 확인. 복합 원본 구조와 새 산출서는 계속 제한된다.
  • 기존 수량산출서의 목록 항목 추가를 ESTX 메모리 표에 저장한다. 기존 항목과 문서·인덱스 보존, 실제 파일 저장·재읽기 및 잘못된 코드 거부를 검증한다.

    • 자체 검증: 원본 메모리 표의 신규 행 형식이 확인되는 기존 문서에 한해, 연결되지 않은 항목 추가·재읽기를 지원. 설치 main.estx의 항목 추가 후 기존 목록·산출 행·전체 인덱스 보존 및 중복 코드 거부 시험, 잘못된 연결·길이·속성 거부 시험 통과. 관련 회귀 31개 통과, 최종 변경 후 추가 시험 2개 통과. 항목 삭제·내역 연결과 빈 원본 목록은 계속 제한. 원본 EST 실행 검증은 하지 못함.
  • 수량산출서에서 참조되지 않는 목록 항목 삭제를 기존 메모리 표에 저장하고 참조 항목은 보호한다. 실제 ESTX 재읽기와 인덱스 보존을 검증한다.

    • 자체 검증: 설치 main.estx의 미참조 목록 삭제 후 나머지 목록·산출 행·전체 인덱스 보존 및 재읽기, 문서 표지와 숨겨진 원본·현재 내역 연결에 의한 삭제 거부 확인. 코드가 없는 기존 목록 항목도 이름 수정 가능함을 실제 파일로 확인. 관련 회귀 35개 및 최종 추가·삭제 보호 5개, 기존 코드 누락 호환 1개와 원본·현재 연결 보호 3개 통과. 원본 EST 실행 검증은 하지 못함.
  • 설치된 JDL 검사 DLL의 호출 규약과 결과를 조사해 생성 파일 검사에 활용한다.

    • 진행: 32비트 DLL의 GetDLLVersion 호출은 1.03을 반환. IsCertifiedJDL은 디렉터리 인자를 받는 경로로 확인했으며, 기본 내보내기 파일을 임시 폴더에 풀어 호출한 결과 하위 바이트 0. JDLCheck는 한 문자열 인자의 stdcall 경로로 확인했으나 임시 자료 호출이 15초 안에 끝나지 않아 별도 프로세스를 종료했다. 반환 의미와 화면 없이 완료하는 방법은 미확인이며 인증 실패나 검사 성공으로 단정하지 않는다.
    • 추가 조사(2026-11-10): DLL의 JDLCheck(0x4e4ae8)는 검사 시작 시 GetJDLAnnouncement(0x4e58f8)를 호출하며, 이 함수에 http://www.g2b.go.kr:8081/emptyFile/jdldll.html 주소가 들어 있다. 해당 주소는 이 PC에서 5초 제한 요청 시 시간 초과됐다. 이전 검사 지연의 유력 원인이지만 호출 중단 위치를 확인하지 못해 확정하지 않는다. 원본 DLL 수정이나 우회 없이 검사 결과를 얻는 방법은 미확인.
    • 인증 구분: IsCertifiedJDL(0x4e5628)은 대상 폴더의 Global.Ini에서 [BASIC]의 MAKER·VERSION과 [CERTIFICATION]의 KEY·DLL_VERSION을 읽고 길이 16인 키를 내부 계산 결과와 비교하는 경로가 확인된다(0x4e5727~0x4e57f8). 현재 생성 파일에는 인증 섹션이 없으므로, 검사 함수가 파일을 검사하는 것과 인증 키 검증은 구분한다. 키 생성 조건·인가 및 원본 검사기의 실제 판정은 확인하지 못했다.
  • 기존 수량산출서 이름을 원본 제목 표에 저장한다. 기존 문서·목록·인덱스 보존과 실제 파일 재읽기를 검증한다.

    • 자체 검증: 설치 main.estx에서 이름 변경 후 재읽기와 문서·목록·인덱스 불변 확인. 제목 표가 따로 수정된 충돌을 거부하는 시험과 숨겨진 연결 보호 시험 통과. 원본 EST 실행 검증은 하지 못함.
  • 원본 수량 목록이 비어 있는 기존 산출서에도 항목 추가를 지원하고 실제 파일로 재읽기·기존 서식 보존을 검증한다.

    • 자체 검증: 설치 main.estx의 빈 목록 5개에서 같은 필드 구성을 확인하고, 한 문서에 첫 항목을 추가해 재읽기·산출 행·전체 인덱스 보존 및 입력 거부 시험 2개 통과. 확인된 필드 구성이 아닌 빈 목록은 거부한다. 관련 전체 회귀 38개는 직전 변경까지 통과. 원본 EST 실행 검증은 하지 못함.
  • 신규 수량 항목과 산출 행의 결과 코드를 원본 WPTools가 인식하는 숫자 형식으로 생성하고 기존 코드·표지와 충돌하지 않도록 검증한다.

    • 자체 검증: 기존 목록 코드와 문서 결과 표지를 모두 피해 r000000 형식의 새 코드를 생성하고, 생성한 표지를 WPTools 파서가 인식하는지 확인. 수량 업무 시험 15개 통과. 기존 JSON의 코드는 변경하지 않으며 산출 행 ESTX 추가 저장은 아직 미지원.
  • 기존 수량산출서 끝에 단일 결과 표지를 가진 산출 행을 추가해 ESTX에 저장하고, 문서 표지·계산 수량·기존 서식·인덱스를 실제 파일로 검증한다.

    • 자체 검증: 설치 main.estx에서 새 산출식 2+3의 결과 표지·목록 수량 5를 저장 후 재읽고 기존 산출 행·전체 인덱스 보존 확인. 중복 표지·연결 누락·복합 표지 거부 및 수량 업무 시험 통과. 관련 전체 회귀 42개 통과. 중간 삽입·이동·삭제와 원본 EST 실행 검증은 남음.
  • 기존 수량산출서 중간에 새 산출 행을 삽입해 ESTX에 저장하고 기존 행·서식·계산 수량을 검증한다.

    • 자체 검증: 설치 main.estx 중간 삽입·끝 추가 후 결과 수량 5, 기존 행·인덱스 보존과 재읽기 확인. 기본 서식 선언보다 앞선 삽입은 거부. 관련 전체 회귀 43개 통과(최종 서식 위치 보호는 별도 시험 2개 추가 통과). 원본 EST 실행 검증은 하지 못함.
  • 원본 수량산출서에서 단일 결과 표지 산출 행의 삭제를 지원하고 참조·서식 보존을 실제 파일로 검증한다.

    • 자체 검증: 설치 main.estx의 산출 행과 연결 목록 항목을 삭제해 재읽기, 나머지 행·항목·전체 인덱스 보존 확인. 글자 서식 선언 보존, 공유 표지·원본/현재 내역 연결 삭제 거부 확인. 관련 회귀 46개 통과. 복합 표지·내역에 연결된 행은 계속 제한하며 원본 EST 실행 검증은 하지 못함.
  • 기존 산출 행을 이동할 때 문서 표지와 글자 서식을 보존해 ESTX에 저장한다. 위험한 공유 표지·서식 구조는 거부하고 실제 파일로 검증한다.

    • 자체 검증: 설치 main.estx의 결과 표지 행 두 개를 이동해 재읽기·목록 수량·전체 인덱스 보존 확인. 이동 전 선언되지 않은 글자 서식, 이동 범위 내 서식 재정의, 공유 표지 거부 및 기존 표지 15만 개에서도 신규 표지 생성 확인. 전체 회귀 48개 통과 후 보강 범위 18개 추가 통과. 이동과 동시에 행 내용을 편집하거나 복잡한 공유 서식을 이동하는 경우는 제한하며 원본 EST 실행 검증은 하지 못함.
  • 고유 결과 표지가 있는 산출 행을 이동하면서 내용을 함께 수정할 때 표지로 원본 행을 찾아 서식을 보존한다.

    • 자체 검증: 합성 문서에서 이동과 산식 문자 수정을 동시에 수행해 원래 결과 표지 유지 확인. 설치 main.estx에서도 표지 행을 이동·편집 후 재읽기, 수량·인덱스 보존 확인. 이동 관련 시험 4개 및 전체 수량·저장 회귀 50개 통과. 중복 표지와 복잡한 공유 서식의 이동은 계속 제한하며 원본 EST 실행 검증은 하지 못함.
  • JDL 기계 상세 중 수량 1이고 비목별 합계가 원본 제목 금액과 일치하는 일반 행을 편집 가능한 상세 행으로 가져온다. 특수 형식과 불일치는 원래 금액 보존 경로를 유지하고 재계산을 검증한다.

    • 자체 검증: 합성 JDL에서 두 상세 행의 비목 금액 분리와 개별 수정 후 기계 합계 130→140, 불일치 및 수량 2의 보존 경로 확인. JDL·업무 회귀 29개 통과. 상세 산식·기초 단가 자동 연결과 원본 검사 DLL 인증은 미지원으로 경고하며 원본 JDL 실자료 비교는 하지 못함.
  • 결과 표지가 없는 일반 산출 행의 삭제를 지원하고, 모호한 중복 행과 문서 표지·서식은 보호한다.

    • 자체 검증: 설치 main.estx에서 일반 행을 삭제한 후 문서·수량 목록·전체 인덱스의 재읽기 확인. 실제 중복 행 삭제와 문서 표지가 있는 행 삭제 거부, 글자 서식 선언 보존 확인. 관련 전체 회귀 53개 통과. 삭제와 다른 행 편집을 함께 하거나 복합 표지가 있는 행은 제한하며 원본 EST 실행 검증은 하지 못함.
  • 일반 산출 행 삭제와 고유 표지 산출 행 편집을 함께 저장하고 두 행의 대응을 검증한다.

    • 자체 검증: 설치 main.estx에서 일반 행 삭제와 고유 결과 표지 행 편집을 함께 저장하고 재읽기·수량 목록·인덱스 보존 확인. 일반 삭제, 문서 표지 보호 및 중복 행 거부를 포함해 관련 전체 회귀 54개 통과. 이동이나 표지 없는 다른 행 편집을 함께 한 경우는 제한하며 원본 EST 실행 검증은 하지 못함.
  • 설치 ESTX 24개 대조에서 나온 수식 오류와 계산값 차이를 조사하고 근거 있는 파서 오류를 수정한다. 원본 오류와 미확인 사항을 구분하고 관련 시험과 실제 파일 재대조로 확인한다.

    • 진행: 한 줄의 독립 산식 결과를 앞선 결과와 이어 붙이거나 최초 선언 변수를 덮던 문제, 결과 표지 없는 비목 선언 누락, 연속된 동일 소계의 0원 처리 수정. 설치 파일 24개 재대조에서 일치 991,444→991,456/991,517, 수식 오류 35→34, 다른 파일의 일치 수 감소 없음. 관련 회귀 82개와 수정 시나리오 3개 통과. 붙은 변수 처리의 다른 항목 회귀 69건은 재현 후 해당 변경을 되돌림. 잔여 차이·오류는 미완료.
    • 추가 진행: 설명만 있는 선언, 표지로 감싼 비목 단가, t/㎡ 단위와 한글 설명에 붙은 번호 속도 변수 처리 수정. 설치 파일 24개 재대조에서 991,457/991,517 일치, 수식 오류 25건(기존 35건), 파일별 일치 수 감소 없음. 관련 회귀 86개 통과. 원본 산식과 저장값이 모순되는 경우 등을 계속 조사한다.
    • 추가 확인: 오류가 있는 비목 선언이 이전 변수값을 재사용하지 않는 시험 통과. 산림토목·조경·측량설계의 일부 잔여 차이는 저장 정수와 현재 소수 계산값의 정밀도 차이이며, 근거 없이 정밀도를 변경하지 않는다. 상수공사 1건은 결과 표지가 1.7에만 적용되고 뒤에 9가 남은 원본 형식이다. 테스트 서버는 테일스케일 주소에서 HTTP 200, 자동 재시작 감시 프로세스 동작 확인.
  • 두 사용자 실무 자료의 편집·업무·저장·출력 경로 확인.

    • 자체 검증: 첫 파일 보정본과 두 번째 원본에서 Edge 수량 수정 및 취소, 당초 비교, 기성, 물가변동, 연차 40/60 계산, 분리된 시험 저장소 저장·재열기 통과. 내역 인쇄 미리보기 각각 103·144행 전체 확인. 전체 Excel 및 ESTX 내보내기→재가져오기에서 계산 오류 0·도급액 508,328,000원·1,352,416,000원 유지. 관련 회귀 70개 통과. 원본 EST 프로그램 실행 비교는 수행하지 않음.
  • 기계경비 주연료 역할명과 연결 자재명이 다른 정상 행의 오류 오탐 수정. 연결 누락과 규격·단위 오류는 유지.

    • 자체 검증: 오류 검색 시험 13개 통과. 두 실무 파일의 주연료 오탐 23건·3건 제거; 연결 누락·단위 불일치와 일반 자재 품명 차이는 계속 검출. 첫 파일은 원본 괄호 오류가 남아 있으며 저장된 0.56을 유지하는 보정 작업본에서 계산 오류·자료 오류 0, 내역 103행 금액과 도급액 불변을 확인. 원본 EST 실행 동작은 미확인.
  • JDL 기계경비·단가산출 저장 금액을 편집 가능한 호표로 가져오기, 미변환 일위 구성 금액 보존. 상세 산식은 원본에 보존하고 경고.

    • 자체 검증: 고정 금액 변경→자동계산→내역 전파, 소수 금액, 일위 상세 불일치의 금액 중복 방지 및 미변환 잔액, 변경 없는 JDL 바이트 보존 시험. Edge에서 JDL 불러오기 경고와 기계·단가산출 편집 확인. 전용 회귀 270개 통과 후 최종 관련 계산·입출력 시험 60개 통과. 기존 원가 계산 시험에서 누락된 조정 추적값도 복구.
  • 수량산출 항목을 대용량 내역에 반영할 때 반복 검색을 줄이고 기존 연결·중복 오류 판정을 유지한다.

    • 자체 검증: 5,000개 항목과 내역 연결 및 중복 식별자 거부 확인. 수량 기능 시험 13개 통과.
  • 수량산출 화면에서 내역 선택 목록을 필요할 때 생성하여 대용량 화면의 과도한 옵션 생성을 줄인다.

    • 자체 검증: 수량 시험 14개 통과. 실제 앱의 Edge 화면에서 기존 연결 표시, 포커스 시 목록 생성 및 다른 내역 선택 반영을 확인했다. 1,000개 선택 항목은 최초 옵션 2,000개만 생성하고 선택 시 해당 목록을 연다.
  • 여러 수량산출서를 한꺼번에 반영할 때 내역 검색 자료를 공유하고 합계와 오류 처리를 유지한다.

    • 자체 검증: 여러 수량산출서 합산, 오류 시 변경 방지 등 수량 시험 14개 통과.
  • 기성 내역 화면을 페이지로 나누어 대용량 자료도 조작하고 전체 계산·출력을 유지한다.

    • 자체 검증: 기성 시험 12개 통과. 실제 Edge 화면에서 205행 중 100행씩 표시, 다음 쪽 101번 행 입력 및 전체 계산 결과 205행 유지를 확인했다.
  • 물가변동 내역 화면을 페이지로 나누고 행별 입력과 전체 계산을 유지한다.

    • 자체 검증: 물가·페이지 시험 9개 통과. 실제 Edge 화면에서 205행 중 다음 쪽 101번 행 입력과 전체 계산 결과 보존을 확인했다.
  • 설계변경 비교 화면을 페이지로 나누고 신규·삭제·변경 내역과 원가 비교를 유지한다.

    • 자체 검증: 설계변경·페이지 시험 18개 통과. 실제 Edge 화면에서 205행 비교와 다음 쪽 표시를 확인했다.
  • 새 작업을 열면 업무 화면의 페이지 위치를 첫 페이지로 초기화한다.

    • 자체 검증: 실제 Edge에서 새 작업을 연 뒤 기성·물가변동·설계변경 페이지가 모두 첫 페이지로 돌아가는 것을 확인했다.
  • 업무 화면에서 코드·품명 검색과 기성·물가변동의 규격·단위 검색을 지원하고 검색할 때 첫 페이지부터 표시한다.

    • 자체 검증: 업무별 검색과 원래 행 인덱스 유지, 검색어 변경 시 첫 페이지 및 전체 계산 유지 확인. 관련 시험 37개 통과, 실제 Edge 기성 화면에서 검색 및 입력 행 확인.
  • 물가변동에서 중복 코드 행의 순서가 바뀌어도 식별 가능한 행은 당초 단가와 정확히 연결한다.

    • 자체 검증: 중복 코드의 행을 뒤바꾸고 JSON 저장·재열기 후 당초 단가, 적용 수량 및 제외금액 확인. 물가·업무 시험 27개 통과. 품명·규격·단위까지 중복된 행은 기존 순서 대응을 유지한다.
  • 설계변경 비교에서도 중복 코드 행의 재정렬을 식별해 당초 행과 연결한다.

    • 자체 검증: 설계변경·물가변동 시험 24개 통과. 실제 Edge 앱에서 같은 코드의 행 순서 변경 후 각 당초 수량과 계약 단가를 확인했다. 품명·규격·단위가 모두 같은 경우는 기존 순서 대응을 유지한다.
  • 실행 중 새로 추가한 소스 파일도 감시하여 서버에 자동 반영하고 작업 데이터 저장에는 재시작하지 않는다.

    • 자체 검증: 별도 임시 서버에서 신규 파일 생성·수정에 따른 재시작과 데이터 하위 폴더 변경 무시 확인. 실제 테스트 서버에서 신규 소스 변경 시 프로세스 갱신 및 HTTP 200 확인.
  • 중복 코드 행의 추가·삭제가 있어도 구별 가능한 행을 당초 자료와 연결한다.

    • 자체 검증: 중복 코드의 일부 삭제와 신규 행 추가 후 당초 수량과 신규·삭제 분류를 확인했다. 설계변경·물가 시험 25개 통과. 식별 정보까지 같은 행은 기존 순서 기준이다.
  • 설계변경 원가 비교에서 중복 비목 코드의 순서 변경과 추가·삭제를 구별한다.

    • 자체 검증: 중복 코드 원가의 재정렬·신규·삭제에 따른 당초·변경 금액을 검증했다. 설계변경·물가 시험 26개 통과.
  • 당초 확정 시 기계경비 호표 구성을 보관하고 선택한 호표를 복원한다. 기존 당초 자료와 현재 기초단가 사용 방식은 보존한다.

    • 자체 검증: JSON 저장·재열기, 다른 호표와 당초 사본 보존, 구버전 당초 및 중복 코드 거부 확인. 실제 Edge 화면에서 호표 복원과 실행 취소, 자동계산 300→200 및 서버 재계산 결과 보존을 확인했고 기초단가·설계변경·행 조작 시험 39개 통과. 당초 단가 자체가 아니라 산식을 복원하며, 자동계산 시 현재 기초단가를 사용한다.
  • 기계경비 설계변경에서 당초 대비 신규·변경·삭제 항목을 표시한다.

    • 자체 검증: 기계경비 신규·변경·삭제 금액 및 상태 시험 포함 기초단가 시험 7개 통과. 실제 Edge에서 신규·삭제 행 표시와 삭제된 호표 열기 버튼 미표시 확인.
  • 삭제한 기계경비 호표를 당초 구성에서 되살리고 기존 호표의 식별자를 보존한다.

    • 자체 검증: 원래 순서와 식별자 보존, 충돌 거부, JSON 재열기 후 연결 내역 재계산 및 실제 Edge에서 삭제 복원·실행 취소 확인. 기계경비 관련 시험 5개 통과.
    • 추가 회귀: 기초단가·설계변경·물가변동·기성·수량·서버 감시 시험 65개 통과.
    • 구버전 당초 사본에 기계 호표가 없는 경우 현재 호표와 기존 당초 필드를 보존하며, 초기화 확인창에 사본에 없는 자료가 유지됨을 표시한다. 기계 당초·행 조작 시험 16개 통과.
    • 기계 호표 당초 사본에는 기존 _ 필드도 보관하며 설계변경 초기화 시 원래 값을 유지한다. 기계 당초·기초단가 시험 10개 통과.
  • 기성 회차 초기화가 선택한 회차만 변경하도록 보호하고 오류 시 입력 보존을 확인한다.

    • 자체 검증: 존재하지 않는 회차를 선택했을 때 첫 회차를 초기화하지 않고 오류를 표시하며 기존 입력이 보존되는 회귀 시험 통과 (test_reset_progress_inputs_action, 1 passed).
  • 설계변경 초기화 시 수량 연결 대상을 실제 수량 반영 규칙과 동일하게 검사한다.

    • 자체 검증: 유효하지 않은 TargetKey가 같은 코드로 잘못 대체되는 경우와 중복 코드 연결을 차단한다 (test_reset_change_action, 통과).
  • 확정된 전회 기성 결과가 없을 때 금회 누계를 잘못 확정하지 않도록 보호한다.

    • 자체 검증: 전회 결과가 없는 확정 회차 다음 계산에 오류를 표시하고 확정을 거부한다. 기성·행 조작 시험 24개 통과.
    • 추가 회귀: 설계변경·기성·물가변동·연차 관련 시험 79개 통과(기성·수량·행 조작 35개, 업무·설계변경·물가변동·연차 44개).
  • 전회 기성 원가 결과가 누락된 경우 전회 원가 누계가 0원으로 바뀌지 않도록 보호한다.

    • 자체 검증: 이전 회차의 원가 결과가 없을 때 계산 오류를 표시하고 확정을 거부한다. 기성 시험 11개 통과.
  • 원가 초기화 계산 실패 시 수식·금액·고정 옵션을 보존한다.

    • 자체 검증: 순환 원가 수식에서 초기화가 실패해도 작업본과 고정 옵션이 변하지 않으며 정상 초기화도 통과한다 (test_reset_wonga, 2 passed).
  • 자재 부가세 계산의 절상 선택이 단단위 미만 금액을 올바르게 올리는지 확인한다.

    • 자체 검증: 십원 미만 나머지가 작은 값과 정확한 십원 경계의 절상을 확인했다 (test_vat, 2 passed).
  • 일위대가 상세 비목 지정 변경을 해당 행에만 반영 → 자동·수동 계산, 원천 불일치·다른 호표 보존 시험.

    • 자체 검증: 관련 시험 33개 통과. Tailscale HTTP Edge에서 자동·수동 계산, 다른 호표 보존, 원천 단가 불일치 시 복원 차단 및 화면 오류 0 확인.
  • 원천 재조회가 꺼진 내역의 비목 지정 변경을 해당 행에만 반영 → 자동·수동 계산, 미연결·다른 행 보존 시험.

    • 자체 검증: 현재 단가를 유지한 비목 지정·일치하는 원천으로 복원, 다른 행·재조회 옵션 보존. 원천 누락·중복·단가 불일치는 복원 차단. Edge에서 자동·수동 계산 확인, 관련 시험 32개 통과.
  • 산출근거 문구 일괄 바꾸기 → 현재 호표·전체 범위, 표지 보존·재계산·실행 취소 확인.

    • 자체 검증: Tailscale HTTP Edge에서 현재 호표·전체 치환, 일치 없음 안내, 결과·단가 표지 보존과 실행 취소 확인. 산출근거 시험 24개 통과, 수식 변경 후 재계산 확인.
  • Excel 파일 읽는 동안 파일·셀 선택이 바뀌면 이전 요청 반영 차단 → 지연 응답 시험.

    • 자체 검증: 지연된 Tailscale HTTP 응답 동안 셀과 파일을 각각 변경하면 이전 요청 반영이 차단되고 다시 실행은 성공. 수량 시험 12개 통과.
  • 자체 검증: 수량·Excel·설계변경·기성·물가변동·연차·문서·오류 기능 회귀 69개 통과(openpyxl 경고 8건). 원본 동등성 대조는 실행하지 않음.

  • 계산 불일치 수량산출서의 계산값을 바꾸지 않는 문구 수정 저장 → 원본 수량·표지 보존과 수량 변경 차단 확인.

    • 자체 검증: main.estx N0000000083 문구를 수정해 저장·재열기한 뒤 원래 수량 286과 다른 행 보존. 산식 계산값·결과 표지 변경 차단, 기존 산식 저장 시험 통과.
  • 삭제된 Excel 연결 대상의 행 식별자 재사용 방지 → 새 행·붙여넣기·Excel 가져오기 오연결 차단.

    • 자체 검증: 삭제된 2번을 예약해 Edge 추가·붙여넣기가 3·4번을 사용. Excel 가져오기 오연결 차단·연결 제거 후 적용 확인. 관련 시험 35개 통과, openpyxl 경고 8건.
  • Excel 수량 연결을 전체 자료 Excel에 포함 → 재가져오기와 잘못된 내역 연결의 전체 적용 차단 확인.

    • 자체 검증: Tailscale HTTP Edge에서 실제 Excel 내보내기·재가져오기와 잘못된 내역 연결 전체 차단 확인. 수량·Excel 시험 25개 통과, openpyxl 경고 8건.
  • Excel 셀과 내역 행 연결을 JSON에 보관하고 다시 선택한 파일로 일괄 갱신 → 중복·누락·오류 시 전체 변경 차단.

    • 자체 검증: Tailscale HTTP Edge에서 2행 연결·JSON 재열기·일괄 갱신·실행 취소·연결 해제 확인. 한 셀 오류 시 두 행 모두 유지, ESTX 저장에서 연결 누락 차단. 수량·첨부·독립 서버 시험 25개 통과.
  • Excel 숫자 셀을 선택한 내역 행의 수량으로 반영 → 파일·시트·셀 오류 차단, 계산·저장·취소 확인.

    • 자체 검증: Tailscale HTTP Edge에서 실제 xlsx B2=6.25 반영·금액 625·취소·JSON 저장, 문자·미계산 수식·누락·범위 오류 차단 확인. 수량·Excel 시험 23개 통과, openpyxl 경고 7건. 자동 파일 감시는 없음.
  • Tailscale HTTP에서 수량산출서와 산출 행 생성 → 생성·JSON 저장·복원 확인.

    • 자체 검증: Tailscale HTTP Edge에서 산출서·행 생성, JSON 저장·재열기 확인. 수량·독립 서버 시험 19개 통과.
  • 기존 계산 불일치 수량산출서도 품명·규격만 바꿀 때 원본 수량 유지 → 실자료 재열기 확인.

    • 자체 검증: 설치 main.estx N0000000083의 저장 286·재계산 100.1 불일치 항목에서 품명만 변경한 뒤 원본 수량 286·문서·다른 문서 보존 확인. 저장·서식 시험 2개 통과.
  • 기존 수량산출 항목의 품명·규격을 ESTX에 저장 → 재열기·다른 항목 보존·연결 변경 차단 확인.

    • 자체 검증: 설치 main.estx 기존 항목의 품명·규격 저장·재열기, 다른 항목·문서 보존과 연결 변경 차단 확인. 저장·수량 관련 시험 22개 통과.
    • 추가 검증: 품명·규격과 산식을 함께 수정한 ESTX의 수량 104→116, 다른 문서·인덱스 보존 확인.
  • 인쇄 서식의 상·하·좌·우 여백 개별 설정과 ESTX 저장 → 기존 단일 여백 호환·실제 서식 재읽기 확인.

    • 자체 검증: 거창 ESTX 여백 13·14·15·16mm 미리보기·JSON 저장과 기존 단일 여백 호환을 Edge에서 확인. 설치 샘플 ESTX 저장·재읽기 포함 관련 시험 24개 통과.
  • 산출근거 계산 오류에서 해당 행으로 이동 → 실무 ESTX 오류와 중복 코드 안전 처리 확인.

    • 자체 검증: 거창 실무 ESTX의 D0000000194:18 계산 오류에서 원본 해당 행으로 Edge 이동 확인. 중복 코드·범위 오류 차단 포함 시험 12개 통과.
  • 다른 이름으로 저장할 때 작업 이름 입력 → 원본·복사본 구분과 저장 취소 확인.

    • 자체 검증: Tailscale HTTP Edge에서 빈 이름 차단, 별도 이름·ID의 사본 저장과 기존 파일 보존 확인.
  • Tailscale HTTP 접속의 새 항목·첨부·공정 생성 오류 수정 → 실제 원격 주소에서 생성과 저장 확인.

    • 자체 검증: Tailscale HTTP Edge의 비보안 컨텍스트에서 UUID·공정·첨부 생성·JSON 저장 확인. 관련 시험 31개 통과.
  • EST 백업 EBKX 파일 열기 → 실무 백업 읽기·JSON 저장·재열기 확인.

    • 자체 검증: 거창 실무 EBKX의 내역 106행을 Edge에서 열고 JSON 저장·재열기; 독립 서버 시험 9개 통과. 원본 EST에서의 백업 호환성은 미확인.
  • Tailscale 주소에서 독립 테스트 서버 접속 → 접속과 계산 요청 확인.

    • 자체 검증: Tailscale IP에서 Edge 화면과 계산 POST 200, 다른 출처 403 확인. 다른 PC에서의 접속은 미확인.
  • 표준시장단가 설계변경 내역·증감 화면·출력 구현 → 신규·삭제·연결 변경 시험.

    • 자체 검증: 표준 내역의 신규·삭제·연결 변경과 문서 기능 시험 21개 통과. Edge에서 증감·삭제 행·인쇄·내역 이동 확인.
  • 표준시장단가 사용 내역·기초 단가 비교 화면·출력 구현 → 연결·중복·누락·행 이동 시험.

    • 자체 검증: 연결 단가·중복·누락·문서 시험 12개 통과, Edge에서 화면·인쇄·해당 내역 이동 확인.
  • 추가 인쇄 서식의 본문 저장·미리보기·Excel 연결 보완 → 서식 문서 검증·재열기 시험.

    • 자체 검증: 문서·Excel 시험 24개 통과, Edge에서 본문 저장·재열기·인쇄·Excel 요약 확인.
  • 기성 회차 이름 변경·추가 시 중복 방지 → 공백·기존 이름 충돌 시험.

    • 자체 검증: 기성·업무 시험 22개 통과, Edge에서 공백 중복 이름 거부·새 이름 생성 확인.
  • 첨부파일 추가 전 256MB 저장 한도 확인 → 대형 파일 차단·기존 작업 보존 시험.

    • 자체 검증: UTF-8·base64 실제 저장 크기 일치·한도 계산 포함 4개 통과. Edge에서 초과 파일 읽기 전 차단·안내 확인.
  • 전체 수량 반영 시 중복·예약 산출서 코드 차단 → 중복 합산 방지 시험.

    • 자체 검증: 중복·빈·예약 코드 차단과 기존 수량 보존 포함 시험 19개 통과.
  • 선택 또는 전체 상세 내역 수량 초기화 → 비율·합계 보존·실행 취소 시험.

    • 자체 검증: 설계변경·이력 시험 9개 통과, Edge에서 선택·전체 초기화, 비율 보존과 취소 확인.
  • 전체 기성 회차 초기화 구현 → 내역·다른 업무 보존·취소 시험.

    • 자체 검증: 기성·이력 시험 9개 통과, Edge에서 초기화·다른 업무 보존·확정 회차 취소 복원 확인.
  • 로컬 첨부파일 추가·내려받기·삭제·JSON 보관 구현 → 파일 바이트·저장·취소 시험.

    • 자체 검증: 입력 검증·ESTX 누락 차단 시험 2개 통과, Edge에서 파일 추가·JSON 저장·재열기·바이트 내려받기·삭제 취소 확인. 업무 회귀 시험 82개 통과(openpyxl 경고 7건).
  • 선택 행 자릿수·사사오입·절사·올림식 일괄 설정 → 선택 범위·재계산·취소 시험.

    • 자체 검증: 업무·수량 시험 21개 통과, Edge에서 두 행 절사 2자리 설정·다른 행 유지·재계산·실행 취소 확인.
  • 일위·산근·기계 묶음 복사 시 기존 코드 충돌 방지 → 묶음·행 보존 시험.

    • 자체 검증: Edge에서 세 자료의 중복 코드 회피와 복사된 묶음 자식 행의 부모 연결 확인.
  • 모든 수량산출서·직접 수식표의 내역 수량 일괄 합산 반영 → 동일 대상 합산·오류 시 전체 차단 시험.

    • 자체 검증: 동일 내역 합산·오류 시 전체 차단 포함 수량·문서 시험 18개 통과, Edge에서 일괄 반영·취소 확인.
  • 2026-11-07: 사용자 지시로 EST 작업 계획과 검증 기록을 공유 PLAN.md에서 이 파일로 이관. 업무 회귀 시험 79개 통과, openpyxl 경고 7건. Git push는 보류.

  • 자료 오류 검색 화면과 해당 행 이동 구현 → 중복·누락 연결·품명·규격 차이 시험.

    • 자체 검증: 중복·누락·품명·규격 차이 시험 포함 19개 통과. Edge에서 오류 목록과 내역 행 이동 확인.
  • 계약심사 화면에서 주요심사내용 작성·저장·출력 연결 → 입력·재열기·인쇄 시험.

    • 자체 검증: 심사·문서 시험 17개 통과. Edge에서 작성·저장·재열기·인쇄 확인.
  • 계약심사 비목 누락 고정금액·중복 식별 처리 보완 → 잘못된 합계·다중 반영 차단 시험.

    • 자체 검증: 고정금액 비목 합계 오류·중복 식별 입력 차단을 포함해 시험 29개 통과, Edge 화면 확인.
  • 직접 작성 수량 수식표 항목 이동 구현 → 수식 참조·저장·실행 취소 시험.

    • 자체 검증: 수량·문서 시험 17개 통과. Edge에서 이동 뒤 참조 오류·서버 저장·재열기·실행 취소 확인.
  • 최근 확정 기성의 누계 수량을 예정공정표 진도로 반영 → 연결·범위·기존 일정 보존 시험.

    • 자체 검증: 최근 확정 회차·미연결·수량 0·범위 오류·일정 보존 포함 시험 18개 통과, Edge 진도 반영과 실행 취소 확인.
  • 인쇄 서식의 계산 결과를 Excel 표로 내보내기 구현 → 실제 Excel 열기·수치 확인.

    • 자체 검증: Edge에서 연차 내역 Excel 다운로드·한글 제목·금액 확인. 요약·오류·수치·입력 검증 포함 문서·Excel 시험 22개 통과(openpyxl 경고 7건).
  • 연차별 개별 내역·배분 금액 출력 구현 → 차수별 계산·수식 오류 시험.

    • 자체 검증: 차수별 배분·오류 표시 포함 문서·연차 시험 13개 통과, Edge 연차 내역 미리보기 확인. 업무 회귀 시험 74개 통과(openpyxl 경고 6건).
  • 물가변동의 중복 코드 내역을 당초와 개별 연결 → 계약·적용제외 계산 시험.

    • 자체 검증: 중복 내역의 개별 계약 단가·적용제외 포함 시험 24개 통과, Edge에서 계약 단가 80·50 표시 확인.
  • 기성 입력·일괄 적용의 중복 행 식별 차단 → 계산·확정·일괄 적용 시험.

    • 자체 검증: 중복 행 계산 및 확정 차단·다른 행 계산 포함 14개 통과, Edge 개별·일괄 입력 차단 확인.
  • 기성 누계수량의 물가변동 연결 보완 → 중복 식별 차단·신규 행 입력 보존 시험.

    • 자체 검증: 중복 식별 차단과 신규 행 입력 보존 포함 시험 13개 통과, Edge 기성 누계 불러오기 확인.
  • 행 복사·붙여넣기에서 다른 종류의 자료가 섞여 손상되지 않도록 제어 → 동일 자료 복사·오류 시험.

    • 자체 검증: Edge에서 다른 자료 종류의 붙여넣기를 차단하고 동일 자료 복사는 유지하는 것을 확인.
  • 내역 선택 행 위·아래 이동 구현 → 행 식별·소계 보호·취소 시험.

    • 자체 검증: 연속 행 이동·소계·식별자 차단 시험 21개 통과, Edge에서 이동·기성 입력 유지·실행 취소 확인.
  • 설계변경 중복 코드 내역의 당초 행 매칭 보완 → 증감·삭제 시험.

    • 자체 검증: 같은 코드의 다중 내역과 삭제 행의 당초 금액 분리를 포함한 시험 20개 통과.
  • 설계변경 원가 비목별 당초·변경·증감 화면과 출력 구현 → 삭제·신규·중복 구분 시험.

    • 자체 검증: 중복·신규·삭제 및 행별 당초 값 포함 시험 15개 통과, Edge 화면과 인쇄 미리보기 확인.
  • 물가변동 원가 비목별 계약·조정·제외 금액 인쇄 구현 → 계산 결과 시험.

    • 자체 검증: 기성·물가변동·문서 시험 21개 통과, Edge 미리보기에서 기성·물가변동 원가와 연차 출력 확인.
  • 기성 원가계산서 인쇄 구현 → 회차별 전회·금회·사정·누계 시험.

    • 자체 검증: 확정 및 다음 회차 금액 포함 시험 15개 통과.
  • 물가변동 전용 Excel 입력과 조사 도급액 입출력 구현 → 행 식별, 오류 차단, 계산 반영 시험.

    • 자체 검증: Excel 관련 시험 12개 통과, Edge에서 실제 파일 수정과 가져오기 확인.
  • 연차 배분 계산 결과와 수식을 출력하는 서식 구현 → 차수별 계산과 오류 표시 시험.

    • 자체 검증: 차수별 금액과 잘못된 수식 오류 표시 포함 시험 11개 통과.
  • 기성 회차와 물가변동 결과 인쇄 서식 구현 → 확정 회차 보존과 계산 결과 시험.

    • 자체 검증: 결과 출력 및 확정 회차 보존 시험 포함 18개 통과, Edge 미리보기에서 두 서식 확인.
  • 2026-11-07 사용자 지시: 동등성 대조와 Git push 보류, CAD 제외 기능 구현 우선.

    • 기능 회귀(2026-11-07): 수량·Excel·심사·설계변경·기성·물가변동·연차·공정·이력 관련 60개 통과(28.41초), openpyxl 날짜 API 경고 5건. 원본 동등성 대조는 실행하지 않음.
    • 수량산출서 신규 생성·이름 변경·산출 행/항목 추가·삭제 및 내역 반영 → 화면 조작과 JSON 저장/복원 시험.
      • 자체 검증(2026-11-07): 수량 화면에서 새 산출서 생성, 항목 추가·품명 변경, 2*3 계산과 내역 6 반영, 서버 JSON 저장·재열기. Edge 브라우저 오류 0, 이벤트 기능 시험 2개 통과. 설치 원본과의 동등성 대조는 사용자 지시에 따라 수행하지 않음. 신규 산출서/행 구조 변경의 원본 ESTX 쓰기는 미지원.
    • 수량산출 행의 순서 변경과 선택 위치 삽입 → 계산 참조 순서·결과 표지 연결 확인.
      • 자체 검증(2026-11-07): 이벤트 시험에서 항목 결과 3·9·13 보존, 선언 이전 참조 오류 확인. Edge에서 행 아래 삽입·위로 이동 및 JSON 저장 후 재열기, 항목 결과 3·9 유지·브라우저 오류 0.
    • 기존 수량 연결의 변경 및 해제 → 비운 연결이 원래 연결로 되살아나지 않는지 확인.
      • 자체 검증(2026-11-07): 기존 LinkCode가 있더라도 TargetCode를 빈 값으로 설정하면 해당 내역 수량을 변경하지 않음. 수량 기능 시험 3개 통과.
    • 수식표와 산출서의 내역 반영을 같은 연결 검사로 처리하고 재계산 메뉴에서 선택한 자료를 반영 → 대상 누락·중복·수식 오류 시 전체 변경 차단.
      • 자체 검증(2026-11-07): 수식표 참조 합계 8, 선택 산출서 9, 기존 MulCode 보존, 없는 대상의 전체 변경 차단. Edge 재계산 메뉴에서 선택 산출서 9·직접 작성 수식표 8 반영, 브라우저 오류 0. 수량·이력 관련 5개 통과. 다른 프로젝트를 열 때 이전 산출서 선택이 남지 않도록 초기화.
    • 예정공정표에 내역 일괄 추가와 금액 가중치 갱신 → 기존 일정·진도 보존 및 중복 방지 시험.
      • 자체 검증(2026-11-07): 같은 코드 2행과 코드 없는 1행을 행 식별자로 구분하고 재추가를 방지, 내역 순서 변경 뒤에도 금액을 연결. 일정·진도·이름 유지 및 연결 모호성 차단을 기능 시험. Edge에서 3행 추가·재추가 방지·금액 200/300/400 갱신 및 JSON 저장, 오류 0. 설치 내역의 코드 없는 39행도 공정 추가 가능함을 확인. 원본과의 동등성 대조 미실시.
    • 수식표 항목 삭제 후 새 항목 추가 시 중복되지 않는 산출코드 생성 → 삭제·재추가와 참조 계산 시험.
      • 자체 검증(2026-11-07): 남은 Q2가 삭제된 Q1을 참조할 때 새 항목을 Q3으로 생성해 참조가 새 항목에 잘못 연결되지 않음을 Edge에서 확인. 수량·공정 기능 시험 9개 통과.
    • 설계변경 비교에서 코드가 없는 내역도 품명과 수량·금액을 표시 → 당초·변경 차액과 화면 표시 시험.
      • 자체 검증(2026-11-07): 코드 없는 earthwork 내역의 당초 100·변경 200·증감 100이 화면에 표시되는지 Edge와 기능 시험으로 확인. 관련 기능 시험 13개 통과·브라우저 오류 0.
    • 수량산출서 인쇄에 직접 작성 수식표와 산출서의 실제 수식·계산값·연결을 표시 → 계산 오류와 출력 데이터 시험.
      • 자체 검증(2026-11-07): 수식표 2·참조 결과 6, 오류 수식의 계산 오류, 산출서 4+5 결과 9·연결 내역을 출력 데이터로 확인. Edge 인쇄 미리보기에서 두 종류의 산식과 결과 표시·브라우저 오류 0, 수량·설계변경·공정 기능 시험 14개 통과.
    • 수량산출과 직접 수식표에서 코드 없는 내역과 중복 코드의 개별 내역 행 연결 → 선택·계산·저장·재열기 시험.
      • 자체 검증(2026-11-07): 같은 코드의 두 내역 중 둘째 행과 코드 없는 내역에 각각 6·9를 반영하고 JSON 저장·재열기 및 인쇄에서 대상 확인. 직접 수식표의 코드 없는 행 선택·결과 5 반영·연결 해제, 내역 순서 변경 뒤 식별자 유지, 잘못된 식별자 차단. Edge 오류 0, 기능 시험 15개 통과.
    • 연차 차수 위·아래 이동과 중복·기존 참조를 피하는 신규 차수 이름 생성 → 참조 순서 오류·저장 복원 시험.
      • 자체 검증(2026-11-07): 기존 2차가 삭제된 1차를 참조하면 새 이름을 3차로 생성. Edge에서 2차를 1차 앞으로 이동했을 때 참조 오류 표시, 변경 순서 저장, 다시 원래 순서로 옮겨 오류 해소 확인. 연차·수량 기능 시험 10개 통과, 브라우저 오류 0.
    • 계약심사 화면: 사용자가 심사 수량·비목별 단가를 입력하고 기존 내역/심사액·차액을 비교, 심사 사본 열기와 JSON 저장 → 입력·원가 재계산·취소·저장/복원 시험. 자동 심사율·법적 기준은 정하지 않음.
      • 자체 검증(2026-11-07): 일반 단가 행과 고정금액 행을 수정해 원가 포함 기존 1,210→심사 198 계산, 기존 내역 보존·실행 취소·JSON 저장/재열기·독립 ID의 심사 사본 확인. 잘못된 입력·없는 행의 사본 생성 차단. Edge 오류 0, 관련 기능 시험 47개 통과(25.68초). 원본 계약심사 동작 대조는 수행하지 않음.
    • 계약심사 결과요약서에 기존액·심사액·차액과 내역별 비교 출력 → 출력 데이터·미리보기 확인.
      • 자체 검증(2026-11-07): 기존 200·심사 80·차액 -120 및 코드 없는 내역을 요약서 출력 데이터와 Edge 인쇄 미리보기에서 확인. 심사·문서 관련 8개 통과, 브라우저 오류 0.
    • 직접 작성 수식표·예정공정표 Excel 내보내기와 가져오기 → 참조 수식·내역 행 연결·일정·진도 유지 및 잘못된 입력 차단.
      • 자체 검증(2026-11-07): Edge에서 Excel 내려받기→openpyxl로 수식·진도 변경→가져오기 및 내역 식별자 보존. 중복 코드·소수자리·진도 오류 차단, Excel·수량·공정 관련 17개 통과. openpyxl 환경의 날짜 API 사용 중단 경고 2건, 실패 0.
    • 산출근거의 내부 표지 문자가 Excel 파일을 손상하지 않도록 인코딩·복원 → 원본 표지와 표지처럼 생긴 일반 문자 왕복 확인.
      • 자체 검증(2026-11-07): 제어 문자가 포함된 Excel 파일이 XML 파싱에 실패하던 상황을 재현한 뒤, 표지와 일반 문자열 _x0012_를 구분해 저장·openpyxl 편집·브라우저 재가져오기 왕복 확인. Edge 오류 0.
    • 수량산출서 문서·산출 행·항목의 Excel 내보내기와 편집 후 가져오기 → 표지·내역 연결 보존 및 계산 확인.
      • 자체 검증(2026-11-07): 세 Excel 시트 내보내기, 산출 행 2×3→2×4와 품명 수정 후 가져오기, 표지·내역 행 연결·Excel 미표시 속성 보존 및 내역 수량 8 반영을 Edge에서 확인. 누락 시트·잘못된 표지·중복 순서 차단과 빈 원래 필드 유지, 수량·Excel 기능 시험 14개 통과. Edge 오류 0; openpyxl 날짜 API 사용 중단 경고 3건, 실패 0.
      • 추가 보완: 기존 LinkCode만 있는 항목은 Excel에서 연결을 변경하지 않았을 때 새 연결 필드를 덧붙이지 않고 원래 구조를 유지.
    • 수량산출 행 편집 중 결과 표지가 삭제되거나 추가되면 이전 저장 수량이 잘못 적용되지 않도록 차단 → 화면·Excel 편집 후 계산 시험.
      • 자체 검증(2026-11-07): 결과 표지가 0개 또는 2개인데 연결 표지가 1개인 행의 계산 오류와 내역 반영 차단, 기존 수량 1 유지. Edge에서도 표지 삭제 후 반영 차단·오류 0, 수량·Excel 기능 시험 15개 통과.
    • 계약심사 항목별 검토 사유 입력·저장 및 요약서 출력 → 금액 재계산과 사유 보존 시험.
      • 자체 검증(2026-11-07): 심사 단가 변경과 한글 사유 입력 후 JSON 저장·재열기, 심사액 160과 요약서 사유 표시를 Edge에서 확인. 관련 기능 시험 8개 통과, 브라우저 오류 0.
    • 계약심사 입력·사유 Excel 내보내기와 수정 후 가져오기 → 내역 행 연결·재계산·입력 검증 시험.
      • 자체 검증(2026-11-07): Excel Review 시트에서 심사 단가 80→60과 사유를 변경해 가져온 뒤 심사액 120 및 화면 사유 표시 확인. 중복 식별자·잘못된 숫자·식별자 오류 차단, 심사·Excel 기능 시험 12개 통과. Edge 오류 0, openpyxl 날짜 API 경고 4건.
    • Excel 계약심사 입력이 존재하지 않거나 중복된 내역을 가리키면 가져오기 자체를 차단 → 다른 표 교체도 함께 취소되는지 확인.
      • 자체 검증(2026-11-07): 없는 내역 및 해당 행에서 사용할 수 없는 비목 입력 차단. Edge에서 잘못된 심사 행과 내역 수량 변경을 함께 가져왔을 때 두 변경 모두 적용되지 않음 확인. 심사·Excel 시험 14개 통과, 브라우저 오류 0.
    • 계약심사 개별 행의 입력·사유 초기화 → 다른 행 입력과 실행 취소 보존 시험.
      • 자체 검증(2026-11-07): 한 행만 초기화해 다른 행의 수치·사유 유지, 마지막 행까지 초기화 시 심사 작업 비우기. Edge 실행 취소로 초기화된 사유 복원, 심사 기능 시험 4개 통과, 브라우저 오류 0.
    • 계약심사 고정금액 행의 사유·수량만 변경해도 기존 금액이 유지되도록 처리 → 비목 금액 변경과 구분 시험.
      • 자체 검증: 수정 전 문제 재현, 수정 후 금액 유지와 비목 변경 재계산 확인. 관련 시험 16개 통과.
    • 연차 차수와 미확정 기성 회차·입력 Excel 편집 → 확정 회차의 계약·누계 보존 및 가져온 업무 계산 시험.
      • 자체 검증(2026-11-07): 확정 회차는 내보내기 대상에서 제외하고 기존 계약·누계를 그대로 유지. Edge에서 미확정 금회 수량 1→3, 연차 수식 50%→25%를 Excel로 변경해 가져온 뒤 기성 누계 500·연차 250 확인. 없는 행·확정 회차·중복 ID·잘못된 입력 차단, Excel·기성·연차 시험 22개 통과. Edge 오류 0, openpyxl 날짜 API 경고 5건.
    • 내역·일위대가 행의 경비성단가(ActionSetJCBimog) 및 순공사비 경계 행(popMainSetTotalSumLine) 화면 조작 메뉴와 토글 재계산 지원.
      • 자체 검증(2026-11-08): REA ActionSetJCBimog(0xf17c10/0x10dba14) 및 popMainSetTotalSumLine 근거를 기반으로 toggle-jc-bimog, toggle-sun-gongsa 조작 액션 구현.
        1. 경비성단가 보존 및 복원: SCheck=1(재료) 또는 2(노무) 상태에서 경비성단가 지정(SCheck=3) 후 해제 시 원래의 SCheck 값(_prevSCheck)으로 온전히 복원(기존 비목별 0으로의 왜곡 차단), 노무비(SCheck=2, NU=2000)가 SCheck=3 전환 후 해제 시 SCheck=2, NU=2000으로 복원됨을 검증.
        2. 순공사비 연결 행 보호: 원천 연결(자재/노임/일위/단가/기계 등 LinkIndex 5, 6, 21, 51, 52, 55, 57, 58, 61, 62, 67, 68, 101~105) 또는 코드·수량이 있는 상세 행의 순공사비 경계선 지정을 안전하게 차단("단가·수량 연결 행이나 기존 특수 공종 행은 순공사비 경계선으로 지정할 수 없습니다. 빈 제목/구분 행을 선택하세요.").
        3. 순공사비 속성 보존/복원: 기존 54 행이 있을 때 새 행을 순공사비로 지정하거나 해제 시 원래의 LinkIndex와 Name(_origLinkIndex, _origName)으로 정확히 복원됨을 검증.
        4. 안전성 거부 4건(비허용 화면 호출, 선택 없음, 복수 순공사비 지정, 원천 연결 상세행 지정 거부) 전수 확인. 신규 전용 시험 resources/tester/test_est_row_actions.py 통과.
    • 남은 웹 업무 기능을 이어서 구현하고 각 기능의 입력·계산·저장 흐름 확인.
  • ESTX 원본 옵션·공사명 및 기존 BLOB 확장 저장 구현 → 설치 샘플 재읽기와 인덱스·다른 자료 보존 확인. CAD 제외.

    • 자체 검증(2026-11-06): 설치 sample.estx에서 한글 공사명·자동계산·절사·자릿수 변경과 BLOB 12,000바이트 확장 저장 후 재읽기, 다른 속성·전체 인덱스·CAD 보존 확인. EST 전용 100개 통과(51.80초). 독립 파서 대조이며 원본 EST에서 파일을 열어보지는 못함.
  • WPTools 수량산출서의 기존 서식 구간 안 텍스트 편집 저장 → 실제 수량산출서 샘플 재읽기와 다른 문서 보존 확인.

    • 자체 검증(2026-11-06): main.estx의 75개 수량산출서 중 한 문서 편집·재읽기, 나머지 문서·인덱스·CAD 유지, 서식 구간을 가로지르는 편집 거부 확인. EST 전용 102개 통과(70.77초). 원본 EST 직접 실행 비교는 미실시.
  • 원본 결과와 기존 계산이 일치하는 수량산출서의 결과 표지·수량 목록 재계산 저장.

    • 자체 검증(2026-11-06): main.estx 수량산출서 폭 9→10 변경 시 표지 및 목록 수량 104→116으로 기록·재읽기, 다른 문서·인덱스·CAD 보존. EST 전용 102개 통과(70.78초). 계산 오류·기존 결과 불일치 문서는 저장을 거부하며 원본 EST 실행 검증은 미실시.
  • 서식 구간을 넘는 수량산출서 편집과 목록·연결 변경 지원; 계산 오류나 기존 결과 불일치 문서의 처리 확인.

    • 추가 조사(2026-11-10): 설치 프로젝트 ESTX 24개와 기술정보 DB의 ESTX에서 MulCode와 MullangIndex가 함께 있는 내역을 검색했으나 발견하지 못했다. 신규 수량 연결의 원본 저장은 실제 연결 자료 없이 임의 확정하지 않는다.
    • 진행 및 미완료 범위(2026-11-08):
      1. 서식 편집 지원: 수량산출서 편집기에서 위첨자(^(2) 등) 및 복합 서식 태그 경계를 가로지르는 텍스트 수정(abc^(2)def -> abc^(3)xyz) 시 분할된 서식 런을 유지하며 인라인 패치 적용 확인 (test_quantity_document_edit_across_styles_and_superscript_preserves_structure 통과).
      2. 불일치 문서 처리: 원본 저장 수량과 산식 계산 결과가 다른 불일치 문서(예: N0000000083 원본 286 vs 산식 100.1)의 경우, 품명/규격/단위(Unite) 편집 시 기존 원본 수량(286)을 보존해 ESTX 패치를 허용하며, 산식을 수정해 결과가 변경되는 경우 "수량산출서 원본 결과와 재계산 값이 다릅니다. JSON으로 저장해 확인하세요"로 ESTX 덮어쓰기를 안전 차단함을 확인.
      3. 미완료 범위(제한 사항): 수량산출서 목록·연결(항목 추가/삭제, 수량산출서 신규/삭제, 행 구조 증감 등) 변경 시 ESTX 저장(MulMainDat, MulTitleDat, Editor, MulList)은 고정 인덱스 및 BLOB 구조 보존을 위해 현재 안전 차단되어 있으며, JSON 저장소(project.quantitySheets)에서만 지원됨. ESTX 목록·연결 구조 변경 저장은 미완료 상태임.
      4. 관련 회귀 시험 test_est_quantity_workflow.py 12개, test_est_business.py 18개, test_est_native_export.py 수량/위첨자 10개 전수 통과.
  • 수량산출 항목의 단위(Unite) 화면 입력 열과 ESTX 저장 → 재열기·다른 항목 보존·목록 바이너리 검증.

    • 자체 검증(2026-11-07): native-quantity 렌더러에 단위 입력 열 추가 및 change 핸들러에서 Unite 변경 허용. 설치 main.estx 기존 항목의 품명·규격과 함께 단위(Unite: 'm2')를 수정해 브라우저 이벤트·저장·재열기, 다른 항목·연결·수량 보존 및 실행취소 확인. 단위 변경 시 산식 계산 불변 확인(퍼센트 등 임의 자동변환 없음). test_est_quantity_workflow 12개 및 test_est_native_export 회귀 14개 통과. 원본 EST 실행 검증은 미실시.
  • 수량산출서의 연속 글자 서식에 걸친 텍스트 편집 저장 → 서식 태그 보존 및 재읽기 검증.

    • 자체 검증(2026-11-07): 서로 다른 세 글자 서식에 걸친 텍스트를 변경한 뒤 태그와 재읽기 결과를 대조. 변경 시작 위치의 서식으로 새 텍스트를 저장하며 위첨자·표지를 넘는 임의 편집은 계속 제한. 관련 시험 10개와 EST 전용 120개 통과(77.60초). 원본 EST 실행 비교는 미실시.
  • 설치 수량산출서의 실제 글자 서식 경계 편집을 회귀시험으로 보존 → 해당 문서와 태그 재읽기.

    • 자체 검증(2026-11-07): main.estx N0000000113의 27.22 <c nr=12/>= 경계를 직접 변경하고 모든 태그와 재읽기 행을 비교. 설치본이 없으면 시험은 건너뜀. 해당 시험 1개 통과(4.13초). 문서 편집기 자료의 재읽기 검증이며 산식 의미 변경과 원본 EST 실행 비교는 아님.
  • 수량산출서의 내역 수량 반영에서 실제 내역이 없는 코드와 중복 코드를 차단 → 제목만 존재·중복·정상 연결 시험.

    • 자체 검증(2026-11-07): 동일 코드의 상세 행 두 개가 모두 7로 바뀌던 오류를 재현하고 변경 없이 오류 표시하도록 수정. 제목만 존재하는 코드, 제목과 상세가 함께 있는 정상 코드, 여러 연결 중 하나가 없는 경우의 전체 반영 중단을 확인. 관련 시험 1개와 EST 전용 121개 통과(79.70초).
  • 한 수량산출서 행에서 글자 서식 경계와 다른 표지 구간을 동시에 편집 → 태그·표지 유지와 재읽기 확인.

    • 자체 검증(2026-11-07): 두 서식에 걸친 문구와 별도 결과 표지 숫자를 동시에 수정하는 실패를 재현한 뒤 태그 보존·재읽기 일치 확인. ESTX 내보내기 관련 11개 통과(27.74초); 전체 121개 시험 이후 저장 경로의 이 조합만 추가 수정.
  • 기성 회차에서 원가 기호가 없는 여러 항목의 전회 누적을 항목별로 유지 → 설치 샘플의 빈 기호 확인 및 복수 항목 회차 시험.

    • 자체 검증(2026-11-07): 설치 sample.estx에서 빈 기호 원가 행 확인. 합성 기성 2회차에서 앞 항목의 전회 200이 뒤 항목의 100으로 덮이던 실패를 재현한 뒤 200/100과 누계 500/250 확인. 기성 7개와 EST 전용 123개 통과(78.90초). 기호가 없으면 항목 이름과 동일 이름의 순서로 대응하므로 회차 사이에 같은 이름 항목을 재배열하면 원본 식별 근거가 부족함.
  • 연차 이름이 기준 참조 예약어와 겹쳐 차수를 잘못 참조하는 경우 차단 → 예약어와 정상 차수 시험.

    • 자체 검증(2026-11-07): 기준·계약·계약수량 이름이 차수 참조 대신 계약값으로 처리되던 상황을 재현하고 오류로 차단. 일반 차수 참조의 잔액 50 확인. 연차·업무 관련 16개 통과(14.08초). 기존에 예약어 이름을 사용한 웹 작업은 차수 이름과 참조를 바꿔야 함.
    • 추가 전체 회귀: EST 전용 125개 통과(81.45초). 원격 CODEX 브랜치는 서버의 CODEX.lock으로 push가 거부되어 로컬 커밋 보존 중.
    • 분석(2026-11-06): REA 0x11167e4는 MulCode를 0xa911d0으로 분해한 뒤 수량 문서·항목을 찾고 GN을 복사한다. 0xa911d0 기계어의 구분 문자열은 탭이다. 설치된 24개 ESTX의 내역 테이블에서는 MulCode가 채워진 사례가 없어 BLOB 인코딩·신규 할당의 원본 검증은 아직 부족하다.
  • 기존 ESTX 기본 수량 연결을 웹에서 표시 → REA의 탭 분리·대상 찾기 조건과 중복 연결 경고를 합성 데이터로 검증.

    • 자체 검증(2026-11-06): 탭 분리 ASCII/UTF-16·기본 모드·중복 내역/다른 모드 경고 합성 시험 통과, EST 전용 117개 통과(76.52초). 실제 연결된 ESTX 샘플과 신규 연결 쓰기는 여전히 미확인.
  • 기성 원가계산서의 명시적 0원 도급액 보존 → 직접공사비가 양수인 경우와 원가계산서가 없는 경우를 각각 시험.

  • 물가변동 계약·제외·조정액 계산에서도 명시적 0원 도급액과 원가계산서 없는 경우를 구분.

    • 자체 검증(2026-11-07): 수정 전 0원이 직접공사비로 대체되는 실패 재현, 수정 후 기성·물가변동에서 0원 보존 및 원가계산서 부재 시 직접공사비 대체 확인. 관련 11개와 EST 전용 119개 통과(76.85초). 원본 EST 실행 비교는 미실시.
  • 수량산출서 한 줄에서 서로 다른 표지 구간의 텍스트를 함께 수정하는 저장 지원 → 표지·서식 보존과 다중 편집 재읽기 검증.

    • 자체 검증(2026-11-06): 설치 main.estx에서 한 줄의 품명·수식을 함께 변경해 모든 WPTools 태그 유지, 전체 ESTX 재읽기와 수량 104→125 반영 확인. EST 전용 115개 통과(77.82초). 같은 구간 안 여러 서식을 가로지르는 편집과 목록·연결 변경은 미완료.
  • 변경 없는 JDL 재출력 시 원본 확장 자료 보존, 수정 시 원본 무조건 반환 방지 → 서버 재계산을 거친 왕복과 수정 구분 시험.

    • 자체 검증(2026-11-06): 임의 확장 파일이 포함된 JDL 원본 바이트 일치, 저장 ID 부여 후 보존, 이름 변경 후 새 이름으로 변환 및 경고 확인. EST 전용 103개 통과(71.14초). 원본 검사 DLL 인증은 미확인.
  • 인쇄 서식 선택 시 원본 서식에서 적용한 여백·행 수가 설정 입력란에도 표시되도록 수정.

    • 자체 검증(2026-11-06): Node DOM 모의에서 서식 선택 후 여백 20·행 수 21이 입력란에 반영되는지 확인. 원본 인쇄 배치 비교는 아님.
  • JDL 일위대가의 기본 상세 항목 불러오기 → 자원 연결·저장 금액 보존 및 특수 항목 경고 검증.

    • 자체 검증(2026-11-06): 합성 JDL에서 자재 연결·수량 2·금액 200 보존 및 특수 플래그 경고, 서버 계산 경로 통과. EST 전용 104개 통과(71.49초). 원본 JDL 실자료·실행 대조는 미실시.
  • JDL 기본 일위대가 구성 내보내기 및 불러오기 왕복 → 상세 자원·수량·금액 보존, 특수 구성은 기존 전개 경고 유지.

    • 자체 검증(2026-11-06): 합성 자재 일위의 상세 수량·금액 및 내역 참조 왕복, 특수 구성의 전개 경고 확인. EST 전용 105개 통과(72.38초). 원본 JDL 인증·실행 대조는 미실시.
  • 해양 자료 산식의 단위·도식·그리스 변수·중괄호 수식 해석 개선 → 실제 행 시험과 원본 저장값 대조.

    • 자체 검증(2026-11-06): 해양 오류 95→37건, 저장값 134,159/134,208 일치(기존 134,133); 수치 뒤 중괄호 주석을 산식으로 잘못 읽던 회귀 1건 수정. 측량 80,671/80,682·산림 15,049/15,055·가시설 13,978/13,979 및 오류 수 기존과 같음. EST 전용 110개 통과(73.49초). 누락 변수·모순 부호와 나머지 오류는 미해결.
  • 해양 자료의 복합 단위·괄호 설명 산식 추가 처리 → 실제 저장값과 다른 자료 회귀 비교.

    • 자체 검증(2026-11-06): 해양 오류 37→22건, 저장값 134,159/134,208 유지. 측량·산림·가시설 대조 결과 변화 없음. 수준면 주석·도식 병기 및 붙은 변수 확장은 저장값 36/69건 차이가 발생해 보류.
  • 근사값이 병기된 변수 선언을 계산 값과 설명으로 분리 → 실제 원본 대조에서 기존 값 유지 확인.

    • 자체 검증(2026-11-06): Q1=3.2hr ≒ 0.5일 선언 및 참조 시험, 해양 오류 22→21건·저장값 134,159/134,208 유지, 측량·산림·가시설 결과 유지. EST 전용 116개 통과(77.02초).
  • ESTX에 저장된 인쇄 서식 설정 읽기·미리보기 반영 → 설치 샘플의 서식 수·여백·행 수 및 원본 파일 보존 확인.

    • 자체 검증(2026-11-06): 설치 sample의 41개 서식과 프로젝트명·여백·행 수, 인쇄 설정이 포함된 10개 ESTX 읽기, DOM 모의에서 프로젝트 설정 우선 적용 확인. EST 전용 113개 통과(72.97초). 웹 인쇄 설정의 ESTX 쓰기·원본 출력 배치 비교는 미완료.
  • 웹에서 변경한 인쇄 서식의 여백과 페이지당 행 수를 ESTX 원본 옵션에 기록하고 다른 필드 보존 검증.

    • 자체 검증(2026-11-06): DOM 모의에서 사용자 여백 13·행 수 19 기록, 설치 sample에서 해당 서식 재읽기 및 나머지 서식·압축 내 파일 바이트 보존, 범위 밖 값 거부와 서버 계산 후 기록 유지 확인. EST 전용 114개 통과(73.42초). 원본 EST 실행 검증은 미실시.
  • 2026-11-06 후속 요청 — CAD 편집을 제외한 잔여 기능 구현. 기존 내역·계산·업무 기능을 유지하며 출력/변환과 원본 저장 경로를 확장한다.

    • REA와 설치 자료에서 인쇄 서식·XML/JDL·Excel·ESTX 저장 구조 확인 및 지원 범위 명시.
    • 전체 자료 Excel 입출력과 출력 서식/페이지 설정을 실제 파일·화면에서 검증.
    • DB의 XSD 1.0.5에 따른 XML 입출력·계층/원가/단가 변환, JDL 기본 표 입출력, 동일 구조 ESTX 수정 저장 구현·왕복 검증. 근거 미확인 형식을 완전 호환으로 가장하지 않음.
      • 구현: Excel 스칼라 표/자료형과 기존 바이너리 보존, 단가 수정 전파, 코드/수식/중복 검사. XML 작성정보·연결/길이 검사·금액 보존 및 자동계산 해제, UTF-8/CP949/UTF-16 입력. JDLCHK 필드 정의와 EST TAB/ENQ·CP949 처리 경로에서 기본 표/ZIP 생성·읽기, 고정 단가 전개 제한 표시. ESTX 고정 행·비인덱스 필드/BLOB 원가 기록과 재읽기 검산. 재계산이 원본 호표 목록 PkID/인덱스 식별자를 버리던 문제 수정.
      • 화면: CAD 제외 서식 이름 40개, 데이터 출력 및 서식별 직접 입력 문서, 용지/방향/여백/글자/행/쪽 번호. 예정공정표 기간·진도·가중치 입력/검사·기간 막대·가중평균, 공종별 동원 분리 출력. JSON 저장/재열기 및 이력 대상.
      • 자체 검증(2026-11-06): Edge에서 XML 다운로드→실제 XSD 통과→재열기 금액/상하위 계층/0원 도급액 보존, JDL 다운로드/재열기 직접비·원가 보존, 예정공정 입력/저장 복원, CAD 제외 40개 서식 선택 시 JS 오류 0. Excel 왕복 시 바이너리·소수 유지, 66행 20행/쪽 분할과 쪽 번호 5~8, 본문/설정 저장 재열기 통과. 별도 openpyxl 읽기로 xlsx 구조/자료형 확인. 설치 sample.estx의 수량 변경→수정 저장→독립 재읽기 통과, 모든 .idx 바이트 불변. 원본 EST 실행 검증은 아님.
    • ESTX 신규 파일/행 증감·키 변경의 인덱스 재생성 구현 가능성 조사 및 점검.
    • 조사 및 한계 분석(2026-11-08):
      1. 파일 구조: 설치 ESTX 24개에 든 .idx 468개의 오프셋 9~24는 모두 8abe8e592364cb403d71d2e3bc64d001이다. 이 값은 DBISAM 공식 문서의 기본 엔진 서명 DBISAM_SIG를 MD5 해시한 값과 일치한다. 바로 앞 06은 해시의 일부가 아니다. 교량 샘플에서는 비어 있는 페이지와 레코드 번호처럼 보이는 평문 바이트열도 확인되어 전체가 암호화됐다는 기존 추정은 잘못됐다. 페이지·트리 갱신 규칙은 미확인이므로 쓰기에는 사용하지 않는다: https://www.elevatesoft.com/manual?action=viewtopic&id=dbisam4&product=rscpp&topic=customizing_engine&version=XE .
        • 추가 조사(2026-11-11): 설치 sample.estx의 내역 표는 76행일 때 인덱스 첫 4바이트 값 77이지만, 빈 CadMainDat은 3이고 빈 CadTitleDat은 1이다. 이 값만 행 수에 맞추는 방식으로는 인덱스를 재생성할 근거가 없다. 공식 문서는 한 인덱스 파일이 여러 인덱스 정의와 페이지를 포함한다고 설명한다: https://www.elevatesoft.com/manual?action=viewtopic&id=dbisam4&product=rsdelphiwin32&topic=dbisam_architecture&version=11 .
        • 추가 조사: DBISAM은 REPAIR TABLE ... FORCEINDEXREBUILD를 제공한다(https://www.elevatesoft.com/manual?action=viewtopic&id=dbisam4&product=rsdelphiwin64&topic=repair_table_statement&version=XE5). 이 PC의 32·64비트 ODBC 등록 목록에서 DBISAM 드라이버를 찾지 못했다. 공식 시험판 다운로드는 로그인 후 가능하며, 원본 엔진 서명·버전과의 호환성은 확인하지 못했다.
        • 추가 확인(2026-11-11): C:\Program Files, C:\Program Files (x86), C:\Dasansoft에서 등록되지 않은 dbodbc*.dll도 찾지 못했다. 대체 오픈소스 PyDBISAM 1.2.1은 원본 표부터 필드형 오류로 열지 못하고 인덱스 쓰기도 제공하지 않는다. 따라서 해당 도구로 재생성하거나 정상 여부를 판정할 수 없다.
      2. 무결성 검증 제약: exportEstx는 동일 행 수 및 비인덱스 필드(수치, 일반 텍스트, BLOB 데이터 등)의 수정 저장을 안전하게 지원하지만, 행 추가/삭제나 인덱스 키(PkID, Code, Index, RecNo 등)를 변경하면 .idx의 B-Tree 구조와 불일치가 발생함. 원본 Delphi/DBISAM 엔진 외부에서 인덱스 재생성을 구현할 수 있는 바이너리 규격이나 소스 근거가 부재함.
      3. 구현 범위 및 처리: 따라서 ESTX 내 행 추가/삭제 및 인덱스 키 변경은 기존처럼 명확한 예외 메시지({key}: 행 추가/삭제는 인덱스 재생성이 필요합니다, {key}.{name}: 인덱스 키 변경은 지원하지 않습니다)로 안전 차단하고, 신규 파일/행 증감/자유로운 편집이 필요한 작업은 JSON 저장소(project.tables)에서 완전 무결하게 지원·보존하도록 범위를 명확히 유지함.
  • 남은 완전 호환 범위: ESTX 신규 파일/행 증감·키 변경의 인덱스 재생성, WPTools 편집 저장, 기성/연차 원본 별도 업무 파일; JDL 확장 산식/기성·물가 자료와 원본 검사 DLL 인증; 원본과 같은 인쇄 도형/배치 및 기존 산식 잔여 오류. CAD만 제외한 전체 완료로 판정하지 않음.

    • 추가 조사(2026-11-10): 설치 프로젝트와 기술정보 DB의 ESTX 압축 항목을 확인했으나 REA가 기성 파일 표로 지목한 AccomMainTable.Dat 또는 연차 관련 이름의 파일은 찾지 못했다. 웹앱 자체 기성·연차 저장과 별도로 원본 업무 파일의 필드·저장 검증은 계속 미확인이다.
    • 전용 회귀·포맷·700줄 제한·커밋/push 마무리. 검증 서버 종료 완료.
      • 자체 검증: EST 전용 전체 99 통과(48.88초). 변경 파일만 prettier/ruff format, git diff --check와 모든 소스 700줄 이하 확인. a5157dd3a 커밋을 CODEX에 push, origin/CODEX와 차이 0·작업 트리 깨끗함 확인. 검증 서버 5175 종료, 이번 일회 UI/분석 스크립트·출력물·전용 시험 저장본 정리. 기존 원본 자료와 앱 data는 수정하지 않음.
  • 2026-11-06 사용자 지정 완료 범위 — 설계변경·기성·물가변동·연차 네 업무. 원본 실행 없이 REA 근거·시나리오·저장 복원으로 구현 완료를 판정하며, 전체 EST/CAD/변환 기능 완료와 구분. 검증 서버는 브라우저 시험 중만 실행하고 종료.

    • 설계변경: 당초 불변, 신규·삭제·변경의 수량/금액 비교, 0/1/2 당초 재계산과 저장/취소.
    • 기성: 수량·금액·비율 입력, 비목·비율/관급 행·고정 금액, 금회/사정/전회/누계·원가, 회차 확정/수정과 서버 저장 검산.
    • 물가변동: 입찰/계약/변동 단가 분리, 등락 분기·조사금액을 분모로 한 조정률, 적용제외 max/자동·수동 및 간접비 포함 적용대가, 입력 제어·저장 복원.
    • 연차: 차수 수식과 참조·정수 절사·잔액, 관급/비율/고정 금액, 독립 사본 및 오류 차단·저장 복원.
      • 자체 검증(2026-11-06): EST 전용 87개 통과, 이후 추가한 당초 재계산 0/1/2 시험 포함 설계변경 3개 통과(총 88개). Edge에서 신규/삭제 비교·저장 재열기, 기성 금액/사정/누계 원가·확정/이후 회차 해제·서버 결과 변조 재검산, 계약/입찰 파일 순서 연결·자동/수동 제외·조사금액 분모·저장 복원 통과. 연차 성분/잔액·수식 수정·수수료99/관급/안전관리비·사본 독립 ID·저장 재열기 통과, JS 오류 0. 신규/복사 행이 삭제된 계약/기성 행 ID를 재사용하지 않도록 수정. 원본 업무 실행 샘플이 없어 런타임 동등성은 미확인.
      • 통합 시험 제한: 기존 spreadsheet_size 빌드가 config/node_modules의 delaunator·@kninnug/constrainautor 누락으로 실패(41 통과 후 1 실패). EST 범위 밖이므로 수정하지 않음.
    • 네 업무 전용 회귀와 실제 Edge 조작/저장/취소를 통과하고 변경 파일 포맷·700줄 제한 확인, 커밋/자기 브랜치 push.
      • 마무리: 변경 파일만 prettier/ruff format, git diff --check와 소스 700줄 이하 확인. 74ab66b00 커밋을 CODEX에 push 완료. 검증 서버 종료 및 5175 수신 없음 확인.
  • 2026-11-05 연차 관급 수수료: REA f0fcc0의 LinkIndex 57→99와 GN 유지·성분 금액 배분을 반영. 고정 배분액의 저장/반복 계산 및 관급 원가·수수료 제외 옵션을 검증.

    • 자체 검증: 기존 57행을 0원으로 만드는 실패를 재현한 뒤 수정. 연차 사본에만 원래 57행임을 보존해 관급 원가의 조달수수료 제외 계산 유지. 합산 제외 행은 원가 제외 상태 보존. 전용 시험 74 통과, 1,361원 모의 계약을 680/681원 배분 및 반복 계산 불변, 40% 변경 시 수수료 12/18·금액 544/817 검증. 원본 업무 실행 대조는 아님.
    • Edge 자체 검증: 차수 사본의 99 표시·원래 요율 유지, 원가 반영, 저장/재열기·JS 오류 0. 원본 ID를 복제해 덮어쓰던 위험 제거(차수 파일 ID 별도 생성), 저장된 원본 1,361원·수수료 30 보존 확인. 차수 내역 열기 시 내역서 화면으로 이동. 기존 연차·저장 대기/재시도 회귀 확인. 원본 23파일의 대조 수·해석 오류 수는 직전 결과와 동일해 추가 회귀 없음.
  • 2026-11-05 후속 산근 문법: 연산자 뒤 공백의 참조/선언 구분, 원본 금액 단위, 결과를 감싼 중괄호와 주석형 계산, 수치 범위 조건 구분. 원본 발췌·변경 전파·잘못된 참조 거부 시험 및 원본 전체 대조로 검증.

    • 자체 검증: 전용 시험 72 통과. 원본 23파일 재대조에서 측량설계 80,671/80,682 일치·해석 오류 0, 산림토목 15,049/15,055 일치·오류 0, 해양 134,133/134,208 일치·오류 95. 상수공사 중괄호 산식의 저장 표지 1.7과 계산 1.79 차이는 원문 표지 오류 후보로 남김(정상값으로 위장하지 않음).
    • REA f250bc/f251d5-f251df의 Extended 누적 후 자릿수 적용을 확인하고 소계의 사전 Currency 4자리 절삭 제거. 실제 수량 0.169776·재료비 98,103.7 재현. Edge에서 치수 편집→소계 0.179496·재료비 103,720.3·내역 1,037,200 전파, 서버 저장/재열기·취소 확인, JS 오류 0.
    • 설명에 붙은 변수의 자동 인식은 부호 해석과 수치 대입식의 충돌 때문에 적용 보류. REA 937958/936bd0/9392e0의 중괄호 토큰 경로를 확인했으나 변수 치환까지 증거가 충분하지 않아 기존 연결 규칙을 유지. 기존 전체 동등성 미완료 항목과 별개.
  • 2026-11-05 산근 지정 단가·절사 합계 보완: 원본 f2f2e4→f2ef54 구간 수집과 지정 단가 원문 확인. 결과 없는 단가 행 갱신 보존, 구간/소계에 03 단가 표지 포함, Link62의 합계 표지를 최종 자동합계와 구분. 따옴표 Q1 선언 지원. 앞 성분의 저장 합과 절사 관계가 확인되는 정수 최종합계는 변경 성분에서 재집계. 측량설계 80,659/80,682 일치·오류 5건. 해양 운반비의 결과 없는 하역료 소계 누락을 추가 수정해 신규 불일치 해소. 전용 시험 64 통과, Edge에서 단가 550→600·구간 27.5→30·최종 27→30·내역 270→300 전파 및 저장·취소 확인, JS 오류 0. 저장 대기·재시도 회귀도 통과. 원본 전체 동등성 미완료.

  • 2026-11-05 원본 산근 문법 보완: 가시설·측량설계 원문의 배/번/줄/set/kg/set/㎜ 및 괄호 뒤 체적·면적 단위, 별표 중량 선언의 닫는 별표, 설명 열 분리 후 남은 쉼표 처리. 실제 원문 발췌와 수치 변경 전파 시험 4개 추가, 전체 전용 61 통과. 측량설계 저장값 80,624→80,658/80,682 일치·해석 오류 60→10, 가시설 13,978/13,979 일치·오류 8→4. 기존 소계/비율/구간 편집·취소·저장과 수동계산 저장 복원 브라우저 회귀 통과, JS 오류 0. 범위 조건·누락 참조 및 원본 오류는 임의 값으로 대체하지 않음.

  • 2026-11-05 대용량 실행 취소 보완: 기존 10MB 초과 문서의 이력 누락 제거. 브라우저 gzip으로 최근 8단계 보존, 압축 기능 미지원 시 원문으로 보존. 취소/다시 복원 중 입력·문서 버전이 바뀌면 복원 폐기, 현재 파일 ID 유지. 보존 시험 추가 및 Edge 11MiB 문서 취소/다시·추가 입력·문서 전환 보호 확인, JS 오류 0. 기존 저장 지연/재시도 브라우저 회귀 통과, 전용 시험 57 통과. 전체 동등성은 계속 미완료.

  • 2026-11-05 대용량 당초 확정 보완: 사본의 중복 당초 필드·도면·현재 원천 목록을 제외하고 재계산 입력만 보존. 작업본·원본 압축 자료는 유지. main.estx 확정 JSON 293,074,097→214,621,549바이트로 256MiB 요청 한도 충족. 별도 임시 데이터 경로의 실제 저장 API에서 221,430,352바이트 저장·산근 77,395행·원본 압축 해시 보존·계산 오류 0 확인. 전용 시험 56 통과. 다음 작업: 대용량 문서도 실행 취소를 기록하고 비동기 복원 중 입력/문서 전환을 보호.

  • 2026-11-05 저장 흐름 보완: GN 133→134 입력 후 셀을 벗어나지 않고 Ctrl+S 하면 133이 저장되는 오류 재현 후 수정. 활성 셀 확정·저장 요청 직렬화·요청 시점 사본·문서/수정 버전 확인으로 대기 중 새 입력이나 다른 문서가 이전 응답으로 덮이지 않도록 처리. 첫 저장 전 파일 ID 부여, 취소/다시 실행 시 현재 파일 ID 유지. Edge 요청 지연 시험으로 연속 저장·추가 입력 보존·문서 전환·다른 이름 저장·취소·실패 후 재시도 확인, JS 오류 0. 기존 12화면·당초 비교 저장 복원 회귀도 통과. 계산 시험 54개는 직전 엔진 기준 통과 상태이며 이번 수정은 화면 저장 경로에 한정.

  • 2026-11-05 당초 비교 보완: 별도 웹 확정 사본이 없으면 원본 EstMainDat의 GN_/TC_ 저장값으로 설계변경 증감 표시. 0원 당초와 신규 행을 구분하고 명시적 확정 사본이 있으면 원본 필드보다 우선. 원본 숫자 필드의 잘못된 JSON 형식 거부 추가. 전용 시험 54 통과; Edge에서 당초 100/변경 150/증감 50 표시→저장/재열기→현재값 확정 150 우선→취소 후 100 복원 확인, JS 오류 0. 원본 원가 서식 활성 인덱스·당초 전체 테이블 자동 복원은 임의 확정하지 않음.

  • 2026-11-05 동원·원천 연결 보완: REA 10e56b8/10e6218의 비목 배수를 산근/일위 재귀에 전파. 노무 80%·재료 90% 개별 낙찰률 유지, 하위 호표의 한 성분만 참조할 때 중복 전개 방지, 복수 단위환산 누적. 금액만 입력한 행·비율 경비를 원본 L/M/E/SZZ 코드로 누적하고 시간 환산 불가 경비를 금액으로 보존. 산근 단가는 품명 표지 유무와 관계없이 각 행의 원천 Code/LinkIndex로 조회, 연결 해제 행이 앞 행의 원천을 상속하지 않도록 수정. 전용 시험 52 통과(700줄 제한에 맞춰 연차·동원 시험을 test_est_business.py로 분리). Edge에서 비목별 80/90 적용→소요량 8/9·금액 800/900, 저장 복원 및 기존 소계·연차 조작 확인, JS 오류 0. main.estx 원천 전체 갱신→재계산 오류 0·산근/일위/내역 반복 안정성 확인(2회 13.942초). 원본 실행 수치 대조는 미확인.

  • 2026-11-05 연차 배분 보완: REA f0fcc0/f0f9b8/f1098c의 차수 수식을 수량·각 성분 금액에 독립 적용하고 금액 정수 절사. 단가를 비운 고정 금액 사본으로 생성해 재계산 시 금액 유지, [기준]-[1차]로 절사 잔액 이월. 수량 0·고정 금액, 사본 독립성, 중복 차수명 거부 검증. Edge에서 8원 기준의 1·2차 3/5원→수식 25% 편집 1/7원→차수 사본 열기/저장/재열기 및 원본 불변 확인, JS 오류 0. 전용 시험 47 통과. 원본 업무 실행 대조와 연차 전체 분기 동등성은 미완료.

  • 2026-11-05 산근 연결 보완: REA f250bc(61 소계)·f280f8(58 비목 참조)·f2ef54(62 선택 합계) 경로를 단가 변경 시 다시 계산. 6/7 제어 표지를 표시·편집하고 같은 이전 금액의 서로 다른 행도 독립 집계. f2c680/f2cba8 낙찰 성분 순회·Currency 4자리 및 최종 51/52 행 금액 반영 추가. 결과 표지 없는 자동 합계 식의 NaN과 수정 후 남던 Error 상태 제거. 소계 표지 1,433개 추가해 설치 main.estx 저장값 115,145/115,145 일치·오류 0. 실무 산불 세 파일은 소계 포함 8,411/8,411 일치·원본 괄호 오류 각 1건 유지. 전용 시험 45 통과. Edge에서 단가 100→150 → 산근 소계 300·두 비율 각 15·내역 3,300 전파, 구간 편집/취소/저장 및 12화면·수량 저장 복원 JS 오류 0 확인. 미완료 범위는 계속 남김.

  • 2026-11-05 인쇄 누락 수정: 화면의 100행 페이지만 인쇄하던 동작을 전체 검색 결과/현재 호표와 현재 자료 전체 범위 선택 미리보기로 교체. 내역·일위·산근·기계·원가의 출력 열, 성분 금액과 소수 수량, 오류 및 문서 제목 보존. Edge에서 206행 전체→PDF 6쪽·마지막 행·검색 1행→전체 206행·산근 표지 제거·JS 오류 0 확인; PDF 첫/끝쪽 이미지로 잘림 없음 확인. 계산 회귀 39 통과. 원본 인쇄 양식의 동일성은 미확인.

  • 2026-11-05 추가 구현: 원천/호표 코드 편집 시 작업본 참조와 목록 코드를 함께 갱신, 이전 코드 별칭으로 당초 단가 재계산 유지, 당초 스냅샷 불변·중복 거부·취소 검증. 분수 열 한 칸 공백·가운뎃점·숫자 붙은 변수·min/m2 단위, 음수 {-} 표지와 식 내부 주석·설명 괄호 수정. 원본 TCostOption RTTI CostValueTrunc(+0x34)·MidCostDiget(+0x40), f1df70→f2df14→f254c8 연결 확인 후 가져오기·절사 계산·설정 화면 반영. 해양/산림/가시설 원본 3묶음 회귀 자료 보존. 전용 시험 39 통과. 추가 원본 해양 저장값 133,635/133,710 일치·해석 오류 99건 남음; 조경 93,928/93,932·오류 0. 원본 오류/모드 미확인 및 미구현 기능 있어 완료 처리하지 않음.

  • 2026-11-05 후속 대조: 실무 산불 3파일 DBISAM 재사용 BLOB 꼬리의 할당 공간과 논리 길이 구분 수정. 저장 금액 8,312/8,312 일치하나 공통 원본 괄호 누락식 D0000000194 한 건은 해석 오류로 남김. 직접재료비 별표 구획, 산업안전 관급 조달수수료 제외, Gangub=0 원액 유지, 낙찰·단위환산 후 동원 수량/장비시간 수정. 분수 안의 연산자 공백·ASCII x·주/톤 단위를 처리하고 회귀 시험 보존. 전용 시험 34 통과; Edge에서 자동계산 해제 열기/저장/재열기 금액 유지·원천 복사 코드 중복 방지·설정 두 옵션·수량 연결 및 저장 복원·12화면 JS 오류 0 확인. 추가 설치 원본 23파일의 잔여 차이 분석 중. 완료 판정 아님.

  • 2026-11-05 수량 연동: WPTools 원본 75개 산출서의 글·표지·위첨자 및 개별 표지 정밀도를 가져와 편집·재계산·내역 반영·저장 복원. 449개 수량 중 446개 일치, 3개는 원본 글 산식과 저장 수량 불일치(286↔0.35×1.3×220=100.1, 0↔1×1=1, 138.72↔1.25×2×68×1.02=173.4). 원본 저장값과 재계산값 동시 표시, 원본 실행 미확인으로 원인 단정하지 않음. 수식 해석 오류 0, 회귀 시험 보존. Edge에서 폭 9→12 편집→연결 내역 수량 139→저장/복원 확인.

  • 2026-11-05 계속: 대용량 main.estx의 전체 저장값 113,680/113,680 일치(일위 52,530·기계 17,675·내역 205·산근 표지 전체 23,889·호표 목록 19,381). f1a8c4 코드 문자별 SKind 선택, f3242c LinkIndex68 집계 교체, f1580c Currency 정수 환산, 산근 DigetIndex·복수 표지·Currency 합산 반영. 원본 발췌 900여 행과 설치 원본 자동 대조 시험 추가. 원천 갱신 전체 계산 오류 0 및 재계산 안정성 확인. 전용 시험 22 통과. 원본 실행 비교·CAD·원본 파일 수정 저장 등 남아 있어 완료 판정 아님.

  • 2026-11-04 후속 구현: 이전 축소 데모 대신 원본 테이블 기반 native-* 엔진과 표 편집 화면으로 교체. 독립 Node 서버 5175, 로그인·공용 DB 의존 없음. ESTX 읽기(22개 표·17개 옵션·원가 서식 4종), 원본 바이너리 보존, JSON 파일 및 로컬 저장소 보관, 취소·다시 실행 구현.

    • 자체 검증: 원본 REA 샘플 275/275(기계 48·일위 41·내역 37·산근 결과 118·호표 8·원가 수식 23). 도급액 고정 반복 차이 324,-32,3,0. 단가 변경 전파 및 반복 재계산 안정성, 기성 사정·전회 누계, 연차 40/60 배분, 동원 전개, 적용제외 간접비 포함 물가조정 시험 추가. 전용 pytest 20 통과.
    • 브라우저 자체 검증: Edge에서 수량 편집·취소/다시·저장 다운로드·서버 저장 재조회·새로고침 복원, 업무 화면 12종 열기, 앱 내부 275개 대조 통과. JS 오류 0. 대용량 main.estx(산근 77,395행 등) 추가 대조 진행 중이며 전체 동등성 완료 아님.
    • 전체 시험: 41 통과 후 기존 spreadsheet_size 시험이 누락된 delaunator 및 @kninnug/constrainautor 의존성으로 실패. 이 앱 전용 시험과 별개이며 전체 통과로 보고하지 않음.
    • 남은 검증/구현: 대용량 산근·일위 저장값 불일치 분석, 설계변경 재계산 0/1/2 경로 상세 검증, 수량 원본 편집기 연결, CAD/VEC0650 편집, 원본 인쇄 서식·Excel/XML/JDL·ESTX 수정 저장. 원본 실행 동등성 미검증. 사용자 요청은 계속 진행하며 완료 처리하지 않음.
  • 사용자 정정: 축소 계산 데모가 아니라 EST와 유사한 화면 및 기능을 갖춘 독립 프로그램. 아래 기록은 이전 데모 검증이며 완료 판정 아님.

  • EST 작업 화면(내역·일위·단가·기계·견적·표준·자재·노임·수량·원가)과 조작 흐름 구현

  • 분석 근거에 따른 계산·연결과 작업 파일 보존, 주요 업무 기능 구현 및 검증

  • 원본 미확인 기능과 미구현 범위 명시, 브라우저·계산 시험 결과 기록

    • 진행: 표 중심 화면으로 수정, 수량산출→내역 반영, 기성 수량·사정 누계 시험 기능 추가. 원본 화면 실행 불가, REA 자료로 진행(사용자 확인).
    • 자체 확인: 전용 pytest 3 통과; Edge에서 단가 변경, 수량 반영, JSON 저장·열기, 기성 금회·사정 누계 조작 확인. 원본 동등성 미검증. 기계경비·수식 단가산출·설계변경·기성 회차 및 원가·물가변동·ESTX 변환 등 미구현이므로 완료 아님.
  • tools/est-test/에 로그인·공용 DB 없는 독립 웹앱: 기초 단가 → 일위대가 → 내역 → 원가 연결과 입력 제어

  • 시험 자료임을 표시하고 JSON 저장·열기 제공; 사용자 입력 요율과 계산 결과 확인

  • 자체 검증 — 전용 pytest 2 통과; Edge 브라우저에서 단가 변경 → 일위대가·내역·원가 전파 및 JSON 저장·열기·초기화 확인. 원본 동등성 미검증, 단가산출 수식·ESTX 변환 및 기성·물가변동은 범위 밖.

    • dev 수신 뒤 전체 시험은 9%까지 실패·오류 발생해 중단; 첫 실패 재실행은 41 통과·1 실패(기존 spreadsheet 빌드에서 delaunator·@kninnug/constrainautor 의존성 누락). 나머지 실패 원인 미확인.