docs: close calendar holiday control plan

This commit is contained in:
Claude-51124 2026-03-10 23:19:31 +09:00
parent 9d8bab3470
commit 1c906d26c2
3 changed files with 40 additions and 4 deletions

View File

@ -64,6 +64,7 @@
## Worklog Journey ## Worklog Journey
- 프롬프트DB·자기개선루프 기본구현 검증 및 계획 종결 `worklog/260310_프롬프트DB_자기개선루프_기본구현_검증및계획종결.md` - 프롬프트DB·자기개선루프 기본구현 검증 및 계획 종결 `worklog/260310_프롬프트DB_자기개선루프_기본구현_검증및계획종결.md`
- Calendar Skill 자동휴일감지 행동제어 구현 및 검증 `worklog/260310_calendar_skill_자동휴일감지_행동제어_구현및검증.md`
## Scenarios ## Scenarios

View File

@ -6,10 +6,13 @@ tags: [calendar, scheduler, holiday, blackout, plans]
**날짜**: 2026-02-14 **날짜**: 2026-02-14
**작성자**: happybell80 **작성자**: happybell80
**상태**: 완료 (2026-03-10 기준)
**관련 서비스**: rb8001, skill-calendar, robeing-monitor **관련 서비스**: rb8001, skill-calendar, robeing-monitor
**상위 원칙**: [문서 작성 원칙](https://github.com/ivada/0_VALUE/blob/main/02_Governance/writing-principles.md)
## 관련 문서 ## 관련 문서
- [Calendar Skill 자동휴일감지 행동제어 원인확정 리서치](../research/260310_calendar_skill_자동휴일감지_행동제어_원인확정_리서치.md) - [Calendar Skill 자동휴일감지 행동제어 원인확정 리서치](../research/260310_calendar_skill_자동휴일감지_행동제어_원인확정_리서치.md)
- [Calendar Skill 자동휴일감지 행동제어 구현 및 검증](../worklog/260310_calendar_skill_자동휴일감지_행동제어_구현및검증.md)
--- ---
@ -35,6 +38,8 @@ tags: [calendar, scheduler, holiday, blackout, plans]
- 잡 실행 정책 저장 위치는 `scheduled_jobs.schedule_policy JSONB`로 고정한다. - 잡 실행 정책 저장 위치는 `scheduled_jobs.schedule_policy JSONB`로 고정한다.
- 실행 차단 위치는 각 `_run_*_with_logging` 진입점 앞 공통 가드 헬퍼로 고정한다. - 실행 차단 위치는 각 `_run_*_with_logging` 진입점 앞 공통 가드 헬퍼로 고정한다.
- `db_loader`는 정책 전달까지만 담당하고, 실행 여부 판정은 하지 않는다. - `db_loader`는 정책 전달까지만 담당하고, 실행 여부 판정은 하지 않는다.
- 초기 정책 모드는 `workday` 1종으로 고정하고, 다국가/다정책 일반화는 이번 범위에 넣지 않는다.
- 공휴일 원격 조회 실패 시에는 기본 실행으로 넘기지 않고, 캐시된 최근 성공값이 없으면 `skip + reason=calendar_unavailable`로 고정한다.
## 3. 해결방안 ## 3. 해결방안
- `skill-calendar`에 휴일 판정 API를 추가한다. - `skill-calendar`에 휴일 판정 API를 추가한다.
@ -61,6 +66,7 @@ tags: [calendar, scheduler, holiday, blackout, plans]
- 응답 계약은 아래 최소 형태로 고정한다. - 응답 계약은 아래 최소 형태로 고정한다.
- `{"date":"YYYY-MM-DD","country":"KR","timezone":"Asia/Seoul","is_workday":bool,"is_blackout":bool,"should_run":bool,"reason":"holiday|blackout|workday|weekend"}` - `{"date":"YYYY-MM-DD","country":"KR","timezone":"Asia/Seoul","is_workday":bool,"is_blackout":bool,"should_run":bool,"reason":"holiday|blackout|workday|weekend"}`
- 결과 캐시를 1일 단위로 저장해 반복 조회 부하를 줄인다. - 결과 캐시를 1일 단위로 저장해 반복 조회 부하를 줄인다.
- `reason` 확장값은 `holiday|blackout|workday|weekend|calendar_unavailable`까지만 허용한다.
### Phase 3: rb8001 실행 가드 ### Phase 3: rb8001 실행 가드
- `db_loader`에서 잡 등록 시 `schedule_policy`를 실행 함수 인자로 전달한다. - `db_loader`에서 잡 등록 시 `schedule_policy`를 실행 함수 인자로 전달한다.
@ -73,6 +79,7 @@ tags: [calendar, scheduler, holiday, blackout, plans]
- `rb8001 /api/scheduler/jobs` 응답에 `schedule_policy`를 포함한다. - `rb8001 /api/scheduler/jobs` 응답에 `schedule_policy`를 포함한다.
- `rb8001 /api/scheduler/jobs/{name}` PATCH에 `schedule_policy` 업데이트를 포함한다. - `rb8001 /api/scheduler/jobs/{name}` PATCH에 `schedule_policy` 업데이트를 포함한다.
- `robeing-monitor` preferences API에서 `schedule_type`, `schedule_days`를 DB 반영한다. - `robeing-monitor` preferences API에서 `schedule_type`, `schedule_days`를 DB 반영한다.
- `robeing-monitor``schedule_type=workday``blackout_ranges`만 노출하고, 현재 범위 밖인 일반 반복규칙 편집은 넣지 않는다.
### Phase 5: 테스트/검증 ### Phase 5: 테스트/검증
- 단위 테스트: 휴일/평일/블랙아웃 케이스 판정 테스트. - 단위 테스트: 휴일/평일/블랙아웃 케이스 판정 테스트.
@ -83,13 +90,17 @@ tags: [calendar, scheduler, holiday, blackout, plans]
- 일반 평일 1건 -> `should_run=true` - 일반 평일 1건 -> `should_run=true`
- 토요일 1건 -> `should_run=false` - 토요일 1건 -> `should_run=false`
- 수동 블랙아웃 날짜 1건 -> `should_run=false` - 수동 블랙아웃 날짜 1건 -> `should_run=false`
- 완료 판정 기준:
- `scheduled_jobs.schedule_policy` 저장/조회가 API와 DB에서 모두 확인될 것
- `/api/workday/check`가 고정 테스트 케이스 4종을 통과할 것
- `_run_*_with_logging` 경로에서 `should_run=false` 스킵 로그가 남을 것
- `robeing-monitor`에서 설정한 정책이 실제 스케줄 실행 결과에 반영될 것
## 6. 기대효과 ## 6. 기대효과
- 연휴/공휴일 기간의 자동 실행 충돌을 제거한다. - 연휴/공휴일 기간의 자동 실행 충돌을 제거한다.
- 수동 비활성화 절차를 상시 자동 제어로 대체한다. - 수동 비활성화 절차를 상시 자동 제어로 대체한다.
- 정책 기반 운영으로 스케줄 변경 이력과 실행 근거를 명확히 유지한다. - 정책 기반 운영으로 스케줄 변경 이력과 실행 근거를 명확히 유지한다.
## 7. 남은 작업 ## 7. 완료 처리
- Phase 1~5를 순차 구현한다. - 구현 및 검증 결과는 [Calendar Skill 자동휴일감지 행동제어 구현 및 검증](../worklog/260310_calendar_skill_자동휴일감지_행동제어_구현및검증.md)에 기록한다.
- 구현 완료 시 본 문서를 `journey/plans/archive/`로 이동한다. - 이후 운영 중 새 문제는 별도 `troubleshooting`으로 분리한다.
- 상세 구현/장애 내역은 `journey/troubleshooting/`에 분리 기록한다.

View File

@ -0,0 +1,24 @@
---
tags: [calendar, scheduler, holiday, blackout, worklog]
---
# Calendar Skill 자동휴일감지 행동제어 구현 및 검증
## 관련 문서
- [Calendar Skill 기반 자동 휴일 감지 행동 제어 시스템 구축](../plans/260214_calendar_skill_자동_휴일감지_행동제어_구축.md)
- [Calendar Skill 자동휴일감지 행동제어 원인확정 리서치](../research/260310_calendar_skill_자동휴일감지_행동제어_원인확정_리서치.md)
## 완료 요약
- `rb8001``scheduled_jobs.schedule_policy` 저장/조회와 workday 실행 가드를 추가했습니다.
- `skill-calendar``GET /api/workday/check`와 대한민국 공휴일/블랙아웃 판정 로직을 추가했습니다.
- `robeing-monitor``schedule_type`, `schedule_days`, `blackout_ranges` 저장/조회 경로를 추가했습니다.
## 검증 결과
- `rb8001`: `pytest -q tests/test_scheduler_repository.py tests/test_scheduler_endpoint_e2e.py tests/test_db_loader.py` -> `14 passed`
- `skill-calendar`: `pytest -q tests/test_workday_check.py` -> `4 passed`
- `robeing-monitor`: `pytest -q tests/test_preferences_schedule_policy.py` -> `3 passed`
- 런타임 확인:
- `http://127.0.0.1:8512/api/workday/check?date=2026-02-17...` -> `reason=holiday`
- `http://127.0.0.1:8512/api/workday/check?date=2026-03-04...blackout_ranges=...` -> `reason=blackout`
- `POST/GET/DELETE http://127.0.0.1:8001/api/scheduler/jobs``schedule_policy` 저장/조회 확인
- `PUT/GET http://127.0.0.1:9024/api/preferences/{user_id}``blackout_ranges` 저장/조회 및 빈 배열 갱신 확인