<!-- FILE: _St/IG_StYellow/ai_read_패치.md | ROLE: IG 현재 작업·검증대기 -->


## v323 JPG 자동다운로드 분리 · 수동 원래 다운로드
- [코드반영] 자동 Top 후보/loop/진행률/목표/ETA/현재·전체 집계는 MP4만 취급.
- [코드반영] 자동 UI의 `JPG N개` 표시 제거. JPG 자동 저장은 Cache8701 전담.
- [코드반영] Side/Main 수동 JPG는 WS8771 direct를 건너뛰고 MAIN 원래 `fetch → Blob → objectURL → a.download` 경로로 처리하며 Side 상세 완료 상태는 만들지 않음.
- [코드반영] 수동/자동 MP4와 편집폴더 경로는 유지.
- [코드반영] `test_ext_jpg_manual_original_v323.js`, IG Node 전체 56/56 OK.
- [완료] 사용자 실제 Chrome에서 Side/Main 수동 JPG 원래 브라우저 다운로드 정상 확인.
- [검증대기] 실제 자동 Top 화면에서 JPG 집계 없이 MP4-only 확인.

## v322 설정 모달 실제 원인 복원
- [코드반영] v319에서 accidental deletion된 v317 설정 전역 선언 블록 복원.
- [코드반영] v321 target 비의존 handler 변경은 원상복구.
- [코드반영] `test_ext_settings_modal_restore_v322.js`에서 `T()` 실행 후 `settingsModal` DOM 생성 OK.
- [완료] 사용자 실제 Chrome v322에서 톱니바퀴 클릭 Settings 표시 정상 확인.


## v321 설정 톱니바퀴 target 비의존 복원
- [코드반영] settings click의 `teHasInstagramTarget || u` 차단 제거.
- [코드반영] 기존 설정 모달 `T()`와 나머지 Side 기능은 그대로 유지.
- [코드반영] `test_ext_settings_open_without_target_v321.js` 추가.
- [코드반영] IG Node 전체 54/54 OK.
- [검증대기] 실제 Chrome 톱니바퀴 클릭 설정창 표시.


## v319 편집폴더 확인창 + Side 버튼 유지
- [코드반영] v318 `편집폴더 열기` runtime/session 버튼 유지.
- [코드반영] Side 미사용 자동 다중 편집복사 `teEditCopyRunFiles`, `teEditCopyPromptAfterAutomaticEnd` 제거.
- [코드반영] 편집복사는 수동 MP4 1건 완료 이벤트에서만 Background→WS8771로 요청한다.
- [검증대기] 확인창 취소 후 Side 재오픈 → `편집폴더 열기` 활성 → 같은 폴더 열기 실제 확인.

## v318 편집폴더 열기 활성화
- [코드반영] 수동 MP4 1건 picker 성공의 `target_folder`를 Background가 `chrome.storage.session`에 runtime-only 저장.
- [코드반영] Side 열림 상태는 runtime 메시지로 즉시, Side 재오픈 상태는 session restore로 `편집폴더 열기` 활성화.
- [코드반영] 새 수동 picker 시작 전 이전 runtime 경로 제거. localStorage/영구 local 저장 금지.
- [코드반영] 최종 정적/단위: pytest 132 passed, IG Node 53/53, RTC Node 3/3, Analyze UI 1/1, JS syntax 65, Python compile 39, JSON 6 OK.
- [검증대기] 실제 Windows에서 picker 선택 후 버튼 활성 → 클릭 시 같은 폴더 열기.

## v317 Side 닫힘 수동 강조 + 수동 1건 편집복사
- [코드반영] active 다운로드 강조 설정은 Chrome storage `ndy_ig_visual_settings`만 사용. Instagram localStorage active setting read/write 제거.
- [코드반영] WS 수동 start/done과 offline MAIN start/done/error 모두 shortcode/asset_kind를 MAIN 상태로 전달. 완료 버튼 `다운` 유지.
- [코드반영] 편집폴더 체크는 Background가 Chrome storage에서 읽고 `MANUAL_SINGLE` MP4 저장 완료 직후 방금 파일 1개만 WS picker 요청. 자동 다중복사 폐기.
- [코드반영] 정적/단위: pytest 130 passed, IG Node 52/52, RTC Node 3/3, Analyze UI 1/1, JS syntax 64, Python compile 38, JSON 6 OK.
- [검증대기] Side 닫힘 수동 강조/다운 유지 및 Windows 수동 1건 picker/복사.

## v316 수동 원래 downloader + 편집폴더 runtime 열기
- [코드반영] WS 미연결 수동 Video는 MAIN 원래 downloader `shortcode.mp4`; Background Chrome 파일명 가공 fallback 폐기.
- [코드반영] 실제 WS 요청 실패도 Content→MAIN fallback signal로 동일 처리.
- [코드반영] 편집폴더 복사 성공 후 Side `편집폴더 열기` runtime 버튼 활성화. 경로 영구 저장 없음.
- [코드반영] 최종 회귀: pytest 130 passed, IG Node 51/51, RTC Node 3/3, Analyze UI 1/1, JS syntax 63, Python compile 38, JSON 6 OK.
- [검증대기] 실제 Chrome/Windows 확인.


## v315 편집폴더 복사·수동 MP4 확장자 보정
- 상태: `[코드반영]` / 실제 Chrome·Windows 동작 `[검증대기]`.
- Side `편집폴더에 복사` 체크를 추가하고 `chrome.storage.local`에 저장한다.
- 자동 실행에서 실제 새로 저장한 MP4만 모아 전체 자동 종료 후 WS8771에 폴더 선택/복사를 1회 요청한다.
- PY/WS가 없는 Chrome fallback 수동 다운로드는 CDN 원본 파일명을 유지하되 길이 제한 시 확장자를 끝에 보존하고, `asset_kind=video`는 `.mp4`를 강제한다.
- 기존 `_StDown` 원본 저장 위치와 파일명 정책은 변경하지 않는다.

## v307 버전 동기화
- 상태: `[코드반영]`
- Auto8700 v307 작업과 패키지 버전을 맞추기 위해 manifest/Side 표시 버전만 갱신했다.
- IG 기능 로직은 변경하지 않았고 기존 test_ext 43개를 v307 기준으로 동기화해 모두 OK다.

## v304 코드반영·검증대기
- 자동 섬네일 설정 카드에 `8701에 로깅` 체크 추가.
- 저장·복원 키 `cache8701_file_logging` 추가, 기본 OFF.
- Background의 Cache8701 설정 전달 키에 포함.
- 실제 Chrome 설정 저장·재열기와 Cache8701 로그 파일 생성은 검증대기.

## v303 코드반영·검증대기
- CDP 상태 Side/Background 원본, Main 표시 전용.
- Cache Image Side→8701 run_id·상태 조회.
- 대상 0개 Swipe·날짜 경계 기존 분기 보호 주석.
- Explorer 기본 링크 클릭 보호 테스트.
- 실제 Chrome 네 항목은 검증대기.


## v297 패키지 동기화
- 상태: `[코드반영]`
- manifest·Side·Content·MAIN marker와 IG test 기대 버전을 v297로 맞췄다.
- Side→8701 메타 전송 로직은 변경하지 않았다.


## v288 패키지 버전 동기화
- 상태: `[코드반영]`
- manifest·Side·MAIN/Content 진단 marker와 IG test 기대 버전을 v288로 맞췄다.
- Auto8700·WS8771·IG 다운로드 기능 로직은 변경하지 않았다.


## v287 패키지 버전 동기화
- 상태: `[코드반영]`
- manifest·Side·MAIN/Content 진단 marker와 IG test 기대 버전을 v287로 맞췄다.
- IG 기능 로직은 변경하지 않았다.


## v286 자동 전용 새 탭·exact target 종료
- 상태: `[검증대기]`
- 단일 목표: 자동 WS direct와 수동 다운로드를 분리 유지하면서 자동 시작/계정 전환의 페이지 상태를 계정별 새 탭으로 격리하고 오류 탭을 CDP로 종료한다.
- `teAutoPyFreshStartPreview`: `0/N`을 1번 계정으로 강제하고 기존 페이지 snapshot을 시작 대상으로 사용하지 않는다.
- `teAutoPyStartOnceFromUi`: 새 실행·재개는 새 관리 탭을 먼저 만든다.
- `teAutoPyPrepareAccountQueueForStart`: fresh 탭의 실제 계정을 검증하고 삭제 계정만 명시적으로 건너뛴다.
- Background: replacement tab metadata에 `auto_created/cdp_target_id` 저장, exact CDP close와 Chrome tab 제거 확인 우선, `chrome.tabs.remove` fallback.
- 사용자 탭은 `not_managed_auto_tab`으로 보존하며 CLOSED 이벤트를 만들지 않는다.
- 중지·오류·자동종료는 마지막 관리 탭 종료를 요청한다.
- 테스트: `test_ext_auto_fresh_tab_cdp_close_v286.js`와 전체 IG 회귀 38/38 OK.
- 실제 확인: 2개 이상 계정·첫 목록 밖 다운로드 없음·오류 탭 제거·마지막 탭 제거·수동 다운로드 현재 탭 유지.

## v282 MAIN/SIDE UI 현재 작업
- 상태: `[검증대기]`
- 단일 목표: 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 CDP 수명주기 이전 작업
- 상태: `[검증대기]`
- 단일 목표: 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 표시는 이번 작업에 포함하지 않는다.

## v280 미완료 이전 작업
- 상태: `[검증대기]`
- 목표: 최근 탭 20개·generation·run_seq·READY/OWNER 상태로 OWNER를 관리하고 새 OWNER commit 뒤 이전 탭을 닫는다.
- Background: `IGBLUE_GET_TAB_CONTROL_STATE`, `IGBLUE_CLAIM_TAB_OWNER`, `IGBLUE_COMMIT_TAB_HANDOFF` 추가.
- Side: 새 tab_id 선반영 후 commit, 기존 탭 시작 시 OWNER claim.
- Main: `igblue_main_diag_toggle/panel`을 탭 제어 진단으로 교체, DOM 진단복사에 tab_control 포함.
- 신규 테스트: `test_ext_tab_control_v280.js`.
- 정적 결과: JavaScript syntax 46 OK, IG test 35 OK, Python compile 33 OK, pytest 71 passed.
- 실제 Chrome 완료 기준: CDP:X→O와 CDP:O에서 3계정 연속 실행·OWNER 인계·이전 탭 종료·파일 저장·자동종료.


## v279d 완료 참고
- 상태: `[완료]`
- 단일 목표: 첫 계정과 다음 계정을 새 Instagram 탭으로 준비한 뒤 이전 자동 탭을 닫는다.
- 새 탭은 `active:false` 생성 → ready probe → 활성화 순서다.
- 이전 탭은 새 탭 활성화 뒤에만 종료하며, 종료 guard timeout은 900ms다.
- 새 탭 실패 시 이전 탭 보존·재활성화와 새 탭 제거를 수행한다.
- document_start unload monkey patch 제거로 자동종료 뒤 현재 탭에 지속 후킹을 남기지 않는다.
- 테스트: `test_ext_tab_replacement_v279d.js`, `test_ext_navigation_unload_guard_v279cc.js`, 전체 회귀.
- 정적 결과: 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 이동 전 guard 호출/결과/차단/URL update/ready 콘솔 로그 추가.
- guard 실패는 이동 중단이 아니라 진단 후 계속.
- `#IGBLUE_NoTop` 대신 MAIN 스크립트 완료 marker를 준비 기준으로 사용.
- No 미확인 시 `No---` 숨김.
- 자동 진행률은 전체 실행 기준, 발견 자산은 `파일 완료/예정` 표시.
- ETA는 최근 성공 세트 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 결과: `UNKNOWN`.

## v279cc 현재 작업
- 상태: `[검증대기]`
- 단일 목표: 다음 계정 URL 이동 직전 `unload` 전용 guard 설치와 새 문서 Content/Main 준비 확인.
- 변경 파일: `background.js`, `content_instagram.js`, `side.js`, `manifest.json`.
- guard 설치 실패는 `unload_guard_install_failed`로 URL 변경 전에 중단한다.
- `igblue_navigation_ready_probe`는 목표 pathname 일치, Content 응답, Main `#IGBLUE_NoTop` 생성 여부를 반환한다.
- Background는 탭 complete 이후 probe를 반복하며 30초 초과 시 `navigation_ready_timeout`과 마지막 상태를 반환한다.
- Side는 고정 4.5초 sleep 없이 `navigation_ready` 결과 뒤 계정 상태를 검사하고 자동 계속을 예약한다.
- 신규 테스트: `test_ext_navigation_unload_guard_v279cc.js`.
- 정적 결과: JavaScript syntax 39 OK, IG test 32 OK, Python compile 33 OK, pytest 71 OK.
- 실제 Chrome 결과: `UNKNOWN`.
- 완료 기준: 2/2 이후 경고가 사라지거나 guard 차단 로그가 남고, 다음 계정 2/3에서 Main 응답 대기 고착 없이 자동 다운로드가 계속됨.

## v279c 완료 기준
- 상태: `[완료]`
- 단일 목표: v262에서 실제 성공한 Side snapshot → WS8771 MP4/JPG 자동 다운로드 경로 복원.
- `metadata-only` 자동 완료 제거.
- 실제 파일 또는 실제 중복 확인이 없으면 게시물 완료 수 증가 금지.
- 신규 테스트: `test_ext_auto_v262_exact_restore_v279c.js`.
- 정적 결과: JS syntax 38 OK, IG 회귀 30 OK, 폐기 진단 1 SKIP, Python compile 33 OK, pytest 70 OK.
- 실제 Chrome 결과: 사용자 연속 자동 실행에서 MP4/JPG 실제 저장·WS8771 direct 완료 `OK`.
- 확인 항목: CDP:O Top목표 3, MP4/JPG 실제 저장, 화면 집계, 마지막 상태 보존.

## v279bb 현재 작업
- 체크 ID: `MAIN-SCOPE-AUTO-RESTORE-01`
- 상태: `[코드반영]`
- 목표: MAIN hover 비활성 패치의 외부 IIFE 스코프 오류를 제거하고, 실제로 동작했던 자동 Top 다운로드 실행 흐름이 끝까지 등록되게 한다.
- 원인: 첫 MAIN IIFE 내부 `const IGBLUE_MAIN_HOVER_DIAGNOSTIC_ENABLED=false`를 첫 IIFE 종료 뒤의 별도 IIFE가 직접 참조해 `ReferenceError`가 발생했다.
- 수정: 별도 IIFE는 `window.__IGBLUE_MAIN_HOVER_DIAGNOSTIC_ENABLED__ === true`를 안전하게 읽고 false/미정의 시 정리 후 종료한다.
- 유지: v279b 다운로드 상태 보존, Side 계정 클릭 선택, hover 비활성, MAIN 수동 JPG/MP4, WS8771 직접 저장, snapshot 자동 다운로드.
- 자동 다운로드 핵심 3함수는 v279aaaa와 해시 비교 결과 동일하다.
- 정적 결과: JavaScript syntax 37개 OK, IG 테스트 29개 OK, 폐기 진단 1개 SKIP, Python compile 33개 OK, pytest 71개 OK.
- 실제 Chrome 결과: `UNKNOWN`.
- 완료 기준: 새 Instagram 탭에서 콘솔 ReferenceError 없음, 자동 Top에서 AD-03→AD-06→AD-07, 실제 파일 저장, 자동종료 후 마지막 완료 표시 보존.
- 후속 보류: 전체 `IGBLUE_` → `YELLOW` 명칭 전환은 안정화 완료 뒤 별도 버전에서 수행한다.

## v279b 현재 작업
- 체크 ID: `DOWNLOAD-STATUS-HOLD-01`
- 상태: `[코드반영]`
- 목표: 실제 다운로드 시작 전에는 상태 영역을 변경하지 않고, 실제 시작 이벤트에서만 초기화하며, 종료 후 마지막 실제 파일 상세를 보존한다.
- 변경 파일: `side.js`, `side.html`, `manifest.json`, `test_ext_download_status_preserve_v279b.js`.
- 계정 이동·자동 시작·다음 계정 계속은 `teProgressPreserveUntilNextDownload()`만 호출하고 파일 상태를 비우지 않는다.
- `teProgressBeginActualDownload()`는 `ndy_down_progress status=start`에서만 실행한다.
- `done/already_done/error` 결과를 그린 뒤 다음 시작까지 화면 갱신을 잠근다.
- Auto UI만으로 progress box를 생성하지 않으며 초기 자동현황 텍스트도 비워 둔다.
- 정적 결과: 전체 IG 테스트 28개 OK, 폐기 진단 테스트 1개 SKIP, JavaScript syntax OK.
- 실제 Chrome 결과: `UNKNOWN`.
- 완료 기준: 이전 완료 표시 → 새 자동 시작/계정 이동 동안 그대로 → 실제 다음 파일 시작 시 초기화 → 자동종료 후 마지막 파일 경로·shortcode·asset 유지.
## v279aaaa 현재 작업
- 체크 ID: `SIDE-ACCOUNT-CLICK-01`
- 상태: `[코드반영]`
- 목표: Main hover·자동 확인 없이 Side 카드 `IG 계정명` 클릭으로만 수집계정 추가 대상을 선택한다.
- 제거: 400ms 계정 확인 타이머, profile URL 자동 판정, Main current-account 요청, single payload owner fallback, URL 변경 자동 초기화.
- 유지: Side 카드 계정명 표시, 클릭 선택 강조, 계정추가, 중복 차단, 정렬, SQLite 저장.
- 정적 결과: `test_ext_side_account_click_v279aaaa.js` 및 전체 IG 회귀 검사 OK.
- 실제 Chrome 결과: `UNKNOWN`
- 다음 작업: 서로 다른 Side 계정 카드 2개를 연속 클릭하고 버튼명·선택 테두리·추가·저장 결과를 확인한다.

## v279aaa 완료 참고
- 체크 ID: `MAIN-HOVER-01`
- 상태: `[완료]`
- 목표: MAIN hover 계통 비활성 상태에서 JPG/MP4 수동 다운로드와 페이지 이동을 검증한다.
- 비활성 대상: 계정 hover 200ms 타이머, pointer hover 이벤트, hover 색상/좌표 mousemove, hover localStorage/event dispatch.
- 유지 대상: MAIN 카드·다운로드 버튼·click 이벤트·Side·자동 Top·WS8771.
- 실제 Chrome 결과: Auto8700 ON/OFF Main JPG·MP4 저장 `OK`, unload·응답 없음 미발생.
- 다음 작업: hover 비활성 회귀 유지.

## v279aa 코드반영
- [코드반영] Main 수동 다운로드 Background Chrome API fallback 복구
- [코드반영] Filtered 수동 일괄 다운로드 fallback 성공 처리
- [코드반영] legacy `ndy_ig_down`·Blob·objectURL·anchor downloader 제거
- [코드반영] Auto8700/WS8771 기본 → CDP 예약 옵션 순서 교정
- [검증대기] Auto8700 미실행 수동 JPG/MP4와 Filtered 다운로드
- [검증대기] unload 오류 및 페이지 이동 먹통 재발 여부

# IG_StYellow 패치 — v279a 실패 기록

상태: `[보류·실제 Chrome FAIL]`

## 단일 목표

- v279 비다운로드 기능 유지
- 다운로드 실제 전송 core만 v262 방식으로 복원
- v276 `pagehide`·10초 runtime 진단 제거

## 코드 반영

- `content_instagram.js`: v262 `sendMainBackgroundDownload()` 복원
- `background.js`: v262 `igblueDownloadWithApi()` 복원
- `instagram_inject.js`: v276 Runtime/Long Task/V scan/pagehide 표본 제거
- Side의 Video/Image 선택, Top, snapshot, 계정·SPA 기능은 유지

## 정적 검사

- IG JavaScript 문법: OK
- IG test_*: 24/24 OK
- WS8771 연동 테스트: OK
- 실제 Chrome/Windows: UNKNOWN

## 검증대기

1. Main JPG·MP4 개별 다운로드
2. Side 개별·Top·Filtered 다운로드
3. 다운로드 중지·재시작
4. 다운로드 중 unload 메시지·먹통 재발 여부
5. 홈·Explore·Reels·프로필 페이지 이동 먹통 여부

## 다음 분기

- v279a는 수동 다운로드 실패·legacy downloader 잔존으로 보류한다.
- 다른 접근은 `v279b`
- 전체 실검증 완료 뒤 `v280`
## v292 자동 섬네일 설정
- 전체 사용 기본 ON, Explorer OFF, 단일 게시물/계정 프로필/계정 릴스 ON.
- 실제 Windows 저장 동작은 검증대기.

## v293 톱니바퀴 설정 UI
- 상태: `[코드반영·실제 Chrome 검증대기]`
- `teCreateAutoThumbnailSettings()`를 Settings 탭에 연결했다.
- 저장값 로드, 기본값 버튼, 전체 OFF 하위 비활성, Save 시 8707 storage 동기화를 반영했다.
- 본문 Auto8700 DevTools의 중복 자동 섬네일 체크 UI는 제거했다.
- 실제 Side 톱니바퀴 표시·재열기 복원은 검증대기다.

## v305 코드반영·검증대기
- [코드반영] `Showing A` 필터 결과 목록을 Cache8701에 자동 전송.
- [코드반영] OBSERVED/CACHE_RUNS/CI-00~CI-06를 `tab_id` 기준으로 분리·기록.
- [코드반영] CDP 세션 프로필 계정과 메타데이터 계정 불일치 시 매칭 금지.
- [코드반영] 자동 시작은 화면 리스트 번호만 사용, input 전체 복사 보정.
- [검증대기] moyasi_jm `Showing 10 of 12`에서 대상 10, 처리 10, 신규+중복=10, 실패 0.

## v307 자동 중단 표시 보존
- [코드반영] `teAutoPyAppendUserStopToUnifiedStatus()`로 중단 직전 표시를 보존하고 `⛔ 자동 중단` 한 줄만 append.
- [검증대기] 실제 Side 사용자 중단 후 이전 현재주소/전체목록/집계 표시가 유지되는지 확인.


## v307 화면 리스트 시작번호 절대 기준
- [코드반영] 사용자 중단 스냅샷은 이전 진행 표시 보존용으로만 사용한다.
- [코드반영] `시작` 클릭 시 화면 `수집계정 목록` 입력값을 다시 읽고 그 번호에서 새 실행한다.
- [코드반영] 저장된 `account_queue_index`, last_rank, 이전 실행 resume 상태가 화면 리스트 번호를 덮어쓰지 않는다.
- 예: 2/3에서 중단 후 사용자가 1/3으로 수정하고 `시작` → 반드시 1/3부터 실행.
- [검증대기] 실제 Chrome에서 2/3 중단 → 1/3 수정 → 시작 후 AS-03=1/3 확인.

## v307 수집계정 Shift/Ctrl 더블클릭 열기
- [코드반영] `igblue_account_url_list`에 modifier `dblclick` 처리를 추가했다.
- [코드반영] `Shift+더블클릭` → `chrome.windows.create()` 새창, `Ctrl+더블클릭` → `chrome.tabs.create()` 새탭.
- [코드반영] 일반 더블클릭은 prevent하지 않아 기존 텍스트 편집/선택을 유지한다.
- 정적 회귀: `test_ext_account_queue_modifier_doubleclick_v307.js` OK.
- [검증대기] 실제 Chrome에서 서로 다른 계정 줄을 Shift/Ctrl 더블클릭해 정확한 계정이 새창/새탭으로 열리는지 확인.


## v307 CDP 최종 상태 게이트
- [코드반영] Content가 Auto8700 CDP gate의 explicit `ok:false`를 그대로 Background/Main에 전달한다.
- [코드반영] manifest-derived `IGBLUE_EXT_VERSION_NAME/BUILD_TAG`를 복사 진단과 탭 제어 표시의 단일 버전 기준으로 사용한다.
- [코드반영] `test_ext_cdp_final_gate_v307.js`로 강제 `ok:true` 회귀를 차단한다.
- [검증대기] 실제 Auto8700 CR-03 완료 전 X, 완료 후 O 및 `탭 제어 v307` 확인.

- 정적 검증: IG Node 45/45 OK, 전체 JS syntax 57 OK.


## v311 수집계정 섞기
- [코드반영] 헤더 `섞기` 버튼, `자동실행 사용` 다음 `자동섞기` 체크 추가.
- [코드반영] 수동/자동 섞기 이력과 자동섞기 설정을 확장 공통 `chrome.storage.local`에 저장.
- [코드반영] 자동섞기는 정확한 `1/N` 새 시작에서만 시작 직전 1회 실행.
- [코드반영] Side/Content/Background/Main `[IG_DBG]` 콘솔 반복 출력 억제, snapshot 저장 유지.
- [검증대기] 실제 Chrome에서 3개 이상 목록을 연속 섞었을 때 순서 변경·이력 누적·1/N 자동섞기·2/N 미동작 확인.


## v312 Explorer clips medias 파서
- [코드반영] `layout_content.medias[].media` 수집 추가.
- [코드반영] `layout_content.medias[].clips.items[].media` 수집 추가.
- [유지] 기존 `fill_items[].media`, `one_by_two_item.clips.items[].media` 수집 유지.
- [코드반영] 빈/부분 배열은 optional 처리하여 스크롤 응답 구조 변형에서 예외를 숨은 성공으로 처리하지 않고 파서 자체는 계속 진행한다.
- 정적 회귀: `test_ext_explore_clips_scroll_v312.js`.
- [검증대기] 실제 Explorer Swipe/scroll 뒤 새 섬네일의 MAIN metadata/overlay 연속 적용.

## v313 Side 자동/예약 다운로드 패치
- [코드반영] 썸네일 기본 100px + 구 기본 200px 1회 migration.
- [코드반영] v311 `섞기`/`자동섞기` UI·storage 기능 유지 회귀 보호.
- [코드반영] 일반 Image 저장 UI/정책 제거, Cache8701 자동 JPG 저장으로 역할 단일화.
- [코드반영] 다운로드 기본 지연 + 매 파일 랜덤 0~N초 추가.
- [코드반영] 다운로드 방식1/2 DOM/코드는 유지하고 UI만 hidden.
- [코드반영] 예약1/2 랜덤분 체크 + 로딩 시 0~59분 추첨 + 수동 수정 + 정상 자동종료 후 재추첨.
- [검증대기] 실제 Chrome에서 랜덤 초 대기값, 예약 실제 실행시각, 자동종료 후 재추첨 확인.

## v314 다운로드 방식 1/2 d-none 강제 숨김
- [코드반영] 방식 1 `Down all medias`, 방식 2 `Down filtered medias` 카드에 `d-none`을 추가했다.
- [유지] DOM/버튼/핸들러는 삭제하지 않고 향후 복구 가능하게 보존한다.
- [유지] v313 썸네일 100px, 수동 `섞기`, `자동섞기`, 일반 JPG 저장 폐기, 랜덤 다운로드 초, 예약 랜덤분 기능을 그대로 유지한다.
- 정적 회귀: `test_ext_side_hidden_modes_v314.js`.
- [검증대기] 실제 Side에서 방식1/2이 어떤 상태 갱신 후에도 다시 나타나지 않는지 확인.