pfs 유사작업 매뉴얼 (playbook)
새 pfs 작업 시 여기서 유사작업을 찾아 절차 + 참고 포인터만 펼쳐 정보수집 후 진행한다. 불변 사실(경로·포트·인증·위험규칙)은
handoff.md"확정 사실", 함정은traps.md, 스키마는schema-estimate.md.
작업유형 → 참고 포인터 인덱스 (빠른 진입)
- 🆕도어발주서 수작업 완료 → 최신도면 대조 검토(포인검토 사본) → 이 playbook §9 · 도구
C:\dev\order-automation\tools\door_assembly_check.py(조립형 큰제목↔하위 정합 = 기본 단계) · 선례 대전 도마C:\dev\order-automation\daejeon-doma_2026-10-19\ - 🆕포인/PFS 견적 → 한샘 양식 엑셀(+타입별 견적 위치도) → 이 playbook §8 · 도구
C:\dev\tools\hansem-convert\hc.py(설정 JSON 1개 + 단계) · 스킬hansem-convert· 정본 규칙 devplanhansem-convert-rules.html. 스크립트를 _work 에서 베끼지 마라. - 발주서정리/입고일정 UI 변경 → handoff.md(해당 기능 NOW) · 세션
session-2026-06-*-orderpaper-*· 이 playbook §1 - 운영 배포 → 이 playbook §2 · handoff.md "확정 사실"(deploy-live 규칙)
- RDS 컬럼 추가/조회 → 이 playbook §3 · handoff.md "확정 사실"(SSM·*_user 패턴)
- Playwright 화면 검증 → 이 playbook §4 · 메모리 [[browser-automation-login-default]]
- 견적서/엑셀 → schema-estimate.md · 세션
session-*-estimate-* - 견적서(양식) xlsx → 본건+추가건 견적 등록 → 이 playbook §7(도어발주서 경로와 다르다 — 입력이 이미 확정가 견적서)
- 🆕도어발주서 → 추가건 견적 = 이제 화면 버튼이다(26.9.21) — 견적서 목록
/estimate/list-v2행의 「추가건 엑셀」. 스크립트를 새로 베끼지 마라. 파서 =api/pfs/estimate/service/door_order_parse.py(규칙 바뀌면 여기 1곳) · 검사 =scripts/_est_door_import_check.py(골든 5벌) · devplanpfs-door-order-import.html. 아래 스킬 문서는 규칙 정본으로 계속 유효하다. - 도어발주서 → 추가건 견적 등록(엑셀→PFS API) → 스킬 문서
C:\dev\order-automation\견적등록_스킬.md(시트구조·수집규칙[GROUP=1줄·부품접음·유상만]·등록 메커니즘[POST /api/auth/login→POST /api/estimate/, 세션 regist_user, 응답{code,message}]·실행build_and_register.py) · 이력=추가1~6=견적 712/713/716/717/720/737(부모 711·field_no 2098; 추가5=20p 수동포함 엣지케이스, 추가6=23~27p 5줄build_and_register_add6.py·p27 재생산행 U무표기=미청구 skip) · 금강 부산에코 = 견적 753(부모 735·field_no 2142=MH 본건. 발주서는 AS 현장 2163 이지만 견적은 본건에 붙인다·1~9p 47줄build_and_register_kk_add1.py·타입란=상차일 3그룹·비고=p{페이지} / 사유·상차일은 M4number_format으로만 식별·부품판정은 숫자접두 아닌 바 부재명 집합) - worklog 미연결 현장 자동연결 → 이 playbook §6 · handoff NOW(2026-06-22 worklog 자동연결) · 메모리 [[worklog-autolink-inferred-sites]]
§1 발주서정리/입고일정(orderpaper) UI 변경
- 파일: 메인=
web/templates/basic/field/field_orderpaper.html(템플릿 — 캐시버스터 불요), 입고일정 탭=web/static/js,css/orderpaper_schedule.js,css(정적 —?v=캐시버스터 필수, base.html/포함부 bump). - 데이터: 단일소스
/api/orderpaper/all-items(select_all_items) →OP_ALL. 동기화안전 사용자편집은*_user컬럼(material_type/receive_date/item_receive_date/note/qty/…)·SELECT는COALESCE(xxx_user, xxx). - 절차: ①현재 구현은 handoff NOW + 직전 세션문서로 파악 ②동일 패턴(예: 인라인 편집=note/qty 미러) 재사용 ③테스트 push→검증→운영(§2) ④세션문서·handoff 갱신.
- 참고: 폐기/되돌린 구현은 백업 브랜치
wip-discarded-*에서git show로 재참조.
§2 운영 배포 절차 (master→deploy-live)
- master에 push(테스트 자동배포) →
gh run watch <id> --exit-status로 확인. - 운영은 페페가 "운영 배포해줘" 명시 시에만. ⚠
deploy-live는 워크트리C:\dev\pfs_deploy_wt가 점유한다 — 메인C:\dev\pfs에서git checkout deploy-live는fatal: already used by worktree(26.9.10 이 옛 문구대로 하다 재발). 배포는 그 워크트리에서(깨끗한지·브랜치 확인 →merge --ff-only origin/deploy-live→ 아래 선별 포워드 → push). ⛔git merge master금지 — 두 브랜치가 수백 커밋 갈라져 있어 미배포분이 통째로 나간다(projects/dwgrev/rules.md). - 강제푸시·
reset --hard도구 차단 → 일반 머지/커밋만. 되돌림은 포워드 복원(파일을 목표 커밋으로 checkout 후 일반 커밋). - 배포 후 운영 Playwright 검증(§4) → handoff/세션 갱신 → notify-step/done.
- 참고: deploy-live↔master 순수차이=
migrations/create_dispatch_tables.sql(무해). - 미반영 커밋 세기(2026-07-27): 운영은 cherry-pick 이력이라 해시가 달라deploy-live..master원시 개수는 과대계상(89건→실제 20건). patch-id 비교로 세라:git log --no-merges --cherry-pick --right-only origin/deploy-live...origin/master→ 그 결과도git diff --stat origin/deploy-live origin/master와 대조해 diff 0인 것 제외. - 선별 배포(일부 커밋만): merge는 원치 않는 커밋까지 끌고 온다 → 파일단위 포워드 반영git checkout deploy-live→git checkout origin/master -- <files>→ 그룹별 커밋(위험 낮은 순: 스크립트→백엔드 파서→웹UI) → push 1회(그룹마다 push하면 운영 재시작 N회). 전제 = 대상 파일이 제외할 커밋에 걸치지 않을 것(git log ... -- <file>로 확인). - 관리 페이지: 미반영 커밋 현황·배포 체크리스트 =C:\dev\devplan\pfs.html(devplan 허브 pfs 카드). 배포하면 그 파일의PENDING/DONE배열을 갱신한다.
§3 RDS 컬럼 추가/조회 (SSM 경유)
- 운영 직결 불가 → EC2(SSM) 경유.
python scripts/ssm_run.py <local.py> <remote.py>(env: 테스트/home/ubuntu/env/pfs-test.env, 운영/home/ubuntu/env/pfs-live.env). - 읽기(SELECT)=자유, 쓰기(ALTER/UPDATE)=위험작업·승인 후. 멱등 스크립트(존재 확인 후 ADD). 동기화안전 편집은
xxx_user varchar NULL AFTER xxx패턴. - 출력 cp949 깨짐 →
PYTHONIOENCODING=utf-8 PYTHONUTF8=1+ em-dash 회피.
§4 Playwright 화면 검증
- 로그인:
C:\dev\.secrets\pfs_login.env(키PFS_TEST_/PFS_PROD_ URL·ID·PW) 읽어 폼 자동입력→로그인. 세션 만료 잦음(재로그인). 비번 출력·커밋 금지. - 검증은
browser_evaluate로 computed style·DOM·API 라운드트립 실측. 데이터 없는 동작은 메모리상 임시변경(비저장)으로 재현. - 참고: 상세 = 메모리 [[browser-automation-login-default]].
§5 알림(broker)
/notify-step(다단계)·/notify-done(완료). Bash+json.dumps(ensure_ascii=False).encode('utf-8')+urllib(PowerShell 한글깨짐 회피). 민감정보 금지.
§7 견적서(양식) xlsx → 본건+추가건 등록 (2026-07-30 신설)
- 입력 = NAS
2026현장\견적\<월>\<업체>\*.xlsx(견적서생성기 산출 = PFS 출력양식과 동일 구조). 도어발주서 경로(§0 스킬)와 달리 단가가 이미 고객 확정가다. - NAS 마운트: 한글 공유명이라
net use·heredoc은 cp949로 깨져 오류67 →pfs\orderpaper-sync\_mount_nas.py(win32wnet) 실행 후 UNC 직접 읽기. 로컬 사본으로 복사해data_only=True로 읽는다. - 시트 판독: 블록 주기 45행 · 본문
base+17부터 20행. p1 = 요약블록(타입행들 + 시공비 + 물류비 + 기타부가비), p2~ = 타입별 상세블록(+소계행). 매핑은 추측 금지 —api/pfs/estimate/service/estimate_print_service.py의_render_summary_body/_render_detail_item셀 주소에서 역산한다(요약과 상세의 컬럼이 다르다. 상세 =rules.md🆕). 섹션헤더 =A{r}:E{r}병합행(품목 아님, 비수집) / 품명칸 다행 병합(A74:B76) = 1품명 다규격 → 행마다 견적줄 + 품명은 앵커 상속. - 등록 순서 = ①본건(
parent_estimate_no='') → ②추가건(parent_estimate_no=<본건no>) → ③extra/bulk-save. 본건이 없는 현장이면 본건은 빈 컨테이너(금액 0)로 만든다(추가건은 부모가 필수). - 필드 규약:
type_name= p1 요약행 이름 그대로 ·dimension1=300(→자수 1.0 →amount = 단가×수량) ·field_type='K'·price_div='pr'·price_option='10'·part_mode='all'· 마진은rules.md🆕(master 0 + detail NULL).total_amount= 품목합 + 시공비 + 물류비 + extras,margin_total_amount= 동일값(서버는 계산 안 하고 받은 값을 저장한다 —_normalize_master). - 검증 4단: ①빌드 시 금액 교차검증(품목합 == p2 공급가액 == p1 타입행 / +기타 == p1 합계) ②
VERIFY=1로 현장·중복 사전조회 ③등록 후GET /api/estimate/{no}전 줄 대조 ④GET /api/estimate/print/excel/{본건no}실제 다운로드 → 원본 엑셀과 셀 대조(최종 관문). - 선례 =
build_and_register_shinyoung_add1.py(신영 광주 챔피언스시티 MH → 본건 740·추가1 741, 13줄 1,177,000). 세션 =session-2026-07-30-shinyoung-add1-estimate.md.
§6 worklog 추정현장 자동연결 (표준규칙 — 페페 지시 2026-06-22 "앞으로도")
- 표준규칙: worklog 작업을 할 때마다 미연결(field_no NULL) 묶음 중 현장이 추정된 것은 자동연결하고, 추정 안 된 건 그대로 유지한다(모호·약한 매칭은 건드리지 않음).
- 실행(가장 간단): 운영 러너
python scripts/_wl_autolink_run.py prod dry 80로 먼저 dry-run 검토 → 연결예정 목록이 타당하면... prod apply 80적용(롤백로그scripts/_wl_autolink_rollback_prod.json자동저장). 테스트는test. env 로그인(비번 미출력). UI로는 worklog 페이지🔗 추정 현장 자동연결버튼(미리보기→적용). - 연결 게이트(보수적):
POST /api/worklog/auto-link {dry_run,threshold=80}. 점수≥80 & 최상위 후보 유일 & 정규화현장명≥3자 & 부분일치 커버리지≥0.5(_MIN_COVER)일 때만 연결. 정확일치(100)는 무조건, "(추정)" 주석붙은 강한부분일치(80·고커버)도 연결. lowcover/ambiguous/weak/tooshort/none은 보류. - 불변/주의: 적용은 배포된 API 경유만(이 PC aws/SSM 미복구 — RDS 직결 불가). 추정 로직 출처=프론트
field_worklog.htmlwlSimScore(서버 포팅=worklog_service._wl_sim_score). 게이트 변경 시 단위테스트pfs/scripts/test_worklog_autolink_infer.py갱신. 코드 위치=api/pfs/worklog/{dao,service,controller}. - 진행중/대기중(active) 현장 우선 (페페 지시 2026-06-22): 자동연결 게이트는 동점(모호)일 때
_is_active_field(상차일 최근 180일/미래=활성)로 winners 중 active가 정확히 1개면 그것으로 확정. 즉 완료된 옛 현장 대신 진행중 현장으로 모호성 해소. (active 후보가 0개·복수면 그대로 모호=skip.) - 맥락파악 매핑 (auto-link로 안 잡히는 나머지 — 절차): 문자열 게이트로 안 되는 모호/약한 묶음은 맥락(통화 발췌·연락처·작업내용) 으로 LLM 판단. 절차: ① 미연결 묶음 + 각 항목(
/api/worklog/items의work_name·excerpt·note[오디오출처=업체/담당]·status) 수집 ② 묶음별 현장후보 shortlist(업체/토큰 매칭, active 표시) 생성 ③ 서브에이전트 청크 분할로 판단(업체·연락처 일치 1순위 + 지역은 내용으로 + active 우선 + 배차/배송/거래처 등 비-현장 skip + 모호 skip) ④ high/med-active만PATCH /api/worklog/site-field {old_site_name,new_field_no,new_site_name}로 연결 + 롤백로그 ⑤ 비활성 타겟·후보없음·모호(활성 복수)는 유지. 스크립트 패턴 =pfs/scripts/_wl_mapping_input.json빌더·_wl_chunk_*·_wl_decision_*·_wl_semantic_rollback_prod.json. 이력=2026-06-22 26묶음 49항목 연결(미연결 154→128).
§8 포인/PFS 견적 → 한샘 양식 엑셀 변환 (+타입별 견적 위치도) — 26.10.8 신설 [코디]
- 도구 =
C:\dev\tools\hansem-convert\hc.py— 26.10.8 4사례(성포 · 한국유리부지 V1 · 84 평면 시범 · V2 위치도) 스크립트를 이식·통합. 정본 규칙 = devplanC:\dev\devplan\hansem-convert-rules.html(A·B·C·D). 엔진C:\dev\pfs\api\pfs\hansem\hansem_excel.py는 import 만(운영 코드 수정 0). 예시 설정 =sites\hankukglass-800.json(수납 전용 · 위치도) ·sites\gs-ansan-seongpo-769.json(주방 · C-3) · 빈 틀sites\_template.json. 자체검사python test_hansem_convert.py(1초 · 골든 2건 바이트 대조) · 회귀python regress.py [--nas]. - 0 페페에게 묻기(독립 질문 = 한 번에 묶어, 각 추천안) ①어느 견적(번호·본건) ②C-3 합산 치수 분리 표기(추천 = 안 함, 정본 기본) ③발행일·결재일(추천 = 견적일, 개정본이면 오늘) ④NAS 폴더(추천 =
…\2026현장\견적\<월>\한샘\<현장>\기존 폴더 · 파일명한샘 <현장> 가구제작 견적서(YY.MM.DD).xlsx) ⑤견적 위치도 넣을지(넣으면 DWG 경로·KEY PLAN 도곽) ⑥단가군 배치 예외(추천 = 규칙표 그대로 — 적용률이 금액을 맞춰 금액 영향 0). 지시에 이미 있으면 묻지 않는다. - 1 설정 =
sites\_template.json복사 → 현장명·담당·견적번호·work_dir(C:\dev\_work\<slug>-<yymmdd>\)·output·form·nas.dir. 양식 고르기 = 견적field_type이 F(일반가구)만 →trim_storage(form 11 계열 · 3평형 고정) · K(주방) → 준비된 양식use(평형 수·운반비·시공비가 양식 갑지와 맞아야 — verify 가 잡는다). 안 맞으면 양식부터 새로(선례C:\dev\_work\gs-ansan-seongpo-1008\make_form_sp.py, L4). - 2 실행 =
python hc.py <설정> fetch(GET 만 · 스냅샷) →plan(콘솔 표: 단가군·길이·적용률·목표 대비 차 · 갑지 절사 · ⚠경고 확인) →form→build→verify(ALL OK 필수 · PDF PNG<work_dir>\lo\out\png\육안 — 칸 잘림·블록 갈림). 한 번에 =run. - 3 위치도(선택) = 설정
drawing(dxf·output·types{frame,region}) →drawing render→drawing suggest(🆕 점 초안: 품명↔KEY PLAN 라벨 → 구역 박스 + 확대 그림drawing\zoom\· 26.10.8 실측 구역 31/31 맞음 · 구역 공유 15줄은 사람이 구역 안 실제 가구 자리로 나눠 찍는다) → 확정 좌표를 설정drawing.points에 →drawing compose(선 교차·간격 출력 +check_<T>.png육안) →drawing embed→drawing verify(V1 대비 그림 외 변화 0 · LO 값 diff 0 · PDF 그림 쪽). - 4 NAS =
python hc.py <설정> nas-put [--what v1,v2,png](기본 dry-run) → 게이트 통과 확인 →--put. 게이트 = 검증 ALL OK 기록(그 파일 sha256) · PFS 지문 재확인(GET) · 같은 이름 있으면 중단(xb) · 되읽기 sha256 · 폴더 변화 = 새 것뿐. - 5 기록 =
projects/pfs/session-YYYY-MM-DD-<slug>.md(결론·금액표·검증·⏳페페 확인) + register_doc · sessions.md · topics.md · handoff 1줄 · devplan 정본 페이지 「다음」 절에 적용 사례 1줄 · 산출 run.json 경로. - 함정 = rules 🆕 26.10.8 묶음(LOOKUP 기증 블록 · 쪽나눔 · 셀에 맞춤 · 인쇄 배율 62 · WIPEOUT · 총합+빈 행 뒤 쪽나눔 · 팔레트 255). 도구가 전부 기본 처리 — 새 함정만 rules 에 추가.
- 안 되는 것(보류) = 평형이 양식 슬롯보다 많을 때 탭 복제 · 주방 갑지 행 추가 · 2·4평형 수납 trim · 위치도 점 «완전 자동»(초안만). ~~주방+수납 혼합 실사례 0~~ → 26.10.14 소요한남 #803 첫 사례(1평형 = form 8 로컬 사본
use+ rename ·s6_sheets·cover_nums「수납!O22」 ·print_scale62 · 주방 갑지 참고칸 자동 검사). - 🆕26.10.14 옵션(설정
rules· 기본값 = 옛 동작 · 골든 바이트 동일) [코디] —addon_mode: "fold"= 추가금액(sub) 칸 없이 위치행 금액에 합산 · 견적 「기타 부가비」(estimate_extra_cost — fetch 가 같이 받음)는extra_alloc {mode: prorata_sub|prorata_row|to, rows, align_10000}로 행에 안분(separate 모드에 부가비 있으면 멈춤) ·finish_label: "type_only"+finish_types {"default": "무늬목", "<detail_no>": "PET"}= 마감 칸에 종류 단어만(단가 LOOKUP 키는 수식 안 문자열로 고정). 부가비를 행 대신 갑지에 =extra_place: "cover_material"(첫 갑지 「기타·자재비」 별도 금액) +cover_fill: true(자재비·운반비·참고칸 시공비를 PFS 값으로 채움 · V2 선례). NAS 이름nas.name에{V}= 판번호 자동(기존 판 최대 + 1 · 같은 내용 판 있으면 게이트 실패 ·nas.rev로 고정 가능). 예시 =sites\sohan2-803.json. - 🆕26.10.16 옵션(키 없음 = off · 골든 바이트 동일) [코디] —
rules.unit_price = {"mode":"direct","material_row":"무광,H/G 도장","grade":"A","finish_rows":{"PET":"라미네이트"}}= 내역서 단가칸을 숨김 시트 LOOKUP 대신 보이는 «단가기준» 탭 표 값 상수 수식(=6600*0.5)으로 · 재질 행은 단가기준 B·C 칸 글자로 찾음(못 찾음·둘 이상이면 멈춤) · 적용률은 새 단가로 역산.rules.cover_extras = [{"label":"무늬목 자재비","extra":"<PFS 기타 부가비 품목명>"}, …, {"label":"운반비","transport":true}]= 주방 갑지 기타 행(양식 3행)을 품명별로(행 삽입 없음 · 부가비 전부·운반비 필수 · 매칭 1건).rules.conceal_words = ["월드","도장"]= verify 비노출 검사(셀·이름·주석 + fold sub 금액·규격). 사례 =sites\sohan2-803.json. - 🆕수정 재발행(명령 2~3줄) — PFS 를 고쳤으면
python hc.py sites\<설정>.json fetch --refresh→ (설정만 고쳤으면 여기부터)python hc.py sites\<설정>.json run(ALL OK) →python hc.py sites\<설정>.json nas-put(dry-run · 새 판번호 확인) →… nas-put --put. 같은 이름은 NAS 가 거부하니 판번호는{V}가 알아서 올린다. 갑지 합계 = 주방·수납 각자 만원 절사(D-2)라 PFS 총액과 최대 −19,999(align_10000 이 부가비 끝수를 옮겨 최소화).
§9 도어발주서 수작업 완료 → 최신도면 대조 검토(포인검토 사본) — 26.10.19 신설 [코디]
- 트리거 = 「도어발주서 수작업 완료(했다) · 최신도면 비교해서 검토해줘」 · 「도어 규격표 검토」 · 「포인검토 만들어」. 장부 = model-ledger pfs 「도어발주서 수작업본 → 최신도면 대조 검토」(L3 · 선례 반복이면 L2).
- 선례 3건 =
session-2026-10-12-wonju-danggu-door-review.md(B안 원형) ·session-2026-10-13-ansan-seongpo-door-review.md(경첩 확대·비규격 N) ·session-2026-10-19-daejeon-doma-door-review.md(조립 정합·작아짐/커짐·쪽 머리 박스). 스크립트는 최신 선례 폴더를 복사해 새 작업폴더C:\dev\order-automation\<현장>_<YYYY-MM-DD>\에서 고친다(선례 원본 수정 금지). - 1 스냅샷 =
s0_fetch.py(C:\dev\tools\nasget.py순수 NTLM · 원본 크기·mtime·sha1 ·~$잠금 소유자) → 로컬input\. 원본은 절대 안 고친다. 열려 있으면(잠금) 그 사실을 적고 계속 — 게시 직전 sha1 재대조가 진짜 가드(대전: 검토 중 10:24 재저장 → 값 diff 0 확인 후 새 스냅샷으로 재생성). - 2 최신도면 = 같은 폴더·하위의 제작/건립도면 DWG 를 파일명 날짜 + mtime 둘 다로 고른다(근거 기록 ·
.dwl= 누가 CAD 로 열고 있음).python C:\dev\tools\dwg-takeoff\takeoff.py convert→ DXF ·takeoff.py sheets(노란 칸 시트 id·타입·구역) · 시트 글자·치수 덤프(대전work\_dumpz.py) · 직전 판과 시트별 차이(work\_zdiff.py— 실측·「비규격 N」·EQ 메모가 여기서 나온다) · 사양서 시트도 같은 덤프로 칼라 대조. - 3 검토(발주값은 안 고침 · 표시만)
- a 쪽 머리 K5 타입·K7 위치 → 도면 시트 매칭 · 도어·서랍앞판·EP·FIX·휠라·목찬넬·걸레받이 폭·높이·수량 · 경첩 좌우(열림표시 꼭짓점 쪽 · 단짝 도어만 380~520dpi 확대) · 칼라(사양서).
- b 🔴조립형 큰제목↔하위 정합 = 기본 단계 —
python C:\dev\order-automation\tools\door_assembly_check.py <xlsm> --out-dir work\asm(자체검사--selftest). 범위 자르기 = 종류별 허용 부재집합 + 면 수 한도(「다음 큰제목까지·빈 줄까지」 금지). 결과 = 블록별 OK / MISMATCH / CHECK + severity. - c 큰제목 치수 자체가 도면과 맞나도 본다 — «큰제목 맞고 하위 틀림»(도면 개정 때 큰제목만 고친 흔적)과 «큰제목도 틀림»을 나눠 적는다.
- d 🔴크기 차이는 방향으로 나눈다([페페] 26.10.19) — 발주가 도면·큰제목보다 작아짐 = 설치 불가 위험 → 빨강 강하게 + 1쪽 머리 「작아짐 = 설치 불가 위험」 목록 · 커짐 = 여유폭 재단일 수 있음 → 도면에 여유자재·「비규격 N」·현장재단 표기가 있으면 정상, 없으면 주황 「여유폭 재단 확인요」 · 속대 = 피스 조립용 40 고정 — 40 이면 큰제목 계산과 달라도 정상, 40 아닌 속대만 확인요.
- e 정상 관례(표시 안 함) = 「비규격 N」 → N 발주 · 18T 키큰도어 문짝 395 → 작은손 394/큰손 370 · 15T 엣지바 −13/−36·높이 −5 · 서랍앞판 칸폭 −4 · 천판EP 칸폭 +40(숨은EP) · 리턴 −19/−20 · 오픈장 천지판 (D−19)×(W−37)·뒤판 H−내리기−2.
- f A·P~T 빈칸 스캔(사람이 고친 행 수식 누락) · 빠진 항목(도면엔 있고 발주에 없음)은 별도 블록.
- 4 사본 =
s3_build_review.py(→ review.json · 행 표시 red/orange/purple ·page_boxes) →s4_run.py write(Excel COM = schtasks /IT + 절대경로 pythonw + 파일로그 ·C:\dev\tools\winledger\winledger.py claim task … --cleanup oneoff→ 끝나면 release · 예약작업 삭제). 원본 통째 복사 → 새 탭포인검토(「포인」 바로 뒤 · 위치 인자 Copy) · U 짧게 · V 근거(큰제목 기대값 vs 하위 실제값) · 범례 U8·U9 · 기준 AF1~AF8 · 빠진 항목 AF10~ · 쪽 머리 비고 박스 = 각 쪽 U{첫행}:V{첫행+8} 병합(1쪽만 U1:V3 — Q4:Y7·AB3:AD3 병합 함정 회피) · 큰 글씨·테두리·채움 · 순서 작아짐 → 불일치 → 확인요 · 행 삽입·행높이 변경 금지(36행 쪽 블록 · A·TROW()수식). - 5 검증 = 셀 데이터로([페페] 26.10.19 — PDF 육안은 데이터로 확인할 수 없을 때만 예외) ① 원본 탭 값·수식·서식·병합·행높이·인쇄영역 diff 0(
s5_verify.py) ② 시트이름 기준 파트 대조(s5b_parts_by_sheet.py) ③ VBA 소스 동일(work\_vba_diff.py— 빈 Sheet6 + Form02 VB_Base 1줄만) ④ parse_poin 원본=결과 ⑤ 새 탭 A1:O 값 diff 0 · P~T diff 0 ⑥ «인쇄영역·파서 범위 밖에만 썼나» = 셀 좌표 판정(work\_cellcheck.py: 값이 다른 셀 최소 열 ≥ U · 추가 병합 = U:V 박스뿐 · 템플릿 병합 유지 · 기대 셀 글자 일치) ⑦ Excel·LibreOffice 잔존 0 · 예약작업 삭제. - 6 NAS 게시 =
s8_publish_copy.py(점검 →--go) · 이름<원본에서 「도어발주서」→「포인검토」>.xlsm— 🔴「도어」 금지(door_order_sync*도어*.xls[mx]→ 운영 스티커 DB) · 임시명(「도어」 없음) put → 되읽기 sha1 → rename · 원본 sha1 = 스냅샷(다르면 멈추고 재검토) · 원본 크기·mtime 전후 동일 · 같은 이름 있으면 멈춤(--replace <내가 올린 sha1>만 교체). - 7 기록 =
projects/pfs/session-YYYY-MM-DD-<현장>-door-review.md(지시·결정·행별 결과·산출물·검증·함정·다음) · 현장 devplan 페이지에 1줄(새 페이지·h2 신설 금지) · seedchain 로컬 커밋만. - 완료 보고 = 신동혁 카톡(총괄) — 사본 경로 · 작아짐/불일치/확인요 건수 · 핵심 3건.