<!-- FILE: _St/ai_read_패치.md | ROLE: sort 전체 현재 작업 -->

## v291 Auto8700 이미 본 JPG 응답 자동 저장

상태: `[코드반영·실제 Windows 검증대기]`

- CDP `Network.responseReceived`의 HTTP 200 `image/jpeg` 후보만 추적한다.
- `Network.loadingFinished` 뒤 현재 화면의 실제 `img.currentSrc`와 응답 URL이 정확히 일치할 때만 `Network.getResponseBody`를 호출한다.
- JPEG 시작/종료 시그니처와 최소 크기를 검사한 뒤 `_StDown/instagram/{owner}/{shortcode}_auto_seen.jpg`에 원자 저장한다.
- 저장 후 Shared `record_downloaded_file()`로 SQLite media_assets에 등록해 Analyze8780 로컬 JPG 우선 표시와 연결한다.
- 프로필·추천·화면 밖 이미지와 URL 불일치는 조용히 건너뛰며 완료로 기록하지 않는다.
- 실제 Chrome에서 현재 게시물 JPG 저장·DB 등록·8780 표시를 확인하기 전까지 `[검증대기]`다.


## v288 Analyze8780 LIKE·DB 번호·미디어 마무리

상태: `[코드반영·실제 Windows 검증대기]`

- `↻`, `0/200` 제거와 계정 헤더 `social_accounts · 검색/전체`
- `✓` quick_check·테이블·개수 점검
- 입력값 그대로 SQLite LIKE, `tem%` 회귀 수정, input 자동 조회
- DB select 옆 1..N 단일 클릭 버튼
- 저장 폴더 탐색기 열기, MP4/JPG localhost inline·Range
- 게시물 개별 posts·통계·media_assets·실제 파일 삭제, 공유 경로 차단
- 계정 전체 삭제 UI 제외
- 실제 Windows 확인 전 상호작용 항목은 완료로 올리지 않는다.


## v287 Analyze8780 DB·검색·페이징·ApexCharts

상태: `[코드반영·실제 Windows 검증대기]`

- DB 파일 select 선택→활성 SQLite 전환→계정·게시물 재조회
- 왼쪽 계정 페이지 제거, 최대 10,000개 전체 표시
- `abc / abc% / %abc / %abc%` 검색 규칙과 원형 `?` 도움말
- 오른쪽 게시물 보기 `50 / 100 / 200 / 10000`과 페이지 계산
- 정렬 항목 내림차순 고정, 이미지 세로 영역 확대·원본 비율 유지
- 게시물별 최근 통계 50개 ApexCharts 자동 선 차트·shared hover tooltip
- 최종 정적/단위: JavaScript syntax 50, Analyze UI Node 1, IG 38, RTC JS 3, Python compile 33, pytest 80 passed
- 다음 검증: 실제 8780 DB 2개 전환, 400개 게시물 50/100/200/10000 페이지, 검색 네 규칙, CDN 차트/툴팁
- 제외 목표: Auto8700·WS8771 동작 변경, Instagram 수집 방식 변경, 타 모듈 UI 변경

## v286 현재 작업
- 상태: `[검증대기]`
- 단일 목표: v282의 자동 WS8771 direct·수동 Chrome/WS 분리 다운로드와 UI를 유지하면서, 자동실행은 항상 새 관리 탭에서 시작하고 이전·오류·마지막 자동 탭을 exact CDP target으로 종료한다.
- 자동 새 실행·저장 진행상태 재개: `0/N`이면 목록 1번 계정, `1/N` 이상이면 지정 계정을 새 자동 탭으로 연다. 목록이 없으면 현재 Instagram URL을 새 자동 탭으로 복제한다.
- Explore 잔존 snapshot은 자동 시작 후보로 사용하지 않는다.
- 계정 전환: 새 탭 ready→Side OWNER commit→이전 `auto_created` 탭 CDP `Target.closeTarget`→target 제거→Chrome tab 제거 확인 순서다.
- 종료 실패: exact target close를 한 번 재시도하고 실패/targetId 누락 때만 `chrome.tabs.remove`로 보조 종료한다. 이전 탭 응답·unload·OLD_TAB_CLOSED 메시지를 기다리지 않는다.
- 보호: 사용자/비관리 탭은 닫지 않고 `OK_USER_TAB_PRESERVED`로 남긴다.
- 자동 중지·오류·최종 자동종료에서도 현재 자동생성 탭 종료 요청을 실행한다.
- 변경 모듈: IG Background·Side·Content/Main 버전 표식·manifest, Auto8700 exact target close API, 테스트·문서.
- 신규 테스트: `IG_StYellow/test_ext_auto_fresh_tab_cdp_close_v286.js`, Auto8700 exact target close 단위 2개, `test_verification_checklist.py` v286 검증목록 검사.
- 정적 결과: 전체 JavaScript syntax 49 OK, IG test 38 OK, RTC JS test 3 OK, Python compile 33 OK, pytest 77 passed, manifest `2.3.8.2860 / 2.3.8.286` OK.
- 실제 완료 기준: Windows CDP:O에서 2개 이상 계정, 첫 실행 전에 목록 밖 Explore 자료 0개, 계정별 새 tab/target, 이전 오류 탭 제거, 마지막 자동 탭 제거, 사용자 탭 보존, 자동 WS direct와 수동 다운로드 각각 실제 파일 OK.
- 제외 목표: Instagram 검색 이동, fingerprint/UA 변경, 자동·수동 다운로드 재통합, 기능 외 UI 변경.

## v282 현재 작업
- 상태: `[검증대기]`
- 단일 목표: MAIN 우상단 진단 중복을 한 줄 상태와 `_ / □`로 통합하고, SIDE 0/N을 한 번에 1/N으로 바꾸는 `1부터` 버튼을 추가한다.
- MAIN 표시: `CDP:O · 탭 N · OWNER tab 000000`; 클릭 시 전체 진단 복사, `_` 축소·복원, `□` 상세 열기.
- 상세 패널은 자동 갱신하지 않고 열 때와 `새로고침` 버튼에서만 최신 상태를 읽는다.
- 기존 `CDP`, 탭 표시, `DOM 진단복사`, `MAIN v 👁`의 화면 중복은 숨긴다.
- SIDE `1부터`: 목록 존재 + index 0 + 자동실행 정지일 때만 활성, 클릭 시 index 1 저장, summary 토글 이벤트 차단.
- 변경 모듈: IG Content UI, MAIN ready/DOM 진단 버전 표식, Side HTML/JS, manifest/version.
- 신규 테스트: `IG_StYellow/test_ext_ui_compact_v282.js`.
- 정적 결과: JavaScript syntax 48 OK, IG test 37 OK, Python compile 33 OK, pytest 74 passed.
- 실제 완료 기준: Chrome에서 한 줄 상태만 표시, 클릭 복사, 패널 텍스트 선택 3초 이상 유지, `_ / □` 동작, Side 0/3에서 `1부터`→1/3, 1 이상·실행 중 비활성 확인.
- 제외 목표: OWNER_LOST fallback, pending handoff 정리, Analyze8780 KST 표시는 이번 작업에 포함하지 않는다.

## v281 이전 작업
- 상태: `[검증대기]`
- 단일 목표: YELLOW 관리 새 탭을 Instagram 로드 전에 CDP로 선삽입해 unload 등록을 차단하고 실제 등록·호출 원인을 로그로 확인한다.
- `CL-01`: Background→Auto8700 bootstrap target 탐색 요청.
- `CL-02`: `Page.addScriptToEvaluateOnNewDocument` 등록 확인.
- `CL-03`: 빈 문서 즉시 설치 후 Instagram 이동 확인.
- `CL-04`: unload 차단 또는 beforeunload/pagehide/visibilitychange 등록·실행 source/stack 수집.
- 변경 모듈: Auto8700, IG Background, IG Content bridge, manifest/version.
- 신규 테스트: `IG_StYellow/test_ext_cdp_lifecycle_preload_v281.js`, Auto8700 lifecycle 단위 테스트 3개.
- 정적 결과: JavaScript syntax 47 OK, IG test 36 OK, Python compile 33 OK, pytest 74 passed, 생성 스크립트 동적 모형 OK.
- 실제 완료 기준: 3계정 이상 자동 실행에서 각 replacement 탭마다 CL-01→CL-03 완료, 문제 unload는 BLOCKED_REGISTER/BLOCKED_PROPERTY 기록, 이전 탭 종료 뒤 다음 계정 자동 계속, 응답 없음 재발 없음.
- 제외 목표: OWNER_LOST fallback 교정, pending handoff 정리, Main 복사 UI, Analyze8780 KST 표시는 이번 작업에 포함하지 않는다.

## IG v280 미완료 이전 작업
- 상태: `[검증대기]`
- 체크 ID: `T-IG-V280-TAB-OWNER-001`
- 단일 목표: 여러 Instagram 탭의 OWNER를 최근 이력으로 관리하고 새 탭 OWNER 확정 뒤 이전 탭을 닫는다.
- Background는 최근 20개 탭 이벤트, generation, run_seq, pending handoff를 저장하고 서비스 워커 재시작 시 수명 상태를 복원한다.
- Side는 새 tab_id를 먼저 세션에 반영한 뒤 `IGBLUE_COMMIT_TAB_HANDOFF`를 호출한다.
- Main `igblue_main_diag_toggle/panel`과 DOM 진단복사에 CDP·탭 수·OWNER·인계 이력을 표시한다.
- v279c WS8771 direct 다운로드는 변경하지 않는다.
- 테스트: `test_ext_tab_control_v280.js`, `test_ext_tab_replacement_v279d.js`, 전체 회귀.
- 정적 결과: JavaScript syntax 46 OK, IG test 35 OK, Python compile 33 OK, pytest 71 passed.
- 실제 Chrome 완료 기준: CDP:X→O 시작과 CDP:O 시작 모두 3계정 완료, 매 전환 OWNER 선확정, 이전 탭 종료, 중단 없음.


## IG v279d 완료 참고
- 상태: `[완료]`
- 체크 ID: `T-IG-V279D-TAB-REPLACE-001`
- 단일 목표: 자동 계정 전환을 기존 탭 URL 재사용에서 새 탭 교체 방식으로 변경한다.
- 새 탭을 비활성으로 생성하고 Content/Main 준비 확인 후 활성화한 다음 이전 자동 탭만 닫는다.
- 새 탭 실패 시 이전 탭을 보존하고 새 탭만 제거한다.
- 이전 탭 종료 guard는 900ms 제한을 두며 실패·timeout이 새 탭 진행을 막지 않는다.
- document_start unload 전역 후킹은 제거하고 이전 탭 종료 직전의 제한 guard만 남긴다.
- 유지: v279c WS8771 direct MP4/JPG 저장, v279ccc 진행률·No·ETA.
- 테스트: `test_ext_tab_replacement_v279d.js`, `test_ext_navigation_unload_guard_v279cc.js`, 전체 IG 회귀.
- 정적 결과: JavaScript syntax 45 OK, IG test 34 OK, Python compile 33 OK, pytest 71 passed.
- 실제 Chrome 확인: 첫 계정 새 tab_id, 이전 tab_id 종료, 다음 계정 반복, 자동종료 후 현재 탭 클릭, MP4/JPG 저장.
- 제외: 카테고리 100개, Analyze8780 성장 분석 UI.
## IG v279ccc 현재 작업
- 상태: `[검증대기]`
- 첫 계정·다음 계정 URL 이동 전 guard 호출/결과/차단/URL update/ready 콘솔 로그를 남긴다.
- guard 실패는 첫 URL 이동 중단이 아니라 `GUARD_FAILED_CONTINUE` 기록 후 이동 계속으로 변경했다.
- `#IGBLUE_NoTop` 생성만 기다리지 않고 MAIN 스크립트 끝의 ready marker를 확인한다.
- 다운로드 No는 실제 rank가 있을 때만 표시하고 `No---` 기본값은 제거했다.
- 자동 진행률은 전체 계정×Top 목표 기준이며 자동종료 전 100%가 되지 않는다.
- 발견 자산은 shortcode+mp4/jpg 단위로 예정/완료를 집계해 `파일 완료/예정`으로 표시한다.
- 종료예상은 최근 성공 세트 20개의 전체 처리시간 이동평균과 설정 대기시간을 사용한다. 표본 전에는 `계산중`이다.
- 테스트: `test_ext_navigation_unload_guard_v279cc.js`, `test_ext_progress_eta_v279ccc.js`, 전체 IG 회귀.
- 정적 결과: JavaScript syntax 44 OK, IG test 33 OK, Python compile 33 OK, pytest 71 passed.
- 실제 Chrome 결과: CDP:O 2계정·3계정, 3계정×Top3, 파일 18/18, 자동종료 `OK`.

## 이전 IG v279cc URL 이동 unload guard·준비 확인
- 상태: `[검증대기]`
- 체크 ID: `T-IG-V279CC-NAV-UNLOAD-READY-001`
- 단일 목표: 자산 2/2 완료 뒤 다음 계정 URL 이동에서 `unload` 등록을 제한하고 새 문서 Content/Main 준비가 확인된 뒤 자동 실행을 재개한다.
- 변경: URL 이동 전 MAIN world에서 `unload` addEventListener와 `window.onunload`만 차단한다.
- 변경: guard 설치 실패 시 URL을 열지 않고 오류·tab_id·guard 결과를 남긴다.
- 변경: Side 고정 4.5초 대기를 제거하고 Background가 목표 URL·탭 complete·Content probe·Main panel을 확인한다.
- 진단: `unload_guard`, `navigation_ready`, 실제 URL, 탭 status, probe 오류, 시도 횟수, 준비 소요시간을 cycle 결과에 남긴다.
- 신규 테스트: `IG_StYellow/test_ext_navigation_unload_guard_v279cc.js`.
- 정적 결과: JavaScript syntax 39 OK, IG test 32 OK, Python compile 33 OK, pytest 71 OK.
- 실제 Chrome 확인: 2/2 완료 → 다음 계정 이동, Permissions policy 경고 억제 여부, 1/3→2/3 자동 재개, 다운로드 회귀.
- 제외: 다운로드 진행률/No/ETA, 기본 카테고리 100개, Analyze8780 시각화.

## IG v279c v262 자동 다운로드 exact 복원
- 상태: `[완료]`
- 체크 ID: `T-IG-V279C-AUTO-V262-RESTORE-001`
- 기준: v262 CDP:O 사용자 실제 확인 — 2개 계정 순회, 전체 게시물 5개, MP4 5개, JPG 5개, `WS8771 direct download`, 실제 저장 경로 표시.
- 변경: 자동 snapshot 자산은 MP4/JPG URL만 허용하고 `metadata`를 자동 완료 자산에서 제거했다.
- 변경: 자동 direct/cache pair와 WS8771 direct asset 전송을 v262 구현으로 복원했다.
- 완료 조건: 실제 파일 저장 또는 실제 중복 파일·JSON·보고서 확인. metadata만 저장된 경우 완료 수 증가 금지.
- 유지: 수동·Filtered metadata 정책, Side 계정 클릭 선택, MAIN hover 비활성, v279b 상태 보존.
- 정적 결과: JS syntax 38 OK, IG test 30 OK, 폐기 진단 1 SKIP, Python compile 33 OK, pytest 70 OK.
- 실제 Chrome v279c 결과: 사용자 연속 실행 MP4/JPG 실제 저장·WS8771 direct 완료 `OK`.
- v279c 항목은 완료 처리하고 v279cc URL 이동 회귀에서 자동 저장이 유지되는지 확인한다.

## IG v279bb MAIN 스코프·자동 다운로드 복구
- 상태: `[코드반영]`
- 체크 ID: `T-IG-V279BB-MAIN-SCOPE-001`
- `IGBLUE_MAIN_HOVER_DIAGNOSTIC_ENABLED is not defined` 오류를 제거했다.
- v279bb 당시 v279aaaa 동일 비교는 실제 자동 파일 저장을 보장하지 못했고, 사용자 확인에서 MP4/JPG 0개로 실패했다. v279c에서 v262 exact 경로로 대체했다.
- 정적·단위 결과: JS syntax 37 OK, IG test 29 OK, 진단 1 SKIP, Python compile 33 OK, pytest 71 OK.
- 실제 Chrome 자동 다운로드는 검증대기다.
- `IGBLUE_` → `YELLOW` 전체 변경은 별도 후속 작업이다.

## IG v279b 현재 작업
- 체크 ID: `DOWNLOAD-STATUS-HOLD-01`
- 상태: `[코드반영]`
- 단일 목표: 다운로드 시작 전에는 상태 표시를 변경하지 않고, 실제 시작 순간에만 초기화하며, 완료 후 마지막 실제 파일 정보를 보존한다.
- 제거: 계정 이동·새 자동실행·`auto_account_continue`에서 다운로드 상태를 선제 초기화하는 처리.
- 제거: 다운로드 전 `자동현황 대기 / 다운로드 진행 없음`, `No---`, `asset: 파일`, `파일: 대기중`을 자동 생성하는 처리.
- 유지: 자동 Top, 수동 JPG/MP4, Side 계정 클릭, Auto8700·WS8771, 완료 집계·자동종료.
- 정적 결과: `test_ext_download_status_preserve_v279b.js` 및 전체 IG 회귀 검사 OK.
- 실제 Chrome 결과: `UNKNOWN`.
- 다음 확인: 완료 표시가 있는 상태에서 새 자동실행을 시작해 후보 탐색·계정 이동 동안 표시가 그대로인지, 실제 다음 다운로드 시작 순간에만 새 파일 상태로 바뀌는지 확인한다.

### 제공 로그 검토
- 첫 실행: 11:31:20~11:31:53, 3개 계정×목표 2개 완료 로그 존재.
- 두 번째 실행: 11:33:22~11:33:59, 첫 계정 2개·마지막 계정 2개 완료 로그 존재.
- 두 번째 실행의 2/3 계정은 `AD-02` 이후 로그가 없으며 다음 계정으로 전환됐다. 현재 로그만으로 후보 없음 사유는 확인 불가하므로 별도 완료·실패 판정하지 않는다.
## IG v279aaaa
- [코드반영] Side `IG 계정명` 클릭 전용 추가 대상 선택.
- [코드반영] `계정 확인중`을 `IG 계정 선택`으로 교체.
- [코드반영] 자동 계정 확인 타이머·Main current-account polling·URL 자동 초기화 제거.
- [검증대기] 다른 계정 카드 연속 선택·계정추가·SQLite 저장 실제 확인.

## IG v279aaa
- `[코드반영]` MAIN hover 비활성 진단.
- 실제 Chrome에서 MAIN JPG/MP4 및 페이지 이동 재검증 필요.

<!-- FILE: _St/ai_read_패치.md | ROLE: sort 전체 현재 작업·검증대기 -->
# sort 현재 패치 — v286

## IG v279aa
- 수동 다운로드 복구와 Auto8700 안내 우선순위 교정
- 실제 Chrome 검증대기

상태: `[코드반영·실제 Windows 검증대기]`

## 단일 목표

Auto8700의 `자동실행`과 `CDP모드 실행`이 8700 포트만 남은 불완전 상태를 정상으로 오판하지 않고, 실제 CDP Chrome과 Instagram Runtime을 준비하도록 복구한다.

- `/json/version` 응답만으로 실행 성공 처리하지 않음
- Instagram page target·webSocketDebuggerUrl·Runtime.evaluate 응답 확인
- `/json/new`는 PUT으로 호출하고 실패 시 browser `Target.createTarget` 사용
- 수동 `자동실행`·`CDP모드 실행`은 기존 정상 Instagram 탭을 앞으로 표시
- 8700만 열리고 Runtime이 없으면 `CDP:PORT`·`CDP 복구` 표시
- 전용 `D:\cdp-data-dir` Chrome만 복구 종료 후 재실행
- 일반 Chrome User Data 프로세스는 종료하지 않음
- 설정 창에 CDP 실행 성공 또는 실패 원인 표시

## 실제 확인

- Auto8700 `자동실행` 클릭 → 전용 CDP Chrome 실행 또는 기존 탭 앞으로 표시
- 설정 `CDP모드 실행` 클릭 → 같은 동작과 결과 문구 확인
- 전용 CDP Chrome 강제 종료·8700 잔류·Instagram 탭 없음 상태 각각 복구 확인
- 일반 Chrome 창·프로필은 유지

## 제외

- Instagram 다운로드 로직
- Main 계정 hover/click
- 응답 없음 이후 계정 자동 스킵
- Analyze8780 UI 변경
## v290 Analyze8780
- 차트 결측값 null 단절, 화면 설정, 로컬 JPG 우선, MP4 재생, 파일/폴더 버튼 코드반영
- 코드 검증 OK, 실제 Windows UI 검증대기
