<!-- FILE: _St/IG_StYellow/ai_read.md | ROLE: IG 확장 현재 기준 -->

## v287 패키지 버전 동기화
- manifest `2.3.8.2870`, 표시 버전 `2.3.8.287`, Side package `v287`.
- IG 자동·수동 다운로드와 새 탭·CDP 종료 기능은 검증된 v286 동작을 변경하지 않았다.
- 이번 기능 변경은 Analyze8780이며 IG 파일은 패키지 버전 표식만 동기화했다.


## v286 자동 새 탭·CDP 강제 종료 현재 기준
- 기준본은 v282이며 v279c의 자동 WS8771 direct MP4/JPG 경로, 수동 Chrome/WS 경로, v282 compact UI와 `1부터`를 유지한다.
- 자동 새 실행·재개는 현재 탭을 작업 탭으로 사용하지 않고 `IGBLUE_NAVIGATE_ACTIVE_TAB`으로 새 관리 탭을 만든다.
- 계정 목록 `0/N`은 목록 1번 계정 URL을 새 탭으로 열어 Explore 잔존 snapshot을 건너뛴다.
- 계정 목록이 없으면 사용자가 보고 있던 Instagram URL을 새 자동 탭으로 복제한다.
- replacement 탭에는 `auto_created`, `cdp_target_id`, generation, run_seq, account를 저장하고 서비스 워커 재시작 후 최근 이벤트에서 복원한다.
- Side OWNER commit 후 이전 탭은 `IGBLUE_CLOSE_MANAGED_AUTO_TAB`으로 종료한다. 사용자 탭은 보존한다.
- 자동 중지·오류 및 최종 자동종료에서도 현재 자동생성 탭을 종료한다.
- 실행 버전 `2.3.8.2860`, 표시 버전 `2.3.8.286`.
- 정적 결과: IG JavaScript test 38 OK, 전체 JavaScript syntax 49 OK, Python compile 33 OK, pytest 77 passed.
- 실제 Chrome 다계정·오류 탭 강제 종료·마지막 탭 종료·사용자 탭 보존은 `[검증대기]`다.

## v282 MAIN 진단 통합·SIDE 1부터 현재 기준
- MAIN 우상단의 별도 CDP, 탭, DOM 진단복사, MAIN 눈 표시를 화면에서 숨기고 `CDP:O · 탭 N · OWNER tab 000000` 한 줄로 통합한다.
- 통합 상태줄 클릭은 전체 CDP·OWNER·현재 탭·최근 20개 이력을 클립보드에 복사한다. 긴 진단 툴팁은 사용하지 않는다.
- `_`는 통합 상태줄 축소·복원을 토글하고 `□`는 상세 패널을 연다. 축소 상태는 `localStorage`에 유지한다.
- 상세 패널은 열 때 한 번, `새로고침` 클릭 때 한 번만 렌더링한다. 700ms 반복 `textContent` 갱신은 제거해 드래그 선택과 `Ctrl+C`가 풀리지 않게 한다.
- 상세 패널 내부에는 `새로고침`, `전체 복사`만 둔다.
- SIDE 수집계정 헤더에 `1부터` 버튼을 추가한다. 목록이 있고 현재 index가 0이며 자동실행이 정지 상태일 때만 활성화한다.
- `1부터` 클릭은 summary 축소·확장을 건드리지 않고 실제 계정 시작 index를 1로 저장한다. index가 1 이상이거나 자동실행 중이면 비활성화한다.
- 실행 버전 `2.3.8.2820`, 표시 버전 `2.3.8.282`.
- 정적 결과: JavaScript syntax 48 OK, IG test 37 OK, Python compile 33 OK, pytest 74 passed.
- 실제 Chrome의 통합 표시 위치·복사·축소/복원·정적 패널 선택 유지·SIDE 1부터 버튼은 `[검증대기]`다.

## v281 CDP unload 선차단·수명주기 진단 이전 기준
- 새 replacement 탭은 Auto8700 bootstrap URL로 비활성 생성한 뒤 CDP preload 성공/실패 결과를 받고 Instagram으로 이동한다.
- `Page.addScriptToEvaluateOnNewDocument`로 Instagram 페이지 스크립트보다 먼저 MAIN world 코드를 실행한다.
- 관리 탭에서 `unload` addEventListener와 `window.onunload`만 차단한다.
- `beforeunload/pagehide/visibilitychange`는 차단하지 않고 최초 등록 source/stack과 실제 EVENT를 콘솔·Background 저장소에 남긴다.
- Content bridge는 CustomEvent와 DOM JSON buffer를 함께 읽고 중복 event를 제거해 Background로 전달한다.
- 실행 버전 `2.3.8.2810`, 표시 버전 `2.3.8.281`.
- 정적 결과: IG test 36 OK, 전체 JS syntax 47 OK, 전체 pytest 74 passed.
- 실제 Chrome 3계정 연속 실행·먹통 재발 여부는 `[검증대기]`다.

## v280 OWNER 인계·탭 진단 이전 기준
- 최근 Instagram 탭 이벤트는 최대 20개를 저장한다.
- OWNER 선택 우선순위는 현재 기록 OWNER → 같은 run_seq의 높은 generation READY/OWNER → 다른 관리 READY/OWNER → 활성 Instagram → 큰 tab_id 보조 기준이다.
- Background는 새 탭 ready·활성화 뒤 `handoff_token`만 반환하며 이전 탭은 유지한다.
- Side가 새 tab_id를 세션에 반영하고 `IGBLUE_COMMIT_TAB_HANDOFF`를 보내면 OWNER를 확정한 뒤 이전 탭을 종료한다.
- pending handoff와 최근 이벤트의 수명 상태는 storage에서 복원 가능하다.
- `igblue_main_diag_toggle`은 `탭 N · OWNER`, `old→new`, `OWNER 없음`을 표시한다.
- `igblue_main_diag_panel`과 DOM 진단복사는 OWNER tab_id, generation, run_seq, 계정, 인계 상태, 현재 탭, 최근 20개 이력을 포함한다.
- 실행 버전 `2.3.8.2800`, 표시 버전 `2.3.8.280`.
- 정적 결과: JavaScript syntax 46 OK, IG test 35 OK, Python compile 33 OK, pytest 71 passed.
- 실제 CDP:X→O 시작과 다중 탭 제어권 인계는 `[검증대기]`다.


## v279d 새 탭 교체 자동 이동 기준
- `IGBLUE_NAVIGATE_ACTIVE_TAB`은 기존 탭 URL을 직접 교체하지 않고 새 비활성 Instagram 탭을 생성한다.
- 콘솔 순서: `NEW_TAB_CREATE_BEFORE` → `NEW_TAB_CREATED` → `NEW_TAB_READY` → `NEW_TAB_ACTIVATED` → `OLD_TAB_CLOSE_BEFORE` → `OLD_TAB_CLOSED`.
- 새 탭은 목표 URL·tab complete·Content bridge·`data-yellow-main-injection-ready=v279d`를 확인한 뒤 활성화한다.
- 새 탭 준비 실패 시 `NEW_TAB_READY_FAIL`을 남기고 새 탭을 제거하며 이전 탭을 다시 활성화한다.
- 이전 탭 종료 직전에만 `CALL_BEFORE_TAB_CLOSE` unload guard를 시도한다. guard 실패·900ms timeout은 종료를 막지 않는다.
- `instagram_inject.js`의 document_start 전역 unload 후킹은 제거했다. MAIN ready marker만 유지한다.
- 이전 탭 `onRemoved`가 새 replacement `tab_id`를 `0`으로 덮지 않도록 활성 replacement target을 유지한다.
- v279c WS8771 direct MP4/JPG 자동 저장, No 표시, 전체 진행률, ETA 기능은 변경하지 않는다.
- 실행 버전 `2.3.8.27910`, 표시 버전 `2.3.8.279d`.
- 정적 결과: JavaScript syntax 45 OK, IG test 34 OK, Python compile 33 OK, pytest 71 passed.
- 실제 Chrome CDP:O에서 2계정·3계정, 3계정×Top3, 파일 18/18, 자동종료가 확인돼 `[완료] / OK`다.
## v279ccc URL 이동 콘솔·진행률·ETA 기준
- 첫 계정과 다음 계정의 공용 URL 이동 함수는 `chrome.tabs.update()` 전에 MAIN world guard 설치를 시도한다.
- 페이지 콘솔 순서: `CALL_BEFORE_URL` → `INSTALL_OK/REUSED` → 필요 시 `BLOCKED_ADD/BLOCKED_PROPERTY`.
- Side/Background 콘솔 순서: `SIDE_REQUEST` → `GUARD_REQUEST/RESULT` → `URL_UPDATE_BEFORE` → `URL_UPDATE_CALLED` → `READY`.
- guard 설치 실패는 `GUARD_FAILED_CONTINUE`로 기록하고 URL 이동을 계속한다.
- `instagram_inject.js` document_start guard와 MAIN 스크립트 끝의 `data-yellow-main-injection-ready=v279ccc` marker를 사용한다.
- 준비 확인은 목표 URL·tab complete·Content 응답·MAIN marker를 기준으로 한다. `#IGBLUE_NoTop`은 참고값이다.
- 다운로드 No는 실제 rank가 있을 때만 표시한다.
- 자동 진행률은 전체 계정×Top 목표 완료 게시물 기준이며 자동종료 전 최대 99%, 자동종료에서 100%다.
- 실제 발견 자산은 shortcode+mp4/jpg 키로 예정·완료를 중복 없이 집계한다.
- ETA는 최근 성공 세트 20개 전체 처리시간의 평균과 설정 대기시간을 사용하고 표본 전에는 `계산중`이다.
- 실행 버전 `2.3.8.2799`, 표시 버전 `2.3.8.279ccc`.
- 정적 결과: JavaScript syntax 44 OK, IG test 33 OK, Python compile 33 OK, pytest 71 passed.
- 실제 Chrome 첫 URL/다음 URL·진행률·ETA는 `[검증대기]`다.

## v279c v262 자동 다운로드 복원 기준
- 기준본은 v279bb이며 자동 다운로드 실행부의 정상 기준은 사용자 실제 확인 v262 CDP:O이다.
- v262 자동 함수 `teAutoPyDownloadableKindsFromCache`, `teAutoPyDownloadMediaPairFromCache`, `teAutoPyDirectDownloadAsset`, `teAutoPyDownloadMediaPairDirect`를 이식했다.
- 자동 Top의 자산 목록은 실제 `video_url`과 `img_origin/img_large/img_small/img_b64`로 만든 `mp4/jpg`만 허용한다.
- `Video 저장 / Image 저장` 선택과 `metadata-only` 정책은 자동 Top 완료 판정에 관여하지 않는다. 수동·통계 metadata 기능은 유지한다.
- direct/cache 다운로드는 `IGBLUE_DOWNLOAD_URL` → background → WS8771 `ig_media_download_direct` 경로를 사용한다.
- 실제 파일 저장 또는 중복 파일 후처리 성공이 하나 이상 있어야 pair가 성공한다. metadata만으로 `AD-06/AD-07` 완료 처리하지 않는다.
- Side 계정 클릭 선택, MAIN hover 비활성, MAIN 스코프 오류 방어, v279b 상태 보존은 유지한다.
- 실행 버전 `2.3.8.2797`, 표시 버전 `2.3.8.279c`.
- 실제 Chrome v279c 자동 결과는 사용자 연속 실행에서 MP4/JPG 실제 저장·WS8771 direct 완료가 확인돼 `[완료] / OK`다.

## v279bb MAIN 스코프 오류 제거·자동 다운로드 복구 기준
- 기준본은 v279b이다.
- `instagram_inject.js`의 첫 MAIN IIFE 내부 지역변수 `IGBLUE_MAIN_HOVER_DIAGNOSTIC_ENABLED`를 뒤쪽 별도 IIFE가 직접 참조하던 오류를 제거했다.
- 별도 hover 패치는 `window.__IGBLUE_MAIN_HOVER_DIAGNOSTIC_ENABLED__ === true`만 검사하며, 값이 없거나 false이면 정리 후 즉시 종료한다.
- hover 비활성 상태에서는 `ReferenceError` 없이 뒤쪽 MAIN 초기화와 자동 다운로드 보조 패치가 계속 실행돼야 한다.
- v279bb 당시 v279aaaa 함수 동일 비교만으로 복구를 판단했으나 실제 MP4/JPG 0개가 확인됐다. 현재 자동 기준은 v262 exact 경로다.
- v279b의 다운로드 상태 보존·실제 start 초기화 기능은 유지한다.
- 실행 버전은 `2.3.8.2796`, 표시 버전은 `2.3.8.279bb`이다.
- `IGBLUE_` 전체 명칭을 `YELLOW`로 바꾸는 작업은 사용자 지시에 따라 최종 안정화 후 별도 작업으로 보류한다. 이번 버전에서는 명칭을 혼합 변경하지 않는다.
- 실제 Chrome 자동 Top 재검증 전 상태는 `[코드반영] / UNKNOWN`이다.

## v279b 다운로드 상태 보존 기준
- 기준본은 v279aaaa이다.
- 다운로드 시작 전에는 기존 완료 표시를 건드리지 않는다. 기존 표시가 없으면 빈 상태를 유지한다.
- 계정 이동, 후보 탐색, 자동실행 시작, 다음 계정 계속, `auto_account_continue`는 다운로드 표시 변경 조건이 아니다.
- 실제 `ndy_down_progress status=start` 수신 시에만 이전 파일·경로·shortcode·asset·진행률을 초기화한다.
- `done/already_done/error`는 화면에 반영한 뒤 다음 실제 시작까지 보존한다.
- 자동종료는 마지막 실제 파일 상세를 유지하면서 제목·전체 완료 집계만 종료 상태로 갱신한다.
- 실행 버전은 `2.3.8.2795`, 표시 버전은 `2.3.8.279b`이다.
- 실제 Chrome 검증 전 상태는 `[코드반영] / UNKNOWN`이다.

### 제공 실행 로그 판정
- 11:31 실행: artart.today, peripera_official, moyasi_jm에서 게시물 2개씩 `AD-06/AD-07` 완료.
- 11:33 실행: dukong_meal 2개, seoyoung_644 2개 `AD-06/AD-07` 완료.
- housej.jihye는 `AS-03 2/3`까지만 있고 `AD-02`가 없어 실제 다운로드 완료 근거가 없다. 다음 계정 전환 사유는 제공 로그에 없다.
## v279aaaa Side 계정 클릭 선택 기준
- 기준본은 실제 수동 JPG/MP4와 unload 오류 해소가 확인된 v279aaa이다.
- MAIN hover 계통은 계속 비활성 상태로 유지한다.
- 수집계정 추가 대상은 Side 카드의 `IG 계정명` 클릭으로만 선택한다.
- 초기 버튼은 `IG 계정 선택`이며, 클릭 후 `계정명 계정추가`로 바뀐다.
- 400ms 자동 계정 확인, Main Injection 계정 응답 조회, URL 변경에 따른 자동 대상 교체를 제거한다.
- 클릭만으로 목록에 저장하지 않으며 `계정추가` 후 `💾 저장`으로 확정한다.
- 실행 버전은 `2.3.8.2795`, 표시 버전은 `2.3.8.279b`이다.
- 실제 Side 카드 연속 선택·추가·저장은 `[검증대기] / UNKNOWN`이다.

## v279aaa MAIN hover 비활성 진단 기준
- 기준본은 v279aa이다.
- Side·Auto8700·WS8771·자동 Top·수동 다운로드 전송 경로는 변경하지 않는다.
- MAIN의 썸네일 계정 hover `pointerenter/pointermove/pointerleave`, 200ms 확정 타이머, 다운로드 버튼 hover 색상·좌표 추적, `IGBLUE/hover_target` localStorage 기록만 비활성화한다.
- MAIN JPG/MP4 클릭 이벤트와 `ndy_ig_bg_down` 전달은 유지한다.
- 사용자 확인 전 상태는 `[코드반영] / UNKNOWN`이다.
- v279aa 실제 결과: MAIN Injection OFF에서는 자동 Top 2/2, MP4 2개, JPG 2개, WS8771 저장, 자동종료가 정상. MAIN Injection ON에서는 JPG 클릭 시 unload JS 오류·응답 없음이 재현됨.

## v279aa 기반 유지 기능
- v279의 화면·SPA·계정·Top·저장 선택·snapshot 기능은 유지한다.
- 수동 및 Filtered 다운로드는 WS8771 연결 시 기존 로컬 저장 경로를 사용하고, 미연결 시 Background `chrome.downloads`로 자동 전환한다.
- 자동 Top 다운로드는 중복 확인·JSON·보고서가 필요하므로 WS8771 경로를 유지한다.
- MAIN `fetch → Blob → URL.createObjectURL → a.click()` 경로는 unload 오류 때문에 폐기한다.
- Auto8700/WS8771이 기본이며 CDP는 자동예약 옵션이다.
- Auto8700 미실행 상태에서는 `_St.zip` 다운로드와 `_St\Auto8700\run_auto_service8700_manager.bat` 실행 안내를 먼저 표시한다.
- 실제 Chrome 검증 전 상태는 `[코드반영] / UNKNOWN`이다.

# IG_StYellow 현재 기준 — v281

상태: `[검증대기·OWNER 인계/CDP:X→O]`

- 실행 버전은 `2.3.8.2794`, 표시 버전은 `2.3.8.279aaaa`이다.
- Auto8700/WS8771은 기본 엔진이다. CDP는 자동예약에만 필요하며, Auto8700 미실행 시 `_St.zip`과 BAT 실행 안내를 먼저 표시한다.
- `↗`는 자동실행 중 차단하고, popup의 동일 Instagram tab_id 연결 확인 뒤에만 기존 Side Panel을 닫는다. 실패 시 기존 Side를 유지한다.
- 수동·Filtered에는 `Video 저장 / Image 저장`을 독립 적용하고 선택하지 않은 파일의 직접링크·metadata를 보존한다. 자동 Top은 저장 선택과 metadata-only 완료를 사용하지 않는다.
- 저장 상태는 `metadata_collected / video_requested / video_downloaded / image_requested / image_downloaded`로 구분한다.
- v275의 `자동실행 사용 / 시작 / 중지`, 방식 3의 `tab_id · 개수`, 톱니바퀴 우측 정렬, Side IG 계정 클릭 대상 선택, 수동 MP4/JPG 클릭 즉시 시작 강조를 유지한다.
- 자동 계정 목록은 `0/N` 현재 Instagram 시작과 `1/N 이상` 지정 URL 직접 시작을 분리한다.
- 사용자 중지·자동종료 뒤 자동실행 사용 설정은 유지하며 시작 가능·중지 불가 대기 상태로 돌아간다.
- Top sorted 자동은 첫 pending snapshot을 즉시 다운로드하고 저장 완료 shortcode를 중복 다운로드하지 않으며 목표 미달이면 swipe 탐색을 계속한다.
- 자동 Top 다운로드는 WS8771 저장·중복·JSON·보고서 경로를 사용한다. 수동·Filtered 다운로드는 WS 미연결 시 Background Chrome 다운로드로 복구한다. Main active 대상이 정확하면 AD-03 `[체크완료]`, snapshot 복구 조건이 정확하면 `[복구완료]`로 진행한다.
- Side 전체 카드 DOM은 유지하고 화면 밖 img src/srcset만 해제한다. Base64 썸네일과 매초 전체 payload 재전송은 금지한다.
- Visual settings의 Use/Side/Main은 독립 저장하며 다운로드 상태 강조는 정확한 shortcode·asset_kind만 표시한다.
- MAIN 순위 시각 UI는 제거 상태를 유지하고 Side No/rank는 유지한다.

- v278은 v262 실동작으로 확인된 snapshot/Side 직접 URL 회복 다운로드를 복원한다. 자동 preload의 cache fallback 전면 차단을 제거하고, 정확한 snapshot만 복구 대상으로 허용한다. 수동 다운로드는 변경하지 않는다.


## v279a 실패 기록 — 1차 회귀 분리

- v279의 UI, SPA 이동, hover, 계정 queue, Top 선정, Video/Image 선택, snapshot 복구는 유지한다.
- 실제 전송 core만 v262의 `sendMainBackgroundDownload()`와 `igblueDownloadWithApi()` 구현으로 복원한다.
- 저장은 `content → background → WS8771 ig_media_download_direct` 단일 경로다.
- v276의 10초 DOM/heap 표본, Long Task, V scan 계측, `pagehide` 표본 저장은 제거한다.
- `manifest.json`에는 주석과 임의 키를 넣지 않고, 경로·역할은 이 문서에서 관리한다.

## 주요 파일 위치와 역할

| 파일 | 역할 | 현재 처리 |
|---|---|---|
| `_St/IG_StYellow/manifest.json` | Chrome 확장 설정 | 표준 키만 사용, 내부 주석 금지 |
| `_St/IG_StYellow/background.js` | WS8771 자동 저장·수동 Chrome fallback | v279aa 수동 복구 |
| `_St/IG_StYellow/content_instagram.js` | MAIN/Background relay | legacy 메시지도 Background 다운로드로 전환 |
| `_St/IG_StYellow/js/instagram_inject.js` | MAIN DOM 분석·인젝션 | v276 진단 제거, v279aaa에서 hover 계통만 비활성 |
| `_St/IG_StYellow/side.js` | Side·자동실행·작업 조립 | v279b 실제 시작 전 상태 보존·시작 시 초기화 |
| `_St/IG_StYellow/test_ext_download_restore_v279aa.js` | 수동 fallback·안내 우선순위 회귀 검사 | 유지 |
| `_St/IG_StYellow/test_ext_main_hover_disabled_v279aaa.js` | MAIN hover 비활성 진단 회귀 검사 | 실제 사용자 검증 OK |
| `_St/IG_StYellow/test_ext_side_account_click_v279aaaa.js` | Side 계정 클릭 전용 선택 회귀 검사 | 유지 |
| `_St/IG_StYellow/test_ext_download_status_preserve_v279b.js` | 다운로드 시작 전 보존·실제 시작 초기화 회귀 검사 | 신규 |