2026-10-08 세션 — 월드산업 협력사 네스팅 + /api 계정유형별 허용목록 게이트
[코디] 작업자(서브에이전트 · worker) 기록. 지시 = [페페] 「월드산업 장동수 대리의 PFS 계정을 생성하고 PNCAD 네스팅을 월드산업 전용 테이블을 만들어서 제공해줘라. 포인 작업분과 섞이지 않게 하는 것이 관건이다. … 운영배포. 계정은 임의로 만들어서 알려줘. 월드산업에서는 우리 네스팅 자료는 보는 것도 안된다.」
논의·대안
- 격리 방식 = 같은 테이블 구분 컬럼(nesting_job.company_no) vs 별도 테이블. 포인 네스팅 목록·자재발주(nest-jobs)·PNCAD 연동이 nesting_job 을 직접 읽으므로 구분 컬럼은 «포인 쪽 모든 조회에 필터를 빠짐없이 넣어야» 해서 누락 위험이 크다 → 별도 테이블
ext_nesting_job채택(포인 테이블 ALTER 0). - 화면 = 런타임 변환 vs 빌드 사본. 협력사 화면은 포인 nesting.html 을
tools/partner_nesting/build.py가 주석 제거·모드 주입·import 경로 교체로 빌드한 사본(커밋 산출물)이다. 빌드에 acorn 토큰 동치·HTML 이벤트 동치·CSS 토큰·서랍 산식 추출본 1624 조합 동치·누출어 0 검사가 들어 있다. - 외부 계정 /api = 기존 fail-open(로그인만 하면 전 API) → 그릴링 Q3-B 로 계정유형별 허용목록 + fail-closed 전환. 키 = Flask endpoint + method + 계정유형. 기존 거래처 5계정 화면이 부르는 27개를 정적(템플릿)·동적(Playwright)·데이터(운영 audit_log api_write) 3갈래로 뽑았다.
결정
- 그릴링 Q1-B(도어전용 + 서랍·제품 계산기 산식만 · imos·PNCAD 탭·포인 샘플·조건세트 서버저장·현장연결 제외) · Q2-A(포인 «소속 AND 총관리자»만 읽기 전용) · Q3-B · Q4-A(칼라 = 자기 저장본에서만 · 포인 칼라 마스터 비공개) · Q5-A(주석 전부 제거) · Q6-A(담당자 등록 후 계정 연동).
- 계정 유형 = 업체
company_type— '1' 자사 · '2' 잠금 협력사(신설) · 그 외 거래처. 202 월드산업(광주 초월읍 · 도장)만 '2'. 하남 월드장식(203) 무관. - 반증 검토 반영(0e175294): 협력사 소속이면 총관리자 플래그여도 /api 판정 = 협력사 · ext-nesting 저장은 Content-Length 필수(411).
산출물·커밋
- master
6f20be40(기능 21파일) ·0e175294(반증 하드닝 3파일) ·636b0090(사이트맵 menu_dump) → deploy-livef69b484a(21파일 파일 단위 포워드 · 대상 파일 선행 차이 0) · 운영 반영 18:24 KST. - 운영 쓰기 = patch60 DDL(
ext_nesting_job· 포인 테이블 행 수 22·2·1 불변) · menu_catalogpartner_nesting(menu_no 60) · company 202 type '2' · company_permission (202 '1')·(260 '0') · 담당자 장동수 대리(member 441) · 계정world01(user 16 · 총관리자 아님). 비밀번호는 이 문서에 적지 않는다(총괄 최종 보고로만 전달). - 검증: 로컬 격리 75/75 · 화면 30/30 · 거래처 회귀 28/28 · fail-closed 26/26 / 테스트 서버 75/75 · 30/30 · 28/28 / 운영 격리 30/30(월드 계정 허용 밖 /api 322건 전부 403) · 화면 22/22 · 거래처 5계정 모의판정(운영 DB · 실제 쓰기 기록 308건 포함) 23/23 · 배포 뒤 api_denied = 검사 계정 것만 / 독립 반증 에이전트 뚫림 0.
- 검사기(재사용) =
C:\dev\pfs\scripts\_world_partner_check.py(격리·매트릭스) ·_world_partner_ui_check.py(협력사·총관리자 화면) ·_world_partner_ext_ui_check.py(기존 거래처 화면 회귀) ·_world_partner_setup.py(메뉴·유형·권한 SSM) ·_ext_nesting_patch60_apply.py(DDL SSM) — 전부 gitignored(scripts/_*). - 테스트 DB 임시 계정 8개·임시 업체 459·시험 저장본 전부 정리. 임시 로컬 서버 8463 반납(PORTS.md retired).
- devplan 페이지 초안 =
C:\Users\delix\AppData\Local\Temp\claude\c--dev\5c6014d2-42a1-4279-a724-6a5082ea4635\scratchpad\devplan_pfs-world-partner-nesting.html— 서브에이전트 맥락에서 web-designer-required 훅이 상담 기록을 못 봐 생성 차단(상담은 2회 완료). 총괄이 배치.
다음
- ⏳[페페] 장동수 대리에게 ID·비밀번호 전달 + 첫 로그인 뒤 비밀번호 변경 안내.
- 제안: 협력사 첫 로그인 「초기 비밀번호」 안내 배너 · 비로그인 공개 3건(
/static/uploads/memo/field_memo.json·/static/reports/license.key·/swagger.json·/doc) 정리. - 롤백 주의: 게이트 이전 코드로 되돌리기 «전»에 company_type '2' 계정부터 비활성화.
관계
- 주제 그룹: pfs-nesting
- 관련 문서: pfs-session-2026-10-06-nesting-product-calc, pfs-session-2026-10-05-nesting-order-draft