### 기능 체크형 로그·단계별 작업 운영 원칙

#### 1. 로그 목적

- 로그는 상세 실행 내용을 계속 누적하는 용도로 사용하지 않는다.
- 기능별 체크리스트가 어디까지 실행됐는지 확인하는 용도로 사용한다.
- 사용자가 해당 기능 로그만 전달해도 다음 단계 진행 가능 여부와 실패 지점을 판단할 수 있어야 한다.
- 기능명, 체크 항목, 결과, 오류 원인은 한국어를 우선한다.

#### 2. 로그 상태값

`[체크시작]` `[체크완료]` `[체크실패]` `[예외추적]` `[복구완료]`

- `[체크시작]`: 실제 단계 진입 시 한 번 기록한다.
- `[체크완료]`: 실제 결과 확인 시 한 번 기록한다.
- `[체크실패]`: 완료 조건을 충족하지 못했을 때 기록한다.
- `[예외추적]`: 기존 항목만으로 원인을 확인할 수 없을 때 실패 항목 아래에 임시 세부 점검을 추가한다.
- `[복구완료]`: 실패했던 기능이 실제 정상 복구됐을 때 기록한다.

#### 3. 로그 형식

`[기능명][체크ID][상태] 한국어 체크 내용 / 핵심 결과`

예시:

`[자동다운로드][AD-01][체크시작] 자동 시작 상태 확인`
`[자동다운로드][AD-01][체크완료] 자동 시작 활성화`
`[자동다운로드][AD-02][체크완료] 대상=No003 계정=4eu_pick`
`[자동다운로드][AD-03][체크실패] 원본 미디어 URL 없음 / blocking=true / 다음점검=게시물 데이터 추출`

#### 4. 중복 로그 방지

- 같은 실행에서 같은 기능, 체크 ID, 결과는 한 번만 기록한다.
- 상태 또는 핵심 값이 변경될 때만 다시 기록한다.
- 정상 health, 대기, 감시 상태를 초 단위 또는 짧은 주기로 반복 기록하지 않는다.
- 동일 오류는 최초 한 번만 기록하고 반복 횟수는 복구 또는 실행 종료 시 한 줄로 요약한다.
- 반복 작업은 `cycle_id`를 사용하며 같은 cycle 안에서는 같은 체크 결과를 중복 기록하지 않는다.

#### 5. 단계 진행 기준

- 체크 항목마다 후속 단계 의존 여부를 `blocking=true` 또는 `blocking=false`로 구분한다.
- `blocking=true` 실패 시 그 실패에 의존하는 후속 단계만 중단한다.
- `blocking=false` 실패 시 `다음단계=독립처리계속 / 실패항목=별도추적`으로 기록하고 독립 단계는 계속한다.
- 실패 이후 의존 단계를 성공처럼 기록하지 않는다.
- 코드 존재와 실제 정상동작을 구분한다.
- 실제 필요한 실행 로그와 `test_*` 결과가 모두 OK일 때만 완료로 기록한다.

#### 6. 예외 추적 기준

- 처음부터 모든 상세 디버그 로그를 추가하지 않는다.
- 실패한 체크 항목에만 `AD-03-E01` 같은 예외 추적 ID를 추가한다.
- 원인이 해결되면 임시 예외 로그 유지 필요성을 검토하고 불필요하면 제거한다.

#### 7. ai_read 문서 연결

- `ai_read.md`: 현재 기능별 전체 체크리스트와 단계 진행 기준
- `ai_read_패치.md`: 현재 실패 체크 ID, 예외추적 항목, 다음 작업
- `ai_read_완료.md`: 실제 테스트와 실행 로그로 완료된 체크 ID
- `ai_read_삭제.md`: 반복 로그, 폐기 체크, 다시 사용하면 안 되는 진단 방식
- `test_list.md`: 체크 ID와 테스트 ID 대응, 상태, 결과, 실패 원인, 다음 작업

#### 8. 새 기능 작업 순서

1. 기능별 한국어 체크리스트 작성
2. 체크 ID별 시작·완료·blocking 조건 정의
3. 필요한 최소 로그 구현
4. 실행 로그로 진행 위치 확인
5. 실패 항목만 예외 추적
6. 의존 체크 완료 뒤 다음 의존 단계 진행
7. 실제 로그가 없는 기능은 `[검증대기]` 유지

#### 9. 금지 사항

- 같은 정상 상태 반복 출력
- 코드 존재만으로 `[체크완료]` 기록
- 실제 결과 없이 완료 표시
- 내부 함수명과 원시 데이터 대량 출력
- 실패 지점과 무관한 전체 디버그 로그 상시 활성화
- 예외 없는 상태의 상세 추적 로그 상시 유지
- `blocking=false` 실패 때문에 독립적인 정상 처리까지 중단하는 방식
- `blocking=true` 실패 뒤 의존 단계를 성공으로 표시하는 방식
