2026-06-22 세션 — orderpaper '현장별 자재' 탭 신설(material-spec 이식 → 자동작성 → 적대적 검토)
pfs 웹앱(webdev/ui) orderpaper 페이지에 자재 사양서(material-spec) 탭을 신설한 단일 세션의 전체 기록. 테스트 배포·검증까지, 운영 미배포.
논의·대안
페페 지시: orderpaper(/field/orderpaper)에 기존 standalone material-spec 단일HTML 앱을 '현장별 자재' 탭으로 이식. 기존 발주서 정리·현장별 입고일정의 UI 스타일(카드·상차일↓·포커스모드·*_user 동기화안전·업로드 pending 패턴)을 파악해 일관성 유지. 적대적 검토로 20개 설계안을 만들어 베스트1로 실페이지, 베스트3은 목업 요구.
- 설계 대안(워크플로 20안): 영속(JSON blob vs 정규화), 통합(iframe vs 정적JS 인라인 포팅 vs 하이브리드), UX(드롭다운 vs 사이드바 마스터-디테일 vs 카드 갤러리), SDK PDF 파싱(전자동 vs 검수 워크벤치 vs 부분자동). 적대적 비평으로 iframe·field_no UNIQUE NOT NULL 안 등 kill.
- 이후 페페가 스타일3(카드 갤러리) 채택, field_no 매핑은 ID 대신 현장명·상차일 선택으로 단순화 요청.
- 자동작성 아키텍처: EC2엔 Claude 키 없음·집PC는 사내 RDS 직결 불가 → HTTPS 릴레이(sara sdk = sara/codi_cli_runner.py claude -p 헤드리스 패턴 참조)로 확정.
결정
- 베스트1=인라인 포팅(정적 JS, BS5→BS4 vanilla 재작성), 영속=신규 테이블
op_material_spec(연결키 field_no 우선·site_name_raw 폴백,COALESCE(spec_json_user, spec_json), 낙관락+소프트락). DB는 앱서버ensure_tables()자동부트스트랩(이 환경 aws CLI/SSM 전무 — 정식 patch36.sql·migrate 동봉). - 최종 UI=스타일3 카드 갤러리(상차일↓ 진행현장 ∪ 스펙현장, 카드 클릭→인라인 편집기), field_no 입력 삭제(현장명 기반).
- 자동작성 draft는
spec_json(draft 슬롯), 사람편집은spec_json_user(권위). 신규현장 blank은 spec_json에 저장(user는 NULL)해 draft가 보이게. - SDK 파싱=릴레이(claim/finish) + 사이드카
material_spec_parse.py(claude -p), 결과는 parse_status='draft'+confidence 검수 게이트.
산출물·커밋
- 백엔드:
api/pfs/orderpaper/material_spec/{controller,service,dao,model}+config.py네임스페이스. REST: GET/<field_no>·POST/by-site·POST/(create)·PUT/spec/<no>·DELETE/spec/<no>·PATCH cell·lock·POST upload·GET/list·POST/uploads·POST/parse/claim·/parse/finish. 마이그레이션migrations/patch36_op_material_spec.sql·orderpaper-sync/material_spec_migrate.py. - 프론트:
web/static/js/orderpaper_material.js(IIFE window.opMat — 카드 갤러리·편집기 이식·자동작성 칩·삭제·재업로드)·css/orderpaper_material.css·field_orderpaper.html탭 통합·orderpaper_schedule.js3탭 연동. - 사이드카:
orderpaper-sync/material_spec_parse.py(릴레이 폴링 +claude -p도면 파싱). 목업3:pfs/mockups/orderpaper_material_style{1,2,3}_*.html. 보고서:pfs/mockups/_design_recovery/{decision,spec,ranking,matspec_review}.json. - 실 검증: 라인VIP 실 도면 2장(에넥스/동양건설 주방·일반)을 코디가 PyMuPDF 렌더로 읽어 자동작성 draft(칼라6·위치9·137셀) 편집기 렌더 Playwright 실측.
- 적대적 검토(워크플로 에이전트48): 40후보→34검증→버그 15건 수정(HIGH6: 다중PDF 병합·빈스펙 작성됨 오표시·중복카드·draft·가구업체 덮어쓰기·탭 락누수 / MEDIUM7 / LOW2). 핵심 라이브 재검증 PASS.
- 커밋 체인(master, 테스트 배포):
9421d1c(탭 신설)→cf026b3(낙관락·relink)→4ec3d7d(진행상태 칩)→0e254d9(스타일3+field_no제거+/list)→4960f93·0008d61·0df4545(자동작성 phase2 릴레이+사이드카+함정수정)→c6e8881(신규현장 모달·삭제)→d92e4e3(적대적 버그15건). ?v=20260622a. user_brief 로컬 커밋 다수.
다음
- 운영(deploy-live) 배포는 페페 "운영 배포" 명시 시(운영엔 patch36 적용 또는 자동부트스트랩).
- SDK 파서 실가동: 집PC(claude 로그인 + PyMuPDF/poppler)에서
python orderpaper-sync/material_spec_parse.py상시. 보호=PARSE_RELAY_TOKEN양쪽 설정. - 설계급 정련 3건: 카드 클릭마다 빈 spec 행 생성(첫 편집 전 지연 생성 최적화), 브라우저 닫기 시 stale 소프트락(beforeunload), 충돌 시 셀단위 비충돌 병합 미활용. 다중 PDF는 현재 finish 누적 병합(
_merge_docs)으로 보존하나 사이드카가 현장 전체를 모아 1회 작성하는 방식도 검토.
관계
- 주제 그룹: material-spec / pfs orderpaper
- 관련 문서: material-spec-handoff, pfs handoff(후속1~5), session-2026-06-20-orderpaper-newhighlight-batch