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


## v323 현재 기준
- manifest `2.3.8.3230 / 2.3.8.323`.
- 자동 Top 다운로드 대상은 MP4만이다. JPG는 자동 후보·파일수·목표·ETA·현재/전체 집계에서 완전히 제외한다.
- JPG 자동 저장은 Cache8701 전담이며 IG 자동다운로드와 연결하지 않는다.
- 수동 JPG 클릭은 WS8771 `IGBLUE_DOWNLOAD_URL`/direct download를 사용하지 않고 MAIN의 원래 `fetch → Blob → objectURL → a.download` 브라우저 다운로드로 처리한다. Side 자동 진행/완료 상세 상태도 만들지 않는다.
- 수동/자동 MP4의 기존 WS8771 direct 경로와 편집폴더 기능은 변경하지 않는다.
- 전용 회귀 `test_ext_jpg_manual_original_v323.js`; IG Node 전체 56/56, 전체 JS syntax 68 OK. 사용자 실제 Chrome에서 Side/Main 수동 JPG 원래 브라우저 다운로드는 OK. 자동 MP4-only 화면은 `[검증대기]`.
- v322 톱니바퀴 Settings 복구는 사용자 실제 Chrome에서 정상 확인되어 `[완료]`.

## v322 현재 기준
- manifest `2.3.8.3220 / 2.3.8.322`.
- v319 dead-code 제거 때 함께 삭제된 v317 Side 설정 전역 선언을 정확히 복원했다: `teAutoPyStatsTimer`, `teAutoPyStatsLastMainPush`, `m/b/g/_`, `y/v/w/x`.
- settings handler는 v317 원형인 Instagram target gate + `T()` 호출로 복구했다. v321 target 비의존 수정은 원인 오판으로 폐기한다.
- `test_ext_settings_modal_restore_v322.js`는 `T()`를 최소 DOM에서 실제 실행하여 `settingsModal`이 body에 생성되는지까지 검사한다.
- IG Node 전체 55/55 OK. 사용자 실제 Chrome에서 톱니바퀴 클릭 Settings 표시 정상 확인 `[완료]`.


## v321 원인 오판 기록 — 현재 기준 아님
- manifest `2.3.8.3210 / 2.3.8.321`.
- 당시 Side 톱니바퀴 원인을 target gate로 잘못 판단했다. target 비의존 handler는 v322에서 폐기했고 v317 원형으로 복구했다.
- target 연결 검사는 연결이 필요한 개별 기능에서만 유지한다.
- 전용 회귀: `test_ext_settings_open_without_target_v321.js`. 실제 Chrome 화면은 `[검증대기]`.
- 전체 IG Node 회귀 54/54 OK.


## v319 현재 기준
- manifest `2.3.8.3190 / 2.3.8.319`이 Side/Content/Background/MAIN 표시 버전 원본이다.
- `편집폴더에 복사`는 수동 `MANUAL_SINGLE` MP4 1건만 대상으로 한다. 자동 다운로드 다중 누적/자동종료 편집복사 코드는 사용하지 않으며 v319에서 Side dead code도 제거했다.
- picker 성공 경로는 `chrome.storage.session[IGBLUE/edit_folder_runtime_v318]`에 현재 Chrome 세션 동안만 유지한다. Side 재오픈 시 `편집폴더 열기` 버튼이 복원된다.
- WS8771이 복사 성공 후 `폴더를 열까요?`를 처리하며, 확인/취소와 무관하게 target_folder를 Background에 반환해 Side 버튼 활성화는 유지한다.

## v318 현재 기준
- manifest `2.3.8.3180 / 2.3.8.318`.
- 수동 MP4 편집복사 picker 성공 경로는 영구 저장하지 않고 `chrome.storage.session[IGBLUE/edit_folder_runtime_v318]`에 현재 Chrome 실행 세션 동안만 유지한다.
- Background는 새 수동 picker 직전에 session 경로를 지우고, picker 성공 응답의 `target_folder`를 session에 저장하며 `IGBLUE_EDIT_FOLDER_RUNTIME`으로 열린 Side에도 즉시 전달한다.
- Side는 열릴 때 session 경로를 복원해 `편집폴더 열기` 버튼을 활성화하고 클릭 시 WS8771 `ig_open_folder`로 해당 폴더를 연다. 브라우저 재시작 후 경로는 남지 않는다.
- 전용 회귀: `test_ext_edit_folder_open_runtime_v318.js`. 실제 버튼 활성/폴더열기는 검증대기.

## v317 현재 기준
- 다운로드 상태 강조 active 설정은 `chrome.storage.local[ndy_ig_visual_settings]` 단일 원본. Instagram localStorage 사용 금지.
- Side 미오픈/닫힘 상태에서도 Content 시작 로드 + storage change → MAIN 설정 전달.
- 수동 WS 다운로드 start/done과 오프라인 MAIN downloader start/done/error 모두 shortcode/asset_kind 상태를 MAIN에 전달하며 완료 버튼은 `다운` 표시.
- `편집폴더에 복사`는 수동 `MANUAL_SINGLE` MP4 1건 전용. Background가 체크값을 Chrome storage에서 읽고 WS 저장 완료 직후 방금 파일 하나만 picker 요청. 자동 다중복사 금지.
- 전용 회귀: `test_ext_manual_download_global_highlight_v317.js`. 실제 Chrome/Windows는 검증대기.


## v316 현재 기준
- manifest `2.3.8.3160 / 2.3.8.316`.
- PY/WS 미연결 수동 Video 클릭은 Background filename fallback이 아니라 MAIN 원래 injection downloader를 사용해 `shortcode.mp4`로 저장한다.
- 실제 WS 요청 실패가 뒤늦게 확인된 경우 Content `igblue_manual_original_download` bridge로 MAIN 원래 downloader를 호출한다.
- Side `편집폴더에 복사`는 자동종료 후 WS GUI picker를 요청하고, 선택 성공 시 runtime-only `편집폴더 열기` 버튼을 활성화한다. 편집폴더 경로는 storage에 저장하지 않는다.
- v312 Explorer scroll, v311 섞기/자동섞기, v314 다운로드 방식1/2 d-none은 유지한다.
- 전용 회귀: `test_ext_manual_offline_original_download_v316.js`, `test_ext_edit_copy_manual_filename_v315.js`. 실제 Chrome/Windows는 `[검증대기]`.

## v314 현재 기준
- manifest `2.3.8.3150 / 2.3.8.315`.
- 다운로드 방식 1/2 카드는 DOM/핸들러를 보존하고 `d-none` + `hidden`으로 강제 비표시한다.
- v313 썸네일 100px·섞기/자동섞기·JPG 일반저장 폐기·랜덤초·예약랜덤분 기준을 그대로 유지한다.
- 전용 회귀: `test_ext_side_hidden_modes_v314.js`.
- 실제 Chrome UI 확인 전 상태는 `[검증대기]`.

## v313 현재 기준
- manifest `2.3.8.3130 / 2.3.8.313`이 Side/Content/Background/Main 버전 단일 원본이다.
- Side 썸네일 기본 100px, v311 수동 `섞기`/`자동섞기` 유지.
- 일반 자동·일괄 JPG 파일 저장은 폐기하고 Cache8701 자동 섬네일 저장이 담당한다.
- 다운로드 지연은 기본초 + 매 파일 0~랜덤최대초(기본 최대 5초). 방식1/2 UI는 hidden으로 보존한다.
- 예약1/2 랜덤분은 Chrome storage에 체크만 보존하고 실제 0~59분 값은 로딩/정상 자동종료 때 새로 뽑아 표시하며 수동 수정 가능하다.
- v312 Explorer scroll 인젝션은 실제 Chrome OK로 완료. v313 실제 랜덤 지연/예약은 검증대기.
- 전용 회귀: `test_ext_side_random_delay_schedule_v313.js`.


## v312 현재 기준
- manifest `2.3.8.3120 / 2.3.8.312`이 Side/Content/Background/Main 표시 버전의 단일 원본이다.
- Explorer `clips`는 기존 `fill_items[].media`, `one_by_two_item.clips.items[].media`와 함께 2.4.1에서 추가된 `layout_content.medias[].media`, `medias[].clips.items[].media`를 모두 수집한다.
- 목적은 Explorer 첫 화면 이후 Swipe/scroll로 새로 들어오는 카드가 MAIN metadata map에 누락되어 overlay가 붙지 않던 회귀를 막는 것이다.
- upstream 2.4.1 전체 코드는 가져오지 않고 해당 응답 파서 차이만 최소 이식한다.
- 전용 회귀: `test_ext_explore_clips_scroll_v312.js`. 실제 Chrome 연속 Swipe 검증 전에는 `[검증대기]`다.
- 정적 검증: IG Node 47/47, 전체 JS syntax 59 OK.

## v311 현재 기준
- manifest `2.3.8.3110 / 2.3.8.311`이 Side/Content/Background/Main 표시 버전의 단일 원본이다.
- `수집계정 목록` 헤더에 `섞기`를 두며 접기 `□` 바로 앞에 표시한다. 수동 섞기는 현재 계정 목록을 무작위로 변경하고 저장 전 dirty 상태로 둔다.
- 섞기 이력은 `chrome.storage.local` `IGBLUE/account_queue_shuffle_v311`에 최대 50건 저장한다. 사이트 localStorage를 이력 원본으로 사용하지 않는다.
- `자동실행 사용` 다음에 `자동섞기` 체크를 두고 체크값은 `chrome.storage.local`에 보관한다.
- 자동섞기는 사용자가 `시작`을 누른 새 실행에서 현재 시작값이 정확히 `1/N`일 때만 시작 직전 1회 실행하고 index=1을 유지한다. 저장된 중단 위치를 재사용하지 않는다.
- `[IG_DBG]` 콘솔 반복 출력은 Side/Content/Background/Main에서 비활성화하며 debug snapshot 저장은 유지한다.
- 정적 검증: IG Node 46/46, 전체 JS syntax 57 OK. 실제 Chrome 수동 섞기·자동섞기·storage 이력 확인 전에는 `[검증대기]`다.


## v307 현재 기준
- manifest `2.3.8.3070 / 2.3.8.307`이 Side/Content/Background/Main 표시·복사 진단의 단일 버전 원본이다.
- `탭 제어 vNNN`은 `chrome.runtime.getManifest()`에서 읽은 전역 build tag를 사용하며 별도 버전 문자열을 하드코딩하지 않는다.
- Content의 `igbluePublishCdpProof()`는 Auto8700가 보낸 explicit `ok:true/false`를 그대로 유지한다. X를 O로 강제 변환하지 않는다.
- Auto8700의 최초 EXT refresh 검증 완료 전에는 CDP:X, 완료 뒤에만 CDP:O를 표시한다.
- v305의 `Showing A` Cache 자동전송/tab_id 격리/현재 채널만 분기와 화면 리스트 현재 번호 시작/input 복사를 유지한다.
- 사용자 자동 중단은 이전 진행정보를 보존하고 마지막 줄에 `⛔ 자동 중단`만 추가한다.
- 수집계정 계정 줄은 `Shift+더블클릭=새창`, `Ctrl+더블클릭=새탭`; 일반 더블클릭 편집은 유지한다.
- 정적 검증: IG Node 45/45 OK, 전체 JS syntax 57 OK.
- 실제 Chrome의 CDP X→O·EXT v307·중단/재시작·더블클릭은 `[검증대기]`다.

## v304 현재 기준
- 자동 섬네일 설정에 `8701에 로깅` 체크를 추가한다. 기본값 OFF다.
- 이 체크는 Cache Image 저장 ON/OFF와 독립이며 Cache8701 파일 로그 생성 여부만 제어한다.
- Background는 `cache8701_file_logging`을 8701 `/api/settings`에 전달한다.
- manifest·Side·Content·MAIN marker는 `2.3.8.3040 / 2.3.8.304 / v304`다.

## v303 현재 기준
- 기준본은 v297이며 Explorer 원본 섬네일 href·클릭과 기존 자동 Swipe를 보존한다.
- Side가 Auto8700 상태를 읽어 Background 중앙 상태에 갱신한다. Content/Main은 상태를 요청해 표시만 한다.
- 새 문서 초기값은 `확인중`이며 실제 통신 실패 전에는 X가 아니다.
- Side 수집 데이터는 Video 설정과 무관하게 Cache8701로 전달하며 Cache 상태를 대상/처리/신규/중복/실패로 표시한다.
- UI 삭제는 금지하고 `display:none`만 사용한다.
- manifest·Side·Content·MAIN marker는 `2.3.8.3030 / 2.3.8.303 / v303`이다.


## v297 패키지 버전 동기화
- manifest `2.3.8.2970`, 표시 `2.3.8.297`, Side·Content·MAIN marker `v297`.
- Side→Cache8701 메타데이터와 설정 전달 경로는 v294를 유지한다.
- 이번 기능 변경은 Auto8700↔Cache8701 CDP session이며 IG 수집·다운로드 로직은 변경하지 않았다.


## v293 톱니바퀴 자동 섬네일 설정 현재 기준
- Side 우측 톱니바퀴 `Settings`에 `자동 섬네일` 탭을 추가한다.
- 전체 사용 ON, Explorer·검색 OFF, 단일 게시물·계정 프로필·계정 릴스 ON을 기본값으로 사용한다.
- 전체 OFF 시 하위 페이지 체크를 비활성화한다.
- 저장값은 다시 설정창을 열었을 때 복원하며, Save 시 Auto8700 8707 전달용 storage 키를 함께 갱신한다.
- `Auto8700 DevTools` 본문에 있던 중복 섬네일 체크 UI는 제거하고 설정 위치 안내만 유지한다.
- manifest·Side·탭 제어·MAIN marker는 `2.3.8.2930 / 2.3.8.293 / v293`으로 동기화한다.

## v288 패키지 버전 동기화
- manifest `2.3.8.2880`, 표시 버전 `2.3.8.288`, Side package·MAIN marker `v288`.
- IG 자동·수동 다운로드, fresh tab, exact `Target.closeTarget` 동작은 검증된 v286 기준을 변경하지 않았다.
- 이번 기능 변경은 Analyze8780이며 IG 파일은 패키지 버전과 진단 marker만 동기화했다.
- IG JavaScript test 37개와 syntax 회귀는 OK다.


## 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` | 다운로드 시작 전 보존·실제 시작 초기화 회귀 검사 | 신규 |
## v305 절대 기준
- Cache 자동 저장은 별도 저장 요청이 아니라, 체크 ON 상태에서 현재 대상 탭에 보이는 필터 결과 `Showing A` 전부를 자동 처리한다.
- `tab_id`가 바뀌면 CDP 대상도 새 탭으로 전환한다. 다른 tab_id의 메타데이터·이미지 URL·run 결과를 섞지 않는다.
- 자동 중단은 자동 순회만 중단하며 수동 탭 전환·DOM 변화·Cache 저장은 계속한다.

- 사용자 자동 중단 UI는 중단 직전 통합 진행 텍스트를 보존하고 마지막 줄에 `⛔ 자동 중단`만 추가한다. 기존 진행 정보가 운영자 전달의 우선 정보다.

## v307 수집계정 목록 modifier 더블클릭 절대 기준
- 수집계정 textarea의 계정 줄에서 `Shift+더블클릭`하면 해당 Instagram 계정을 새 Chrome 창으로 연다.
- 같은 계정 줄에서 `Ctrl+더블클릭`하면 해당 Instagram 계정을 새 탭으로 연다.
- 수정키 없는 단일클릭/더블클릭은 textarea의 기존 선택·편집 동작을 그대로 유지한다.
- 더블클릭 대상은 현재 마우스로 선택한 줄의 username이며, 목록 index·자동실행 진행상태를 변경하지 않는다.

## v313 현재 기준 - Side 자동/예약/다운로드 UI
- manifest 기준 `2.3.8.3130 / 2.3.8.313`.
- 하단 썸네일 기본 가로폭은 100px이다. 기존 기본값 200px 저장 상태는 v313 1회 migration으로 100px로 전환하며 명시적 다른 사용자값은 유지한다.
- `수집계정 목록`의 `섞기` 버튼과 `자동실행 사용` 다음 `자동섞기` 체크는 필수 유지 기능이다. 순서/이력은 `chrome.storage.local`에 둔다.
- 일반 `Image 저장` 옵션은 제거한다. 자동 JPG 파일 저장은 Cache8701 자동 섬네일 저장이 담당하고, 일반 자동/일괄 다운로드는 JPG를 저장하지 않는다. 직접 썸네일 JPG 클릭 다운로드는 별도 수동 기능으로 유지한다.
- 다운로드 지연은 `기본 초 + 0~랜덤최대초`이며 각 파일 사이마다 랜덤값을 새로 뽑는다. 기본 랜덤최대는 5초다.
- 다운로드 방식 1/2 UI는 삭제하지 않고 숨김 상태로 보존한다. 방식 3 자동은 유지한다.
- 자동예약1/2에는 슬롯별 `랜덤 +[00]분` 체크/입력값이 있다. 체크 상태는 `chrome.storage.local`에 저장하고 실제 분 값은 Side 로딩 때 0~59분으로 새로 뽑는다. 사용자가 직접 수정할 수 있으며 정상 자동종료 후 다음 실행용 값으로 다시 뽑는다.
- v313 전용 회귀: `test_ext_side_random_delay_schedule_v313.js`. 실제 Chrome 다운로드/예약 실동작은 `[검증대기]`.