<!-- FILE: _St/Auto8700/ai_read.md | ROLE: Auto8700 현재 기준 -->

# Auto8700 v324 현재 기준
- 실행/표시 버전 `2.3.8.324 / v324`.
- 자동업데이트는 시작 시 1회 + 정상 실행 중 매 정시 `HH:00:00` 서버 build 확인.
- `auto_update.check_hourly=true`; 정시 checker는 manager lock 이후 daemon thread 1개만 실행하고 다음 정시까지 shutdown event로 대기한다.
- build 판정·publisher skip·SHA256/ZIP/build 검증·TEMP updater 적용은 v320 기준 그대로 재사용한다.
- 정시 새 build 발견 시 `request_manager_shutdown(..., reason="hourly_auto_update")`으로 정상 종료 후 updater가 적용·재실행한다.
- self-reexec `--skip-update-check`는 시작 중복 체크만 막고 다음 정시 watcher는 유지한다.
- `test_auto8700_update_hourly_v324.py` 포함 updater 15 passed, 전체 pytest 157 passed. 실제 정시 Windows 로그/실제 새 build 적용은 `[검증대기]`.

## 패키지 v317 동기화
- 실행/표시 버전은 `2.3.8.317 / v317`; 이번 수동 다운로드 강조·편집폴더 1건 교정에서는 Auto8700 기능 로직을 변경하지 않는다.

## 패키지 v316 동기화
- 실행/표시 버전은 `2.3.8.316 / v316`; 이번 편집폴더 GUI picker·수동 injection fallback 작업에서는 Auto8700 기능 로직을 변경하지 않는다.

## 패키지 v314 동기화
- 실행/표시 버전은 `2.3.8.315 / v314`; 기존 v310 Tray·v308 CDP EXT 설치 기준은 그대로 유지한다.

## v310 Tray 아이콘 기준
- Tray 기능/버튼 의미는 v309와 동일하고 아이콘만 `_St/Shared/assets/ig_styellow_tray.ico` 공용 프로젝트 아이콘으로 변경한다.
- `TRAY_ICON_PATH`는 Auto8700 실행 위치의 부모 `_St`에서 계산하며 절대 드라이브 경로를 하드코딩하지 않는다.
- 실제 Windows 아이콘 표시는 `[검증대기]`다.

## v309 최소창·Tray 현재 기준
- Auto8700의 `_`는 중간 compact bar가 아니라 34x34 보라색 `ㅁ` 하나만 남긴다.
- `ㅁ`을 누르면 전체 UI(stage 0)로 복원한다. 보라색(`#7c3aed`)은 WS8771 상태색 사각형과 구분하기 위한 고정색이다.
- `.` 버튼은 `_St/Shared/windows_tray.py`의 WindowsTrayIcon을 사용해 Tray 아이콘 생성 성공 후에만 `root.withdraw()`한다.
- Tray 아이콘 클릭 요청은 Tray thread가 Tk를 직접 호출하지 않고 Event를 올리고, Tk main thread의 `poll_tray_restore()`가 `deiconify()`한다.
- X/전체종료는 기존처럼 manager 종료이며 Tray 숨김과 별개다.
- 실제 Windows `_ → ㅁ → 복원`, `. → Tray → 복원`, X 종료 후 Tray icon 제거는 `[검증대기]`다.

## v308 EXT 자동 설치·경로 교정 기준
- `script_dir().parent / "IG_StYellow"`를 현재 프로젝트의 authoritative unpacked EXT 경로로 사용한다.
- 최초 CDP 초기화에서 Runtime 성공 후 `Extensions.getExtensions`로 설치/경로를 확인한다. 미설치는 loadUnpacked, 경로 이동은 기존 unpacked uninstall 후 현재 경로 loadUnpacked다.
- 설치가 이미 같은 경로면 설치 작업 없이 reload 1회로 진행한다.
- CR-01 Runtime → CR-02 설치·경로 → CR-03 reload → CR-04 Page/content/manifest 확인 순서가 모두 성공해야 CDP:O다.
- Extensions 도메인 미지원/실패는 조용히 성공 처리하지 않는다.


# Auto8700 v307 현재 기준
- `chrome_debug_alive()`는 8700 `/json/version` 포트 확인 전용이며 `CDP:O` 판정에 단독 사용하지 않는다.
- 실제 CDP Runtime 기준은 Instagram page target의 `webSocketDebuggerUrl`에 `Runtime.evaluate("1+1")`을 보내 결과 2를 확인하는 것이다.
- Auto8700 프로세스 최초 Runtime 성공 시 로컬 `_St/IG_StYellow/manifest.json`을 기준으로 `IG Sorter Yellow` extension target을 찾고 `chrome.runtime.reload()`을 1회 요청한다.
- EXT reload 후 현재 Instagram page를 `Page.reload` 1회 하고 EXT manifest version/content version이 로컬 manifest와 일치해야 `AUTO8700_CDP_BOOTSTRAP_STATE.verified=true`가 된다.
- `CDP:O`/schedule `cdp_ready`/CDP gate는 `verified + 현재 Runtime 성공`일 때만 true다.
- EXT refresh 전에는 gate X를 보낸다. Auto8700 프로세스가 살아 있는 동안 EXT reload는 반복하지 않는다.
- 파일 변경 자동재실행은 서비스별 독립 worker, `마지막 변경 + 3초`, 재실행 1회 기준을 유지한다.
- 기능 체크 로그: CR-01 Runtime, CR-02 EXT reload, CR-03 현재 페이지 새 EXT 적용 / AR-01~03 파일 재실행.
- 정적/단위 검증: Auto8700 35 passed.
- 실제 Windows CR-01~03 및 파일 변경 재실행 확인 전에는 `[검증대기]`다.

# Auto8700 v303 현재 기준
- v297의 `mark_control_tab_titles()`·`refresh_auto8700_control_marker()` CDP 증명 이벤트 경로를 유지한다.
- Auto8700은 실제 CDP 통신 성공 여부를 `/status`에 제공하고 Side가 중앙 상태를 관리한다.
- 새로고침·URL 이동은 연결 끊김이 아니며 실제 Runtime/status 실패가 확인될 때만 X다.
- 이번 작업은 Chrome 실행·탭 이동·자동 Swipe 코어를 변경하지 않았다.


# Auto8700 v297 Cache8701 연결 기준
- Auto8700은 Chrome 실행·자동실행·예약·탭 제어 역할을 유지한다.
- `/api/cdp/connection`은 실제 CDP 포트, Instagram target 목록, 안정화된 owner target, generation을 읽기 전용으로 제공한다.
- Cache8701은 같은 Chrome에 별도 CDP session으로 붙으며 Auto8700 명령과 교대 큐를 사용하지 않는다.
- WebSocket URL은 API에 노출하지 않고 Cache8701이 실제 CDP 포트의 `/json/version`에서 직접 읽는다.
- 실제 Windows에서 owner target 교체와 Cache8701 재연결은 `[검증대기]`다.


# Auto8700 현재 기준 — 실행 코드 v286

## v286 exact CDP target 강제 종료
- POST `/api/cdp/ig/close_target`은 `target_id`를 필수로 받고 browser-level `Target.closeTarget`으로 정확한 page target 하나만 닫는다.
- expected URL이 오류·blank·redirect로 달라져도 exact targetId가 일치하면 종료를 계속하고 `url_mismatch`를 진단값으로 남긴다.
- 종료 요청 실패 또는 target 잔존 시 한 번 재시도하고 `/json` target 목록에서 제거 여부를 확인한다.
- 대상이 이미 없으면 `already_closed=true` 성공으로 처리한다.
- 기능 로그는 `[CDP탭종료][TC-01][체크시작/예외추적]`, `[TC-02][체크완료/체크실패]`로 남긴다.
- 일반 Chrome이나 전체 CDP Chrome 프로세스를 종료하지 않는다.
- 정적·단위 테스트는 OK이며 실제 오류/검은 탭 종료는 `[검증대기]`다.

- v281은 `/api/cdp/ig/install_lifecycle_preload`에서 YELLOW bootstrap target을 exact URL로 찾고 `Page.addScriptToEvaluateOnNewDocument`→`Runtime.evaluate` 순서로 수명주기 코드를 설치한다.
- 기본 정책은 관리 탭의 unload 등록만 차단하며 beforeunload/pagehide/visibilitychange는 추적한다.
- 기능 로그는 `[CDP수명주기][CL-01~03][체크시작/체크완료/체크실패]`로 남긴다.

- Auto8700은 WS8771, Analyze8780, RTC8790_8791의 총괄 관리자다.
- 서비스 시작·감시·재시작은 `auto8700-manager-worker`가 담당한다.
- Auto8700 종료 시 WS8771·RTC8790_8791은 종료하고 Analyze8780·Chrome/CDP는 유지한다.
- 전체 Tk UI는 main thread에서 생성·실행한다.
- Analyze8780 `/api/health`는 manager 기동 확인 시 1회만 호출한다.
- CDP 정상 판정은 8700 `/json/version`만으로 끝내지 않는다. Instagram page target과 `webSocketDebuggerUrl`, `Runtime.evaluate` 응답을 확인한다.
- Auto8700 `자동실행`과 `CDP모드 실행`은 전용 `D:\cdp-data-dir` Chrome을 실행하거나 기존 정상 Instagram 탭을 앞으로 표시한다.
- Instagram 탭 생성은 PUT `/json/new`를 우선하고 실패 시 browser `Target.createTarget`을 사용한다.
- 8700 포트는 열렸지만 Instagram Runtime이 없으면 `CDP:PORT`·`CDP 복구`로 표시한다.
- 복구 시 일반 Chrome은 종료하지 않고 Auto8700 전용 CDP user-data-dir 프로세스만 종료·재실행한다.
