# 공공기관3 기관별 수집 완성 SOP (서브에이전트용)

너는 공공저작물 실태조사 프로젝트의 **한 기관(공공기관3)** 사이트맵 수집을 **완성**한다.
출력 = `D:\01.프로젝트\DB수집\작업파일\공공기관3\{번호}.{기관}\{기관}.xlsx` (양식: 1~2행 헤더, 3행~ 데이터, 시트명 `NN_기관`).
**최종 메시지는 사람이 아니라 호출자에게 가는 데이터다. 행수·forms 분포·플래그만 간결히 보고.**

## 양식 컬럼 (B~AA, 데이터는 3행부터)
- B 순번(1~N) · C 사이트명(=기관명 고정) · **D~J 메뉴 권위트리**(대>중>소>세부, 깊이순·세로병합) · K 주소(절대URL·하이퍼링크)
- **L 게시판형태**: 게시판/페이지/사이트 · **M 수량**(게시판=총글수 숫자, 페이지=1, 사이트=빈칸) · **N 저작물유형** · O/P/Q 공공누리
- 사이트(외부/새창)=M/N/O/P/Q 전부 빈칸. 페이지 M=1. 게시판 M=글수.

## 도구 (이미 만들어져 있음, 공공기관3 폴더에서 실행. 한글 인자는 기관명)
```
cd "D:\01.프로젝트\DB수집\작업파일\공공기관3"
python _gnb_extract.py {num}        # GNB 메가메뉴 추출 → _gnb/{num}.json (SITES에 컨테이너/토글 설정)
python _writetree.py {num}          # _gnb json → xlsx 트리(D~K, 병합·중복제거·외부=외부링크표시)
python _phase234.py {기관명}        # L/M/N/O 자동(게시판form·글수·미디어N·KOGL). 멀티스레드
python _nshot.py {기관명}           # 몽타주: _temp\nshot_{기관}\montage_*.png + plan_{기관}.json (candidate행)
python _napply.py {기관명}          # plan의 N판정을 시트에 적용
```
엔진 본체: `D:\01.프로젝트\DB수집\_스크립트\_공공기관2_{phase1,phase234,nshot,napply}.py` (OUTDIR만 override됨).

## 작업 순서
1. **현재 상태 확인**: 네 기관 xlsx가 이미 있으면(대부분 Phase1-4 됨) 트리·L/M/N/O 확인. 없으면 `_gnb_extract`→`_writetree`→`_phase234`.
2. **구조 검증(중요·매뉴얼 핵심)**: 라이브 사이트의 GNB/전체메뉴를 직접 열어(Playwright `browser` 또는 python+playwright) **D~J 권위트리가 실제 메뉴와 일치·누락0** 확인. 메가메뉴가 2단(D/E)만 잡혔는데 실제 3~4단이면 하위 펼쳐 깊이 보강. 누락 페이지/게시판 추가. (사이트맵보다 **본 페이지 메뉴가 권위**)
3. **본문탭 전수 전개([[kdhc_tebli_tab_expand]] 규칙)**: 대표 페이지 본문에 콘텐츠탭 위젯(`li.tebLi`·`ul.tab*`·`scrollable-tabs`·`sub-page__tab` 등, active는 `<a>`나 `<li>`)이 있으면 **전 페이지·게시판 URL을 fetch해 전수 스캔**→탭셋으로 그룹 dedup→self(active)≠leaf=자식(다음 깊이)·==leaf=형제(같은 깊이). 신규탭 L/M/N/O 라이브판정. "전체"탭 없는 분류탭(같은 menuNo·param만 상이)=각 별행 게시판 split. AJAX목록(정적 tbody無)=M브라우저확인 플래그. 풀리빌드 시 병합=D~J 동일값런 재생성·K링크 재적용·B재부번.
4. **L/M/N/O 정밀화**:
   - L: 전체건수/페이징/검색 중 하나라도 = 게시판(글0이어도 게시판형태면 게시판). 외부/새창 = 사이트. 그 외 페이지.
   - M: 게시판=총글수(번호열 최댓값 or "총 N건"/"전체게시물 N"). 페이지=1.
   - **N(몽타주 관찰 필수)**: `_nshot` 실행→`_temp\nshot_{기관}\montage_*.png`를 **Read로 직접 보고** 시각판정. 8종만(어문/이미지/영상/오디오/글꼴/3D/기타/없음). 페이지=사진만 이미지(조직도·인포그래픽·차트·표·글자이미지·로고=어문). 게시판=상세에 진짜사진/갤러리썸네일 있으면 어문,이미지 / 순수텍스트목록=어문 / 빈게시판(M0)=없음. Q&A·문의·설문 사용자생성형=어문. 판정 후 `_napply` 또는 직접 N열 기입. 변경 셀 파란색 `FFBDD7EE`.
   - O/P/Q: 공공누리 이미지마크(`img_opentype0N`·`ccl_img open0N` 등 통합정규식 `open(?:type|code)0*(\d)`)만 권위. 게시판 O=상위~10글 유형 합집합. 본문 "제N유형" 텍스트 정규식 금지. 마크없으면 미부착. P=페이지면 게시물·게시판목록=게시판·상세=게시물. Q=마크가 kogl.or.kr 링크면 Y.
5. **검증**: B순번 1~N 연속·C 기관명·병합겹침0·부모경계위반0·K링크불일치0·페이지M=1·사이트 MNOPQ빈칸. 백업 `_backup_*.xlsx`.
6. 보고: 최종 행수, L분포(페이지/게시판/사이트), KOGL부착수, 본문탭 추가행수, 플래그(미해결·브라우저확인필요).

## 규칙 메모
- 깊이 추적은 재귀(J에 잔여 합침). 부모-자식 URL중복(부모 D~lc동일+lc+1채워짐+K동일)=부모행삭제(F→E→D순).
- 랜딩셸(Cn 여러행병합+첫행 Cn+1빈칸+섹션랜딩URL)=첫행만 삭제·라벨 첫자식승계.
- openpyxl insert_rows는 K하이퍼링크 어긋남 버그→풀리빌드 권장. 워크북간 `cell._style` 복사금지→`copy.copy(_style)` 동일wb.
- fetch는 `resp.content`(바이트)로 BeautifulSoup(meta charset 자동).
