# 현재 패치 상태 — 패키지 v225

## `[코드반영·자동검증 완료]` 이번 단일 목표

### IG_StYellow

- 전체 다운로드는 `BULK_ALL`을 전달한다.
- 필터 다운로드는 `BULK_FILTERED`를 전달한다.
- Top sorted 자동 다운로드는 `TOP_SORTED`를 전달한다.
- 카드 개별 다운로드는 `MANUAL_SINGLE`을 전달한다.
- 대본 요청용 `TRANSCRIPT_REQUEST` 값은 구조상 유지하며 실제 호출 연결은 후속이다.
- 각 파일에 `client_batch_key`, `client_job_key`, `client_event_id`, `batch_requested_count`를 전달한다.
- 수동 캐러셀은 파일마다 별도 batch를 만들지 않고 한 번의 클릭 단위 batch를 공유한다.
- 중단 후 재개 시 같은 bulk queue와 batch key를 유지한다.

### WS8771

파일 완료 처리 순서:

```text
파일 존재 확인
→ MD5/SHA-256/크기 계산
→ sidecar .md5
→ 계정 JSON 갱신
→ ECharts HTML 갱신
→ Shared record_downloaded_file()
→ 기존 yellow.php media_insert 요청
```

- Shared 실패는 `MEDIA_SAVED_FAIL` 로그와 `storage_ok=false`로 반환한다.
- WS 알림 예외도 화면에서 `partial`로 표시하며 성공으로 숨기지 않는다.
- 파일·JSON·보고서가 생성됐더라도 Shared 실패를 전체 성공으로 위장하지 않는다.

### Shared/storage

- 실제 파일 경로에서 로컬 저장 루트를 판정한다.
- `_StDown/instagram` 아래면 기본 루트를 사용한다.
- 기존 Chrome 다운로드 루트면 로컬 전용 storage root를 추가 등록하고 파일을 이동하지 않는다.
- 계정·게시물·최신 통계·통계 이력을 upsert한다.
- batch/job을 client key 기준으로 멱등 연결한다.
- 요청 파일 수가 모두 끝나기 전 batch는 `RUNNING`, 모두 끝나면 `COMPLETE`다.
- 동일 event 재전송은 event와 sync_queue를 중복 생성하지 않는다.
- 서버용 sync payload에는 로컬 경로를 넣지 않는다.

### MySQL

- v225에서 추가 스키마 변경은 없다.
- 기존 `migration_v45_from_yellow_v44.sql`과 `migration_v46_media_saved_flow.sql`을 그대로 사용한다.
- 실제 PHP 수신 API와 운영 DB 적용은 아직 하지 않았다.

## `[검증대기]` 실제 Windows

- 카드 개별 MP4/JPG 다운로드 후 `MANUAL_SINGLE` 기록
- Down all medias 후 같은 batch의 파일 수·완료 상태 확인
- Down filtered medias 후 `BULK_FILTERED` 기록
- Top sorted 자동 후 `TOP_SORTED` 기록
- Chrome 다운로드 경로가 기존 루트일 때 local storage root 등록 확인
- JSON·ECharts·SQLite·기존 yellow 요청 순서 확인

## 다음 단일 목표

로컬 계정·게시물·통계 repository와 LIMIT/OFFSET 또는 cursor 기반 페이지 조회를 구현한다.

## 다음 목표에서 제외

- 운영 MySQL 적용
- 회원·그룹 UI
- P2P
- 포인트
- Whisper·후킹 UI
