<!-- FILE: _St/ai_read_삭제.md | ROLE: sort 삭제·폐기·회귀 금지 -->

## v321 폐기·복원 금지
- Side `settings` 톱니바퀴 클릭 자체를 `teHasInstagramTarget || u`로 차단하는 로직을 폐기한다.
- 설정창은 Instagram target 상태와 무관하게 열려야 하며, 연결 필요 여부는 개별 기능 실행 시 검사한다.



## v324 정시 업데이트 회귀 금지
- 매 정시 체크를 위해 1분/수초 polling으로 서버 `_St_ver.html`을 반복 조회하지 않는다. 정확한 다음 `HH:00:00`까지 event wait한다.
- 정시 checker가 publisher marker 우회를 통해 배포자 PC에 서버 ZIP을 자동 적용하게 만들지 않는다.
- 파일감시 self-reexec에서 `--skip-update-check`를 제거해 시작 체크를 중복 실행하지 않는다. 다만 인계된 정상 manager의 다음 정시 checker는 유지한다.
- 정시 UPDATE 발견 시 updater를 예약하고도 Auto8700를 계속 실행하지 않는다. 정상 종료 event로 관리 서비스를 정리한 뒤 기존 updater 적용 흐름을 사용한다.

## v320 자동업데이트 회귀 금지
- 표시용 `version` 문자열을 업데이트 대소 비교에 사용하지 않는다. 정수 `build`만 비교한다.
- `server_build <= local_build`에서 서버 ZIP을 적용하지 않는다.
- `_St/AutoDistribute/AutoDistribute.py`가 있는 배포자 PC에 서버 ZIP을 자동 적용하지 않는다.
- SHA256 불일치/ZIP 경로 검증 실패를 무시하고 압축해제하지 않는다.
- 서버 `_St_ver.html`을 `_St.zip`보다 먼저 공개하지 않는다.

## v317 회귀 금지/폐기
- `편집폴더에 복사`를 자동 다운로드 여러 개 누적 → 전체 자동종료 후 일괄복사로 연결하는 v315/v316 방식은 폐기한다. 편집 대상은 사용자가 수동 클릭한 MP4 1건뿐이다.
- 다운로드 상태 강조 active 설정을 Instagram `localStorage`의 `IGblue/visual/active_download_settings`에서 읽거나 쓰는 방식은 폐기한다. 원본은 extension `chrome.storage.local[ndy_ig_visual_settings]`이다.
- 수동 다운로드 시작 progress에서 shortcode/asset_kind를 누락하여 MAIN이 어떤 카드인지 식별하지 못하는 payload를 다시 사용하지 않는다.


## v316 회귀 금지 / v315 폐기 로직
- v315의 PY/WS 미연결 수동 `chrome.downloads` fallback에서 CDN 원본 토큰명을 가공해 저장하는 방식은 폐기한다. 수동 미연결은 원래 injection `shortcode.mp4` downloader를 사용한다.
- v315의 `ig_copy_to_edit_folder`를 WS socket worker/thread-direct에서 직접 실행하며 FolderBrowserDialog를 띄우는 방식은 실제 Windows에서 picker 미표시로 폐기한다. picker는 반드시 WS8771 Tk GUI main thread에서 실행한다.
- 편집폴더 경로 영구 저장은 사용하지 않는다. 체크 상태만 저장하고 폴더는 자동실행 종료마다 다시 선택한다.

## v315 회귀 금지
- 수동 Chrome fallback에서 Instagram 원본 파일명을 `igblueSafePath()`에 넣어 90자로 다시 자르는 방식은 폐기한다. 긴 video 파일의 `.mp4`가 잘릴 수 있다.
- video 여부를 CDN URL 문자열에만 의존해 jpg fallback하는 방식은 폐기한다. `asset_kind=video`면 `.mp4`를 우선한다.
- 편집폴더 복사 시 기존 동일 파일을 덮어쓰지 않는다. 사용자가 이미 편집한 파일 보호가 우선이다.
- 편집폴더 기능 때문에 `_StDown/instagram/{계정}` 원본 저장 위치를 바꾸지 않는다. 편집폴더는 다운로드 완료 후 별도 복사본이다.


## v307 회귀 금지
- 8700 `/json/version` 응답만으로 `CDP:O`를 만드는 로직을 다시 사용하지 않는다.
- Instagram target/WebSocket 존재만으로 `CDP:O`를 만드는 로직을 다시 사용하지 않는다.
- Content가 CDP gate의 `ok:false`를 임의로 `ok:true`로 바꾸는 로직을 금지한다.
- 저장된 과거 `cdp_ready=true`를 현재 통신 검증 없이 O로 표시하지 않는다.
- 페이지 열기·탭 전환·polling마다 EXT `chrome.runtime.reload()`을 반복하지 않는다. Auto8700 프로세스 최초 CDP 준비 시 1회만 허용한다.
- 화면/복사 `탭 제어 vNNN` 버전을 manifest와 별도 하드코딩하지 않는다.
- 파일 변경 watcher 본체에서 `time.sleep(debounce_sec)`로 3초 동안 전체 감시를 멈추는 방식을 다시 사용하지 않는다.
- 같은 서비스의 파일 변경 이벤트마다 새 재실행 스레드를 무제한 생성하지 않는다.
- 첫 변경 시각 기준 3초 후 실행하지 않는다. 반드시 `마지막 변경 시각 + 3초` 안정화 기준을 사용한다.
- 파일 변경 자동재실행 때문에 다른 서비스의 변경 감지가 막히는 구조를 복원하지 않는다.

## v304 회귀 금지
- `owner_active=false`를 이유로 Cache8701 CDP 감시 세션을 중단하는 로직을 다시 사용하지 않는다.
- Cache8701 로그를 초 단위 health 반복 출력이나 무제한 누적 파일로 만들지 않는다.
- 로그 파일 수 20개 제한을 로그 행 20개 제한으로 오해하지 않는다.

## v303 폐기·금지 기준
- Main 문서 startup에서 CDP:X를 상태 원본으로 만드는 로직은 폐기한다.
- 새로고침·URL 이동 자체를 CDP 연결 끊김으로 판정하지 않는다.
- UI 정리 시 DOM·href·클릭 이벤트를 삭제하지 않는다. 숨김은 `display:none`만 사용한다.
- 조건 대상 0개를 즉시 종료·자동 대기·Main shortcode 카드 연결 대기로 바꾸는 분기를 금지한다.
- Video OFF를 Cache Image·통계·Swipe·계정 이동 중단 조건으로 사용하지 않는다.


## v297 폐기·복원 금지
- `/api/posts/{post_id}/media/{asset_id}` 숫자형 미디어 주소와 해당 repository 조회 함수를 복원하지 않는다.
- `/api/posts/{post_id}/open-folder`처럼 DB post id로 저장 폴더를 찾는 UI를 복원하지 않는다.
- 8780 게시물 응답에 `media_assets`의 `id`, `post_id`, `storage_root_id`를 미디어 표시 식별자로 노출하지 않는다.
- `_thumbnail.*`, `_auto_seen.*`, 임의 다운로드 원본명을 8780 표준 섬네일로 다시 검색하지 않는다.
- 사용자의 로컬 관리 화면에서 검증된 `D:\_StDown` 실제 경로 표시·복사 기능을 다시 숨기지 않는다.
- `_StDown` 밖 경로, `..`, 허용되지 않은 플랫폼 접근은 허용하지 않는다.

## v296 폐기·복원 금지
- Cache8701 신규 이미지 파일명에 `_thumbnail`을 다시 강제하지 않는다.
- WebP·AVIF·PNG를 무조건 JPG로 변환하거나 실제 바이트와 다른 확장자로 저장하지 않는다.
- 동일 파일이라는 이유로 DB 등록까지 생략하지 않는다.
- 8780이 media_assets 행만 믿고 실제 없는 파일 URL을 우선 표시하지 않는다.
- 로컬 이미지 등록 과정에서 기존 `post_stat_10m` 10분 통계·중복 로직을 별도 방식으로 덮어쓰지 않는다.


## v295 Cache8701 폐기·복원 금지
- Auto8700 Chrome이 8700에서 실행되는데 Cache8701만 관례 포트 9222로 접속하는 구조를 복원하지 않는다.
- Cache8701이 각 page `webSocketDebuggerUrl`을 임의 선택해 Auto8700 연결 기준과 분리되는 구조를 복원하지 않는다.
- Auto8700과 Cache8701을 한 프로세스의 교대 명령 큐로 합치지 않는다. 프로세스는 분리하고 동일 Chrome에 독립 session으로 연결한다.
- Cache8701에서 `Page.navigate`, `Page.reload`, `Target.closeTarget`, `Network.clearBrowserCache`, `Network.setCacheDisabled`, `Fetch.enable`을 사용하지 않는다.
- CI-01 수신만으로 저장 성공으로 표시하지 않는다. CI-05 파일과 필요한 CI-06 DB 로그 전에는 `[검증대기]`다.


## v288 Analyze8780 회귀 금지
- 왼쪽 `↻`, `0/200`, 일부 계정만 읽은 뒤 브라우저에서 검색하는 방식
- 검색어에 자동 `%` 추가, `?`를 `_`로 변환, Enter·두 번째 클릭 요구
- DB 번호 버튼·select·실제 활성 SQLite 불일치
- 계정 전체 삭제 버튼 UI 복원 또는 계정 삭제를 미디어 전체 삭제로 확대
- 게시물 DB만 삭제하고 통계·MP4/JPG를 남기는 방식
- 동일 실제 파일을 여러 게시물이 공동 소유하거나 공유 경로를 감지하고도 파일 삭제
- storage root 절대 경로를 브라우저에 노출하는 방식


## v287 Analyze8780 회귀 금지
- 왼쪽 계정 검색에 사용자가 입력하지 않은 `%검색어%`를 자동 적용하는 방식
- 왼쪽 계정 목록을 다시 페이지로 나누는 방식
- 오른쪽 `10000` 선택을 Shared 200개 상한으로 조용히 잘라내는 방식
- 게시물 통계 차트를 클릭해야만 생성하는 방식
- 차트 요청을 최근 50개보다 크게 고정해 대량 카드에서 무제한 로드하는 방식
- 이미지 높이 확대를 width/height 강제 변형 또는 `object-fit:cover` 잘림으로 구현하는 방식
- DB select 표시만 바꾸고 실제 Analyze8780 활성 DB를 전환하지 않는 방식


## v286 폐기·복원 금지
- 자동 시작 `0/N`에서 현재 Explore 또는 이전 페이지 snapshot을 먼저 실행하지 않는다.
- 자동 계정 실행에서 같은 Instagram 탭을 직접 URL 변경하거나 검색 UI 클릭으로 계속 재사용하지 않는다. v284·v285 실험 분기는 기준에서 제외한다.
- 이전 오류 탭의 Content Script 응답, unload 완료, 종료 확인 메시지를 기다린 뒤에만 다음 단계로 가는 구조를 복원하지 않는다.
- URL이나 가장 큰 tab_id만으로 종료 대상을 찾지 않는다. 자동생성 시 저장한 exact CDP `targetId`를 사용한다.
- `auto_created=true`가 아닌 사용자 탭을 자동으로 닫거나 CLOSED/RETIRED 처리하지 않는다.
- CDP target 하나를 닫기 위해 Chrome 전체 프로세스를 종료하지 않는다.
- v282의 자동 WS8771 direct와 수동 Chrome/WS 경로를 다시 하나의 다운로드 방식으로 합치지 않는다.
- 정적 테스트만으로 unload·검은 화면 해결을 완료 처리하지 않는다. 실제 Windows 로그 전에는 `[검증대기]`다.

## v282 화면 중복·반복 렌더링 폐기
- MAIN 우상단의 별도 `CDP:O` 표시와 별도 `탭 N · OWNER` 표시를 동시에 노출하는 UI는 폐기한다.
- MAIN `DOM 진단복사` 버튼과 `MAIN v 👁` 버튼은 통합 상태줄과 `_ / □`에 기능이 합쳐졌으므로 화면에서 다시 노출하지 않는다.
- 상세 진단 패널을 700ms마다 `textContent`로 다시 쓰는 방식은 텍스트 선택과 복사를 끊으므로 복원 금지한다.
- 긴 진단 전체를 hover 툴팁과 상세 패널에 중복 표시하는 방식은 복원 금지한다. hover는 짧은 사용 안내만 허용한다.
- SIDE 계정 시작 index 0을 헤더 클릭·직접 편집만으로 1로 바꾸게 하는 방식은 `1부터` 버튼으로 보완했으므로 단독 조작 방식으로 되돌리지 않는다.


## IG v280 폐기·복원 금지
- 새 탭 준비 응답 전에 이전 OWNER 탭을 닫지 않는다.
- Side가 새 tab_id를 반영하기 전에 Background가 이전 탭을 종료하지 않는다.
- 가장 큰 tab_id만으로 OWNER를 무조건 결정하지 않는다. run_seq·generation·READY 상태가 우선이다.
- 탭 이력을 제한 없이 누적하지 않는다. 최근 20개만 유지한다.
- `igblue_main_diag_toggle`을 원점·mouse·hover 진단 표시로 되돌리지 않는다.


## IG v279d 폐기·복원 금지
- 자동 계정 전환에서 기존 Instagram 탭에 `chrome.tabs.update({url})`를 실행해 같은 문서를 계속 재사용하지 않는다.
- 현재 활성 Instagram 문서 전체 수명 동안 `EventTarget.prototype.addEventListener`를 지속 후킹하지 않는다.
- 새 replacement 탭 준비 전에 이전 탭을 먼저 닫지 않는다.
- 새 탭 준비 실패를 숨기고 이전 탭까지 닫지 않는다.
- 이전 탭 종료 이벤트 때문에 replacement `tab_id`를 0으로 broadcast하지 않는다.
## IG v279ccc 폐기·복원 금지
- guard 설치 실패를 이유로 첫 계정 URL 이동을 중단하지 않는다.
- Main 준비를 `#IGBLUE_NoTop` DOM 하나로만 판정하지 않는다.
- 실제 No가 없을 때 `No---`를 다운로드 상태에 강제 생성하지 않는다.
- 개별 파일 완료 이벤트의 100%를 전체 자동 실행 100%로 사용하지 않는다.
- ETA 표본이 없을 때 임의 최소시간을 예상값처럼 표시하지 않는다.

## IG v279cc 폐기·복원 금지
- Overlay display를 `None`으로 바꿔 `unload` 경고를 해결하려는 방식은 실제 동일 경고가 확인돼 폐기한다.
- `beforeunload`, `pagehide`, `visibilitychange` 또는 모든 이벤트를 포괄 차단하지 않는다. 이번 guard 대상은 `unload`뿐이다.
- v279cc에서 guard 설치 실패를 URL 이동 중단으로 처리했던 정책은 v279ccc에서 폐기했다. 현재는 실패를 기록하고 이동을 계속한다.
- URL 변경 뒤 고정 4.5초만 기다리고 Main 준비를 확인하지 않는 방식을 복원하지 않는다.
- 정적 guard 테스트만으로 Chrome Permissions policy 경고 해결을 완료 처리하지 않는다.

## IG v279c 회귀 금지
- 자동 Top에서 `metadata`를 MP4/JPG 파일 자산처럼 성공 처리하지 않는다.
- `metadata_collected_done`만으로 게시물 완료 수를 증가시키지 않는다.
- 자동 snapshot의 MP4/JPG 원본 URL이 없으면 완료가 아니라 명확한 실패·다음 후보 판정으로 남긴다.
- v278·v279·v279bb에서 순회와 metadata 저장만 되고 실제 MP4/JPG가 0개였던 완료 판정을 복원하지 않는다.
- Main Injection ON/OFF를 자동 파일 미저장의 직접 원인으로 단정하지 않는다. 사용자 재검증에서 v278·v279는 Main Injection을 꺼도 파일이 저장되지 않았다.
- v262 자동 direct 경로를 저장 선택·metadata 정책으로 다시 감싸지 않는다.
- `IGBLUE_`를 일부만 `YELLOW`로 바꾸지 않는다. 전체 전환은 안정화 후 별도 버전에서 수행한다.

## IG v279bb 회귀 금지
- MAIN 첫 IIFE의 지역 hover 플래그를 종료 뒤 별도 IIFE에서 직접 참조하지 않는다.
- hover 스코프 오류를 고치면서 v279aa의 unload 충돌 hover 계통을 복원하지 않는다.
- `IGBLUE_`와 `YELLOW` 명칭을 부분적으로 혼합 변경하지 않는다.

## v279b 폐기·복원 금지
- 계정 URL 이동 시 `teProgressState`를 비우고 `account_navigation`을 상태 메시지로 넣는 방식.
- 자동실행 시작·다음 계정 계속에서 `auto_start_new_run` 또는 `auto_account_continue`로 실제 완료 파일 표시를 덮는 방식.
- 실제 다운로드 시작 전 Auto UI phase만으로 다운로드 박스를 표시하는 방식.
- 다운로드 전 기본 문구로 `자동현황 대기`, `다운로드 진행 없음`, `No---`, `파일: 대기중`을 생성하는 방식.
- 복구 기준은 실제 `ndy_down_progress status=start`에서만 새 표시를 초기화하는 것이다.
## IG v279aaaa 폐기
- 수집계정 추가 대상의 400ms 자동 확인과 Main hover/current-account 의존.
- Side 카드 명시 클릭 없이 버튼 대상을 자동 변경하는 방식.

## IG MAIN hover 임시 비활성
- v279aaa에서 unload 원인 분리를 위해 hover 계통만 비활성.
- 실제 결과 확인 전 복원 금지.

<!-- FILE: _St/ai_read_삭제.md | ROLE: sort 전체 삭제·폐기·복원 금지 기준 -->
## IG v279aa 폐기
- MAIN `fetch → Blob → URL.createObjectURL → a.click()` 다운로드
- `ndy_ig_down` 페이지 직접 다운로드 수신기
- Auto8700 미실행 상태를 CDP 필요 문구가 먼저 덮는 처리

# 삭제·폐기 기준 — 패키지 v279aa

## 다시 되살리면 안 되는 기능

- OS 커서 이동·방황·실제 마우스 클릭 자동화
- 구형 물리 클릭용 hover 색상·DOM ACK 검증
- `IG_Sorter_Yello` 구 폴더명
- 다운로드 경로마다 별도 DB 완료 로직을 중복 구현하는 방식
- 서버에 로컬 절대경로·상대경로를 저장하는 방식
- 삭제 계정을 수집 카운트에 포함하는 방식
- 계정 삭제 시 MP4/JPG를 확인 없이 자동 삭제하는 방식
- 포커스 이탈만으로 계정목록을 자동 저장하는 방식
- Chrome 프로필별 localStorage를 수집계정 원본으로 사용하는 방식
- 수집계정 목록에 전체 Instagram URL을 원본으로 저장하는 방식
- `/explore/`, `/reels/`, `/p/`, `/reel/`을 계정 username으로 해석하는 방식
- `data.href`·`page_url`의 scope URL을 게시물 `post_url`로 저장하는 방식
- 서로 다른 source scope·EXT 기간·sort_by·기준값·Top 개수의 `No000`을 같은 순위로 합치는 방식
- 다운로드 완료·popup 전환 후 Side·탭·Chrome을 닫는 방식
- Auto8700 종료·재실행 시 Chrome/CDP 프로세스를 종료하는 방식
- Analyze8780 `/api/health`를 1초마다 반복 호출하는 방식
- WS arm 응답 전에 다운로드를 시작하는 방식
- Chrome 기본 Downloads 폴더를 Instagram 최종 저장소로 사용하는 방식
- Save As 제목 완전 일치만으로 창을 놓치는 방식
- 공유·저장·리포스트 미수집을 실제 0으로 기록하는 방식

## 최종 ZIP 제외 기준

```text
IG_StYellow/js/ig_origin_calibration.js
WS8771/ws8771_ig_auto_click_download.py
WS8771/ws8771_ig_auto_download.py
WS8771/ws8771_origin_crosscheck.py
```

## soft-delete 기준

- 계정·게시물 삭제는 DB 상태와 tombstone으로 처리한다.
- 실제 미디어 삭제는 별도 명시 기능 전까지 하지 않는다.
- 삭제 계정은 `🗑️ @username`으로 보존하고 수집·카운팅에서 제외한다.

## v231 실제 파일 삭제 없음

이번 작업은 저장 구조와 다운로드 흐름 수정이며 기존 기능 파일을 삭제하지 않았다.


## v232 폐기 흐름

- 주 다운로드 전에 `ig_rtc_enter_auto_arm`을 기다리는 흐름은 폐기한다.
- Save As 창에 경로 입력·Enter를 주 저장 방식으로 되살리지 않는다.
- Chrome 기본 Downloads에 저장한 뒤 이동하는 방식은 CDP 실패 환경의 보조 fallback일 뿐 정상 경로가 아니다.
- 물리 파일명을 `계정_시각_No_shortcodes`로 강제 변경하지 않는다. Instagram 원본 파일명을 유지한다.


## v233 폐기

- `Browser.setDownloadBehavior`를 실제 Instagram 다운로드 위치 보장 수단으로 사용하는 구조
- IG 주 다운로드의 `chrome.downloads.download` 호출
- 저장창 Enter 성공을 다운로드 완료 조건으로 보는 구조
- 이유: 8700 CDP Chrome과 실제 확장 Chrome이 다를 수 있어 다운로드 설정이 적용되지 않음


## v234 폐기

- Tkinter 전체 UI를 daemon thread에서 생성하는 구조
- Auto8700 창이 생성되지 않아도 manager와 자식 서비스만 숨은 상태로 계속 실행하는 구조
- Auto8700 종료 시 WS·Analyze·RTC 중 일부 프로세스 또는 포트를 남기는 구조


## v235 회귀 금지

- Auto8700 저장 위치를 보정하지 않고 화면 밖 좌표 그대로 적용하는 방식
- UI 로그에서 `WINDOW_VISIBLE`만 남기고 실제 HWND 위치·mapped/viewable을 확인하지 않는 방식
- `igblueNormalizeDownloadPrefix`에 `msg.prefix` 문자열만 전달하는 방식
- WS 직접 다운로드 완료 결과의 `result.finalize`를 무시하는 방식
- 메인 화면에서 `IG 계정`과 `No000`을 하나의 텍스트 박스로 다시 합치는 방식


## v236 로그 운영 폐기 기준

- 정상 health·대기·감시 상태를 초 단위로 계속 출력하는 방식
- 같은 기능·체크 ID·결과를 상태 변화 없이 반복 출력하는 방식
- 실제 결과가 확인되지 않았는데 `[체크완료]` 또는 `[완료]`로 기록하는 방식
- 한국어 기능명 없이 내부 함수명·원시 데이터만 대량 출력하는 방식
- 최초 실패 지점과 무관한 전체 디버그 로그를 항상 활성화하는 방식
- 예외가 없는 상태에서도 상세 추적 로그를 상시 남기는 방식


## v237 자동 다운로드 회귀 금지

- 자동 직접 다운로드의 `ig_media_exists`를 `force_probe` 없이 호출해 background WS 연결 시도 자체를 생략하는 방식
- `AUTO_DIRECT_WS_NOT_READY` 원인을 확인하지 않고 수동 Save As·Enter 방식으로 자동 다운로드를 되돌리는 방식
- 정상 자동 cycle의 `S00~S99` 상세 로그를 사용자 로그에 반복 출력하는 방식
- 같은 cycle·체크 ID·상태·자산의 기능 체크 로그를 중복 기록하는 방식


## v238 프로젝트 진행로그 회귀 금지

- 프로젝트 진행로그와 기존 실행로그에 동일 상세 내용을 이중 기록하는 방식
- 프로젝트 진행로그만 보고 성공·실패를 판단할 수 없는 방식
- 실패 시 상세로그 위치와 검색어를 남기지 않는 방식
- 변동 가능한 로그 줄 번호로 상세로그를 연결하는 방식
- 실패와 무관한 전체 실행로그를 실패 발췌로그에 복사하는 방식
- 동일 cycle·체크ID·상태·자산·메시지를 반복 기록하는 방식

## v239 Main UI 회귀 금지

- 원점·mouse·HOVER·DEV·RTC 상태를 Main 오른쪽에 상시 큰 영역으로 다시 노출하는 방식
- Main 날짜·통계 막대를 Side와 별도 기준으로 적용하는 방식


## v240 서버 등록 회귀 금지

- HTTP 500 응답 body를 버리고 `Internal Server Error` 문자열만 기록하는 방식
- 운영 DB 구조를 확인하지 않고 `yellow_schema_reset.sql`을 적용하는 방식
- 운영 데이터가 있는 테이블에 DROP TABLE, TRUNCATE, DELETE를 사용하는 방식
- API 응답에 PHP warning·HTML 오류를 섞는 `display_errors=1` 방식
- `media_exists` 성공을 `media_insert` 성공으로 간주하는 방식
- 로컬 다운로드 성공과 서버 MySQL 등록 실패를 하나의 실패로 합치는 방식
- SQL 오류 단계·테이블·누락 컬럼을 숨기고 성공처럼 기록하는 방식


## v241 서버 SQL 회귀 금지

- `SHOW TABLES LIKE ?`를 prepared statement로 실행하는 방식
- 단순 컬럼 보완에 `SET/IF/PREPARE/EXECUTE/DEALLOCATE` 동적 SQL을 사용하는 방식
- 작은따옴표 중첩으로 실행 SQL을 문자열 안에 조립하는 방식
- 테이블명이 빈 문자열인데 schema 확인 SQL을 실행하는 방식


## v242 회귀 금지

- WS X 종료를 `ws8771_intentional_stop.json`으로 기록하고 Auto8700이 재시작을 영구 보류하는 방식
- `manual_stopped_services`에 관리 서비스를 넣어 manager 재실행 전까지 복구하지 않는 방식
- Auto8700이 살아 있는데 관리 서비스의 정상 종료 코드 또는 X 종료를 재실행 예외로 취급하는 방식
- 수집계정을 전체 Instagram URL 또는 `@` 없는 혼합 형식으로 표시·저장하는 방식
- 수집계정 저장 시 중복·삭제 우선 검사를 제거하는 방식
- `🗑️ @account`에서 username을 추출해 Instagram URL을 만들거나 자동 이동을 다시 시도하는 방식
- 삭제 tombstone과 활성 입력이 중복될 때 활성 상태로 되살리는 방식
## v243 Analyze8780 UI 회귀 금지

- 좌측 계정 목록을 다시 넓은 카드와 여러 줄 통계·큰 삭제 버튼으로 표시하는 방식
- 계정 한 페이지 조회를 50개로 되돌려 불필요하게 페이지를 자주 넘기게 하는 방식
- 계정 클릭 후 선택 계정 요약이나 게시물 상세가 갱신되지 않는 방식
- `?account=username` 직접 URL을 무시해 계정별 바로가기를 사용할 수 없게 하는 방식

## v244 Side WS 안내 회귀 금지

- WS 설치 안내를 접힌 `다운로드 완료 목록` 내부에 다시 넣어 사용자가 보지 못하게 하는 방식
- WS 미연결인데 `위치 열기·mp4열기·폴더열기` 실패만 표시하고 `_St.zip 다운로드`와 설치·실행 순서를 숨기는 방식
- Side 표시 버전, manifest version/version_name, ZIP `_v숫자`를 서로 다르게 배포하는 방식

## v245 회귀 금지

- 정적 계정 HTML에 로컬 저장·수집 시각을 `게시 시각`으로 표시하는 방식
- 게시물 카드가 화면 폭에 따라 350px 이상 무제한 확대되어 1~2개 게시물의 썸네일이 과도하게 커지는 방식
- `전체보기` 없이 JSON·로컬 파일 링크만 제공하는 방식
- WS 설치 안내에서 존재하지 않는 `_St\yjm_win2rtc\run_instagram_auto.bat`를 실행 파일로 안내하는 방식
- 자동 진행 `총 다운`을 JPG와 MP4 합계로 표시하는 방식
- 댓글·하트 최소값을 화면에만 표시하고 Top 개수·No 순위·자동 대상 필터에는 적용하지 않는 방식
- WS ACK 이전에 전달 완료 flag를 성공으로 기록하거나 쿠키·토큰·로컬 절대경로를 서버 공유 데이터에 포함하는 방식


## v246 회귀 금지

- 조회수 미제공을 숫자 0으로 바꿔 조회수 최소조건에서 탈락시키는 방식
- 조회수 미제공 후보를 `No없음`으로 남겨 자동 Top 목표와 다운로드 순서를 끊는 방식
- 활성 최소조건을 OR로 바꾸는 방식. 조회수 미제공 예외에서도 활성 하트·댓글·공유·리포스트 조건은 AND다.
- 공유수와 리포스트수를 하나의 `reposts` 값으로 합치는 방식
- 최소 입력값 0인 항목을 참여점수 합산에 포함하는 방식
- 실제 수집되지 않는 저장수를 임의 0 또는 추정값으로 참여점수에 포함하는 방식

## v247 통계 연동 회귀 금지

- Side를 다시 열어 마지막 화면 payload를 복원하는 것만으로 새 observation을 저장하는 방식
- 다운로드 버튼·Top 대상·MP4/JPG 저장 성공을 통계 수집의 선행조건으로 요구하는 방식
- 로컬 observation을 10분 bucket 없이 매 수신마다 무제한 별도 row로만 누적하는 방식
- 중앙 연동에서 같은 계정·같은 시간의 변경 없는 shortcode를 인젝션마다 반복 송수신하는 방식
- 중앙 송신 또는 수신 실패인데 해당 시간 구간을 완료로 기록하는 방식
- 공유값을 GraphQL 추정치·리포스트 fallback으로 다시 활성화하거나 참여점수·서버 payload에 포함하는 방식
- 통계 단독 모드에서 중앙 데이터를 송신하거나 수신하는 방식
- 중앙 최신값 수신으로 로컬 MP4/JPG 파일·경로·다운로드 상태를 변경하는 방식


## v248 통계 수집·중앙 이력 회귀 금지

- URL이 바뀐 뒤 이전 인젝션 media cache를 다음 계정 batch에 재사용하는 방식
- 프로필 화면에서 다른 계정 게시물, 단일 게시물 화면에서 다른 shortcode를 저장하는 방식
- 게시물별 개별 PHP 요청의 일부 성공을 전체 1시간 연동 성공으로 처리하는 방식
- `media_stat_hour_upsert` transaction 중 일부 실패 후 나머지 행을 commit하는 방식
- 서버 수신 시 같은 shortcode/hour의 수집자별 중복 행을 그대로 로컬에 병합하는 방식
- 조회수 미제공을 실제 조회수 0과 구분하지 않고 저장하는 방식
- 기존 v1~v6 SQLite를 삭제·초기화해 v7을 만드는 방식
- 운영 MySQL에 이미 적용한 v47 migration을 반복 실행하는 방식

## v249 구형 다운로드 UI·경로 폐기

- Side의 `다운위치`, `Down/`, `10만`, `계정.폴더통합`, `위치 열기` 블록을 다시 추가하지 않는다.
- `download/root_folder`, `download_root_folder`, `download/account_folder_merge` 값을 실제 저장 경로 결정에 사용하지 않는다.
- `IGBLUE_OPEN_DOWNLOAD_FOLDER`, `chrome.downloads.show()`, `chrome.downloads.showDefaultFolder()`를 되살리지 않는다.
- WS 중복확인·연결·큐 등록 실패를 “다운로드 허용”으로 바꾸는 조용한 fallback을 사용하지 않는다.
- Chrome 기본 Downloads 또는 계정 통합 폴더를 IG 최종 저장소로 사용하는 방식을 복원하지 않는다.
- `rank_total`을 서버 `top_n` 대신 저장하지 않는다. `top_n`은 사용자가 설정한 Top 목표, `rank_no`는 수집 당시 순위다.
- 계정 HTML의 Analyze8780 링크를 소스 문자열 존재만으로 완료 처리하지 않는다. 실제 생성 HTML을 읽는 테스트와 Windows 결과를 확인한다.


## v250 자동 fixed-tab 로직 폐기·복원 금지

- `teAutoRunSessionActive`, `teAutoRunTabId`, `teAutoPyAcquireFixedTabSession`으로 자동 시작을 선행 차단하는 방식
- `IGBLUE_GET_CONNECTED_TARGET_STATE`로 마지막 연결 탭이나 과거 탭을 복구하는 방식
- 열린 Instagram 탭 전체를 URL 패턴으로 검색해 후보를 고르는 방식
- 계정 URL 이동 뒤 18초 동안 owner·DOM 목록 완전 일치를 요구하고 실패 시 자동 전체를 중단하는 방식
- `allow_cache_fallback:false`로 v249의 No 불일치 보완 진행을 전면 차단하는 방식
- `owner_account_mismatch`를 추가해 기존 정상 자동을 즉시 중단시키는 방식
- `현재 채널만` 체크 여부를 tab_id 직접 연결 여부로 사용하는 방식
- 상단 `채널고정`과 하단 `목록 미사용`을 중복 옵션으로 유지하는 방식
- Auto8700 종료 시 Analyze8780과 8780 포트를 함께 종료하는 방식

## v252 잘못된 산출물 폐기

- `sort_local_v252_manual_active_tab_fixed.zip`은 수동 탭 추종 문제를 확대 수정해 정상 자동 흐름을 건드린 잘못된 산출물이다.
- v252를 기준 소스로 사용하거나 이후 패치에 재적용하지 않는다.


## v251 회귀 금지

- Injection 다운로드에서 shortcode만 남기고 현재 게시물의 좋아요·댓글·조회수·리포스트·게시시각·썸네일·caption을 버리는 방식
- Injection 수동 다운로드와 Side 자동 다운로드에 서로 다른 메타 필드 이름을 사용하는 방식
- 성공 응답에 shortcode 없이 파일 확장자만 돌려보내 같은 종류의 여러 버튼을 모두 완료 표시하는 방식
- 재생 버튼을 깨질 수 있는 한글 `완료` 문자열로 교체하는 방식
- 신규 메타에 필드가 없다는 이유로 기존 JSON의 정상 통계를 0·빈 문자열로 덮어쓰는 방식
- `sort_snapshot`만 들어온 수동 다운로드를 중앙 서버 통계 0으로 전달하는 방식

## v254 Analyze8780 이미지 표시 회귀 금지

- `rel="noopener"`를 `rel="noreferrer"` 하나로 교체해 기존 값을 제거하는 방식
- JPG/MP4 상태를 이미지 밖 별도 설명 영역으로 표시하는 방식
- 카드 전체·텍스트·통계·버튼 영역을 16:9로 변경하는 방식
- 이미지에 `object-fit` 없이 폭과 높이를 강제해 원본을 찌그러뜨리는 방식
- 미다운로드 게시물을 목록·통계 저장에서 제외하는 방식



## v255 자동 목표 회귀 금지

- 후보 배열의 마지막 No 도달을 Top목표 완료로 간주하는 방식
- `Top목표 3`인데 후보가 0~2개라는 이유로 swipe 없이 계정을 종료하는 방식
- 기간 필터 날짜 경계나 All time 게시물 처음 확인 없이 후보 부족을 `더이상없음`으로 간주하는 방식
- 파일·JSON·보고서 완료 전 큐 등록만으로 완료 shortcode 수를 증가시키는 방식
- 같은 shortcode의 JPG·MP4를 완료 게시물 2개로 합산하는 방식
- 완료 결과 문구를 다음 실행 시작값 `0/n`으로 덮어 직전 실행의 실제 n/n 완료 결과를 잃는 방식
- 다음 실행 시작 index를 0/n으로 초기화하지 않아 이전 완료 위치에서 다시 시작하는 방식
- 자동 완료·대상 부족·사용자 중단을 모두 고정 `다운로드 진행` 제목으로 남기는 방식
- 자동 종료 화면에서 `자동종료` 문구를 생략하는 방식

## v256 대량 게시물 메모리·통계 회귀 금지

- 썸네일 URL을 fetch·FileReader로 Base64 Data URL로 바꿔 게시물 객체에 장기 누적하는 방식
- 변경이 없어도 매초 누적 전체 게시물 배열을 content→background→Side로 직렬화·재전송하는 방식
- Side가 화면 밖 모든 썸네일 URL을 동시에 src에 유지하고 전부 디코딩하는 방식
- 전체 순위를 보호한다는 이유로 화면 밖 카드의 레이아웃·페인트까지 계속 강제하는 방식
- 처리 중인 통계 전체 스냅샷 또는 drain Promise를 queue에 계속 누적하는 방식
- 같은 1시간의 첫 batch 성공만으로 계정 전체 시간 구간을 완료 처리해 이후 스크롤 신규 shortcode를 건너뛰는 방식
- 500개 제한 API에 500개 초과 전체 배열을 한 요청으로 보내는 방식
- 실패한 통계 chunk를 성공 signature로 기록해 재시도를 막는 방식
- 메모리 절약을 이유로 전체 메타데이터·전체 순위를 100개 페이지별 순위로 분리하는 방식


## v257 Side 가상 목록·SQLite 중복 저장 회귀 금지

- 전체 게시물 수만큼 Side 카드 DOM을 다시 생성하는 방식
- 화면 밖 카드의 이미지·observer·이벤트를 계속 유지하는 방식
- 자연 이미지 비율을 메모리 절약 명목으로 고정 비율로 바꾸는 방식
- 실제 지표·계정·게시물 메타 변화 없이 10분 시각만 바뀌었다는 이유로 SQLite의 어떤 테이블이라도 갱신하거나 history·10분 행을 추가하는 방식
- Analyze8780의 동일값 생략을 저장 성공으로 계산하는 방식


## v258 Side 가상 스크롤 회귀 금지

- 가상 범위가 바뀔 때 `img_collection.replaceChildren(fragment)`로 현재 가시 카드까지 모두 제거·재삽입하는 방식
- spacer 또는 행 높이 변경 뒤 현재 가시 카드 위치를 복원하지 않는 방식
- 브라우저 자동 scroll anchoring과 수동 scroll 보정을 동시에 사용해 이중 점프를 만드는 방식
- 스크롤 anchor를 shortcode 확인 없이 다른 index 카드에 적용하는 방식


## v259 가상 DOM·집계 폐기

- 최대 120개 카드만 DOM에 유지하고 스크롤 중 위 카드 제거·아래 카드 추가를 반복하는 방식
- 위·아래 spacer와 실측 평균 행 높이로 전체 스크롤 길이를 추정하는 방식
- 첫 가시 카드 anchor를 잡고 일반 스크롤 중 `window.scrollBy`로 위치를 보정하는 방식
- 이미지 `naturalWidth/naturalHeight` 로드 뒤 카드 aspect-ratio를 변경하는 방식
- `총`이라는 문구로 현재 계정 MP4 수만 표시하고 JPG·완료 게시물·전체 실행 누적을 숨기는 방식
- v257 문서의 `전체 게시물 수만큼 .post-item DOM 유지 금지` 기준은 v259 사용자 지시로 폐기됐다. 다시 적용하지 않는다.


## v260 자동 상태 회귀 금지

- 다른 탭·Chrome 창 사용, 같은 시작 탭의 Instagram 외 주소, WS/Main/현재 No 일시 미준비를 즉시 자동중단으로 처리하는 방식
- `no_instagram_tab` 하나만 보고 대상 없음 또는 전체 자동종료로 처리하는 방식
- 대기 상태에서 계정 index·No·run_seq 흐름·전체 실행 집계를 초기화하는 방식
- `automatic_end` 문구만으로 실제 목록 index를 n/n으로 강제 표시하는 방식
- 시작 탭 보존을 이유로 열린 Instagram 탭 전체 검색·마지막 연결 탭 복구·후보 탭 순회를 되살리는 방식
- v260 시작 탭 보존은 새 자동 시작 당시 현재 활성 Instagram 탭 한 개만 저장하는 경량 세션이며, v250 fixed-tab 검색·복구·owner 강제 gate와 다르다.


## v261 Side 작업 화면 회귀 금지

- `탭 새로읽기`를 `window.location.reload()` 또는 기존 `ndy_refresh`와 연결해 Instagram 탭을 다시 로드하는 방식
- `탭 새로읽기`에서 swipe·계정 이동·자동 다운로드를 함께 실행하는 방식
- 화면 제목 번호를 바꾼다는 이유로 기존 다운로드 handler ID·통신 mode 의미까지 임의 변경하는 방식
- `Video only = skip images`, `ID-date filename = username_YYYYMMDD_HHMMSS.ext`, `다운 지연 = ...` 구 영문 안내를 복원하는 방식. 현재 실제 파일명 규칙과 맞지 않는다.


## v262 Side UI 회귀 금지

- Analyze8780을 버튼 click handler의 `chrome.tabs.create()` 또는 `window.open()`으로 강제 여는 방식
- Analyze8780 오프라인 또는 계정 미확인 상태에서 이전 href를 남기는 방식
- `현재계정추가`를 고정 문구로 두고 실제 클릭 대상 계정을 숨기는 방식
- 버튼에 표시한 계정과 클릭 시 추가하는 계정을 서로 다른 판정값으로 사용하는 방식
- 현재 게시물 대상 확인 실패 뒤 이전 계정명을 계속 표시·추가하는 방식
## v263 자동실행·계정순서·Explore hover 회귀 금지

- 별도 `자동재시작` 버튼과 전용 준비 상태를 다시 만드는 방식
- 사용자가 중지했을 때 보존 진행상태를 자동으로 삭제하는 방식
- 자동시작 준비 대기 중 `중지` 버튼을 비활성화하는 방식
- `진행상태 리셋`에서 queue index·No·현재/전체 집계·완료 shortcode 일부만 남기는 방식
- 계정 추가 또는 일반 `💾 저장`만으로 목록을 자동 정렬하는 방식
- Side가 전달한 계정 순서를 Shared SQLite 저장에서 다시 정렬하는 방식
- 별도 `정렬`로 순서가 바뀌었는데 기존 위치 기반 진행상태를 그대로 사용하는 방식
- Explore·Reels hover 계정을 shortcode 재검색 실패만으로 버리는 방식
- hover 표시를 자동실행 현재 대상의 노란색과 같은 색으로 만들어 상태를 혼동시키는 방식

## v264 회귀 금지 — 렌더링 문자열 기반 hover 계정 판정

- `.igblue-main-account-row span`의 화면 문자열을 hover 계정 원본으로 다시 읽지 않는다.
- 인젝션 카드는 `pointer-events:none`일 수 있으므로 카드 자체 document pointerover만으로 썸네일 hover를 판정하지 않는다.
- 실제 Instagram media host에 hover를 연결하고 카드의 현재 `data-code → S(code)` 결과만 Side에 전달한다.
- 같은 카드가 새 shortcode로 재사용될 때 새 pointerover를 기다리지 않고 `N()` 재연동 시 계정을 갱신한다.



## v265 회귀 금지 — Explore 팝업·hover·Main nav

- `/explore/`에서 게시물 팝업을 열었다는 이유로 Explore 전체 미디어 map을 지우고 현재 shortcode 하나만 남기는 방식
- 팝업 닫기 후 초기 JSON 재생성을 기대해 Explore 카드 복원을 F5에 의존하는 방식
- 썸네일 pointerenter 즉시 Side 계정을 바꾸는 방식
- 확정 카드에서 Side 버튼으로 이동하는 pointerleave만으로 선택 계정을 지우는 방식

## v266/v267 폐기·회귀 금지 — Main 순위 시각 UI와 Side 과삭제

- Main 카드의 `No000` 행, Rank badge, 순위 연동 미디어 종류 행을 다시 생성하지 않는다.
- 우측 `1 / Prev / Current / Next / 마지막` 이동 버튼 DOM·CSS·click handler를 다시 만들지 않는다.
- Main용 순위 체크·Main 순위 payload·Main Rank badge 설정을 다시 넣지 않는다.
- v266에서 Side의 `No000`·Rank badge·`순위` 탭까지 제거한 과삭제는 폐기한다. Side 순위 기능은 정상 기능이므로 다시 제거하지 않는다.
- 자동실행 Current/Next를 `#IGBLUE_NoNav_*` 요소 검색·클릭 방식으로 되돌리지 않는다.
- Main 준비 완료를 시각 버튼 존재 여부로 판정하지 않는다.
- 자동실행 내부 순번은 `IGBLUE/internal_no_nav_state`, 내부 Current/Next handler, shortcode 기반 `.ndy_ins_info[data-code]` 탐색으로 유지한다.
- 시각 helper 삭제 뒤 `teMainAnchorId()` 같은 폐기 함수 호출을 남겨 내부 활성 대상 설정 실패를 숨기지 않는다.


## v267 진단 단계 회귀 금지

- 홈 중복 원인이 확인되기 전에 shortcode가 같다는 이유만으로 전역 카드 하나를 임의 삭제하지 않는다.
- 생성경로 색상은 진단용이며 0.2초 확정 hover의 청록 선택 표시보다 우선하지 않는다.
- 홈 중복 수정 시 Explore·상세·Reels의 H/D/B 생성 경로를 한꺼번에 제거하지 않는다.


## v268 홈 중복·Explore 복구 회귀 금지

- 같은 shortcode라는 이유만으로 서로 다른 article의 인젝션 카드를 전역 하나로 병합하지 않는다.
- 숨겨진 video 또는 높이 152px 미만 video 때문에 현재 보이는 이미지 인젝션을 차단하지 않는다.
- 홈 동영상 poster 이미지와 visible video에 각각 카드를 생성하지 않는다.
- 홈→Explore SPA 응답을 초기 `script[type=application/json]` 또는 `window.fetch` wrapper 하나에만 의존하지 않는다.
- Explore 링크가 있는데 카드가 0개인 실패를 조용히 빈 목록으로 처리하지 않고 `INJ-03/04`와 DOM 진단에 남긴다.

## v269 회귀 금지

- `play_count=-1` 또는 `views_available=0`을 실제 조회수로 취급해 비공개 후보를 탈락시키는 방식
- 조회수 비공개인데 좋아요·댓글·리포스트 활성 조건이 하나도 없는데 후보를 만드는 방식
- 참여순위에 고정 가중치나 비활성 지표·공유 수를 포함하는 방식
- Main 시각 No DOM이 없다는 이유만으로 snapshot No001을 다운로드하지 않는 방식
- AD-03 `[체크실패]` 뒤 AD-04·AD-05 또는 cache direct download를 진행하는 방식



## v270 회귀 금지

- Top목표 3을 먼저 전부 로딩해야 No001 다운로드를 시작하는 선탐색 구조
- 다운로드 가능한 snapshot이 있는데 Main 시각 `No---`·Current·카드 연결을 무한 대기하는 구조
- 저장 완료 shortcode를 순위 재정렬 뒤 다시 다운로드하는 구조
- 로딩된 후보를 처리한 뒤 목표 미달이라는 이유로 `target_incomplete` 중단하는 구조
- 후보 0개를 날짜 범위·게시물 끝 확인 전에 다음 계정으로 넘기는 구조
- 날짜 범위 종료 뒤 같은 계정에서 계속 swipe하는 구조
- IIFE 밖에서 `teMainEnsureHoverAccountStyle();`를 호출해 ReferenceError를 만드는 마지막 단독 호출


## v271 회귀 금지

- Side에 `detail / download / none` 선택 UI만 남기고 `content_instagram.js`의 MAIN world 전달 함수를 제거하는 방식
- `Down icon only`에서 다운로드 버튼까지 숨기는 방식
- `None`에서 통계만 숨기고 다운로드 버튼 또는 빈 인젝션 컨테이너를 남기는 방식
- 잘못된 저장값을 그대로 MAIN에 전달하는 방식. 유효하지 않은 mode는 `detail`로 복구한다.
- overlay 설정 복구를 이유로 Top N 자동 다운로드·수동 다운로드·순위·통계 로직을 함께 변경하는 방식


## v272 회귀 금지

- Metric bars·Date border 설정을 불러올 때 `main = side`로 강제하는 방식
- 저장 시 Main 체크값 대신 Side 체크값을 `main`에 기록하는 방식
- Instagram Main 시각화에서 `main`이 아니라 `side`를 검사하는 방식
- `IGBLUE_SAVE_VISUAL_SETTINGS`를 현재 탭에만 전달하고 Chrome storage 저장을 생략하는 방식
- 기존 `다운버튼 크게 표시`의 버튼 폭 50%·활성 대상 확대 의미를 복원하는 방식
- 다운로드 상태를 shortcode·asset_kind 확인 없이 모든 카드 또는 임의 현재 카드에 표시하는 방식
- 다운로드 실패·부분완료를 `✅` 성공으로 표시하는 방식
- extension page용 `runtime.sendMessage`만 보내고 content/Main 전달 완료로 간주하는 방식
- 다운로드 상태 강조 복구를 이유로 Top N 자동 다운로드·수동 다운로드·overlay 3모드·순위 로직을 함께 변경하는 방식

## v273 자동 계정 목록·SQLite 파일 전환 회귀 금지

- `1/N 이상` 시작 전에 현재 탭이 이미 Instagram인지 먼저 요구해 지정 계정 URL 이동을 막는 방식
- indexed start·다음 계정 이동을 content script의 `ndy_goto` 하나에만 의존하는 방식
- Main/content 응답 지연, 네트워크 오류, 로그인·challenge, 비공개 계정을 없어진 계정으로 오판하는 방식
- 명시적인 `not_found` tombstone 저장 뒤 같은 계정 URL을 다시 여는 방식
- 삭제된 활성 항목 뒤 다음 계정을 `index+1`로 건너뛰는 방식. 활성목록이 축소되므로 같은 index의 다음 항목을 사용한다.
- SQLite 새 파일·다른이름 저장에서 기존 파일을 조용히 덮어쓰는 방식
- 사용자가 입력한 경로를 허용해 `_St/Shared/data` 밖의 SQLite를 전환하는 방식
- Analyze8780과 WS8771이 서로 다른 선택 DB를 사용하거나 선택 파일명을 브라우저 localStorage만으로 관리하는 방식
- DB 전환 뒤 이전 DB의 계정목록·진행상태를 그대로 남겨 혼합 실행하는 방식


## v274 자동실행 제어·ETA 회귀 금지

- `0/N` 비 Instagram 상태에서 자동 실행을 활성화한 뒤 Main Injection을 무한 대기하는 방식
- `Goto Instagram`이 새로 연 탭을 확인 없이 기존 자동 세션 tab_id로 간주하는 방식
- 사용자 중지 뒤 `stopping=true`를 무기한 유지해 자동시작을 잠그는 방식
- 이전 중지 요청의 늦은 응답이 새 실행의 running·button 상태를 덮어쓰는 방식
- 자동종료 시 Auto PY 체크와 `download/auto_py` 설정을 끄는 방식
- 자동종료·사용자 중지 완료 뒤 자동시작과 중지를 모두 비활성화하는 방식
- tab_id를 Auto PY 영역과 하단에 중복 표시하거나 무효·닫힌 탭의 과거 ID를 유지하는 방식
- 전체 주소 진행률 옆 종료예상을 현재 파일·현재 계정 진행률만으로 계산하는 방식
- 실패·중복·미실행 다운로드 시간을 성공한 MP4+JPG 평균에 포함하는 방식
- 저장된 평균시간 없이 1분 등 근거 없는 종료예상을 성공값처럼 고정하는 방식
## v275 Side UI·계정추가 경로 폐기·회귀 금지

- `표시계정추가` 별도 버튼과 화면 표시 계정을 한꺼번에 추가하는 관련 경로는 폐기한다.
- Side 카드 `IG 계정명` 클릭은 기존 계정추가 버튼의 대상을 선택하는 동작이다. 클릭만으로 목록 저장·SQLite 확정을 실행하는 방식으로 바꾸지 않는다.
- `tab_id`를 `자동실행 사용`과 `시작/중지` 사이에 다시 넣지 않는다. 방식 3의 개수 앞에 한 번만 표시한다.
- `Auto PY`, `자동시작` 영문·중복 명칭을 복원하지 않는다. 현재 표시명은 `자동실행 사용`, `시작`, `중지`다.
- 톱니바퀴 설정 버튼을 tab_id·개수 줄의 왼쪽에 붙이지 않는다. 제목 줄 오른쪽 정렬을 유지한다.
- 수동 다운로드 시작 강조를 완료 응답 뒤에만 표시하거나 shortcode·asset_kind 없이 임의 카드에 표시하지 않는다.
- v275 수동 클릭 start 이벤트를 자동다운로드 경로의 별도 클릭으로 오인해 중복 추가하지 않는다.



## v276 응답 없음 진단 회귀 금지

- `unload is not allowed` 경고를 3/3 응답 없음의 확정 원인으로 간주하지 않는다.
- `EventTarget.prototype.addEventListener`를 전역 후킹해 `unload→pagehide`로 바꾸는 로직은 이번 진단에 넣지 않는다.
- 응답 없음 감지 시 원인 로그 없이 자동 새로고침·탭 종료·계정 건너뛰기로 실패를 숨기지 않는다.
- 10초 표본을 무제한 localStorage에 누적하지 않는다. MAIN 메모리 120개, 저장 표본 40개 ring 기준을 유지한다.
- 진단 계측을 이유로 기존 자동 다운로드·계정 이동·다운로드 상태 강조 경로를 변경하지 않는다.


## v277 폐기·회귀 금지

- `Video only` 선택 UI와 단일 video-only 의미를 복원하지 않는다.
- `ID-date filename` 선택 UI를 복원하지 않는다. 기존 파일명 규칙은 항상 유지한다.
- CDP:X에서 자동실행·예약을 활성 상태처럼 보이게 하지 않는다.
- CDP:X를 이유로 수동 MP4/JPG 다운로드를 막지 않는다.
- popup 생성만으로 기존 Side를 닫지 않는다. 동일 Instagram tab_id 연결 확인이 선행돼야 한다.
- 자동실행 중 `↗`로 실행 메모리를 끊지 않는다.
- 파일 저장 선택 해제를 게시물 전체 누락이나 다운로드 완료로 기록하지 않는다.
- metadata-only 항목을 빈 file_name이라는 이유로 JSON·HTML 보고서에서 제거하지 않는다.


## v278 다운로드 회복 회귀 금지

- `allow_cache_fallback:false`를 자동 시작·사이클 preload에 다시 넣어 v262 정상 회복 경로를 전면 차단하지 않는다.
- Main active rank·shortcode가 비어 있다는 이유만으로 정확한 snapshot 다운로드를 중단하지 않는다.
- Main의 실제 shortcode가 snapshot과 다른데 snapshot으로 덮어써 잘못된 게시물을 다운로드하지 않는다.
- snapshot No·shortcode·owner·선택 자산 URL 검증 없이 임의 Side 배열 항목을 다운로드하지 않는다.
- 복구 가능한 상태를 `[체크실패]`로 기록한 뒤 조용히 계속하지 않는다. `[예외추적] → [복구완료]`로 기록한다.
- 수동 `MANUAL_SINGLE` 다운로드 경로를 자동 복구 패치와 함께 변경하지 않는다.


## v279 CDP 실행 회귀 금지

- `/json/version` 응답만으로 CDP Chrome·Instagram Runtime이 정상이라고 처리하지 않는다.
- Chrome `/json/new`를 GET으로 호출해 탭 생성 실패를 숨기지 않는다. PUT 또는 `Target.createTarget`을 사용한다.
- 수동 `CDP모드 실행` 버튼을 `CDP OK` 상태에서 비활성화해 기존 창을 다시 열 수 없게 하지 않는다.
- 전용 CDP 복구를 이유로 일반 Chrome User Data 프로세스를 종료하지 않는다.
- CDP 실행 실패를 로그에만 남기고 UI에서 아무 반응 없는 것처럼 보이게 하지 않는다.
## v292 사용하지 않는 기본 정책
- Explorer·검색 결과의 자동 섬네일 저장 기본 ON 정책은 사용하지 않는다. 기본 OFF를 유지한다.
- 전체 자동 섬네일 미사용 상태에서 하위 페이지 설정이 실행되는 로직은 사용하지 않는다.

## v293 제거·복원 금지
- 자동 섬네일 설정을 접힌 `Auto8700 DevTools` 본문에만 두고 톱니바퀴에서 보이지 않게 하는 v292 배치를 복원하지 않는다.
- 모달 Save 값보다 오래된 DevTools UI state가 우선하여 설정을 덮어쓰는 병합 순서를 사용하지 않는다.

## v305 재사용 금지
- tab_id를 무시한 전역 이미지 URL 매칭.
- 자동 중단 플래그로 탭 추적·DOM 감시·Cache 저장까지 중단.
- 저장된 진행상태가 화면 리스트 박스 시작번호를 덮어쓰는 로직.

- 사용자 자동 중단 시 기존 진행 정보를 `⛔ 자동 중단 / 사유 / 위치 / 보존된 진행상태에서 이어서 실행` 안내로 통째로 덮어쓰는 방식.

- 중단 스냅샷의 `account_queue_index`/last_rank를 `시작` 버튼 실행 위치로 복원하는 이어하기 로직.
## v309 Auto8700 UI 폐기 기준
- Auto8700의 520px compact 접기 UI는 폐기했다. `_`는 즉시 34x34 보라색 `ㅁ`으로 축소한다.
- 화면 완전 숨김은 `_`가 아니라 `.` Tray 버튼만 사용한다.


## v310 폐기/회귀 금지
- Auto/WS/RTC Tray에서 Windows 기본 `IDI_APPLICATION`만 고정 표시하는 방식은 현재 기준이 아니다. 공용 `_St/Shared/assets/ig_styellow_tray.ico`를 우선 사용하고, 기본 아이콘은 자산 로드 실패 시 fallback으로만 허용한다.
- RTC 시작 시 메인창을 먼저 화면에 노출하는 동작은 현재 기준이 아니다. Tray 생성 실패 때만 메인창을 복원한다.


## v311 폐기/회귀 금지
- 수집계정 `섞기`를 `Math.random().sort()` 같은 편향 정렬로 구현하지 않는다. Fisher–Yates 기준을 유지한다.
- 자동섞기를 모든 시작·다음 계정에서 반복하지 않는다. 사용자 새 시작의 정확한 `1/N`에서만 1회다.
- 섞기 이력을 Instagram 사이트 `localStorage`에만 저장하지 않는다. 공식 이력은 확장 공통 `chrome.storage.local`이다.
- `[IG_DBG]`를 1초 주기로 콘솔에 반복 출력하는 상태를 복원하지 않는다. 필요 진단 snapshot 저장과 체크/오류 로그는 유지한다.


## v312 Explorer 회귀 금지
- Explorer `clips` 응답을 `fill_items`와 `one_by_two_item`만 읽는 구형 2.4.0 파서로 되돌리지 않는다.
- Swipe/scroll 이후 `layout_content.medias[].media`와 `layout_content.medias[].clips.items[].media` 경로를 다시 누락하지 않는다.

## v313 폐기/숨김
- 일반 자동·일괄 `Image 저장`은 폐기. JPG 자동 저장은 Cache8701 담당.
- 다운로드 방식1/2는 삭제 금지, UI hidden 상태로 보존.

## v314 회귀 금지
- 다운로드 방식 1/2의 `d-none` 강제 비표시를 임의 제거하지 않는다.
- 방식 1/2 DOM/핸들러 자체는 삭제하지 않는다.


## v322 설정 회귀 폐기/금지
- v319에서 자동 다중 편집복사 dead code를 제거할 때 그 아래의 설정 전역 선언까지 함께 삭제한 범위 초과 수정은 폐기한다. `m/b/g/_`, `y/v/w/x`, `teAutoPyStatsTimer`, `teAutoPyStatsLastMainPush`를 다시 삭제하지 않는다.
- v321의 `settings` target gate 제거는 실제 원인이 아니었으므로 폐기한다. 기존 v317 handler 조건을 유지한다.
- `test_ext_settings_open_without_target_v321.js`는 잘못된 요구를 강제하므로 0Byte 폐기한다.
## v323 JPG 자동/WS direct 연결 폐기 — 복원 금지
- 자동다운로드에서 JPG 파일을 후보로 넣는 로직은 폐기한다. `Top sorted 자동`은 MP4만 처리한다.
- 자동 진행/완료/ETA에서 `JPG N개`를 표시하거나 JPG 파일을 목표/파일수로 집계하는 로직은 되살리지 않는다.
- JPG 자동 저장은 Cache8701 전담이다. Cache8701 저장과 자동다운로드 액션을 합치지 않는다.
- 수동 JPG 클릭을 `IGBLUE_DOWNLOAD_URL → WS8771 ig_media_download_direct`로 보내는 로직은 폐기한다.
- 수동 JPG는 MAIN 원래 브라우저 downloader `fetch → Blob → a.download`만 사용하고 Side 자동/다운로드 상세상태에 반영하지 않는다.
- 수동 MP4 WS8771 direct 및 자동 MP4 WS8771 direct는 유지한다.

