예약은 세션 안에서 합니다. 두 입구가 있습니다. 대화 중 자연어로 부탁하면 에이전트가 schedule_job 도구로 작업을 만들고, 직접 제어하려면 /schedule 슬래시 명령을 씁니다. 셸에서 geode "..." 형태의 원샷 예약은 지원하지 않습니다. 만들어진 작업은 serve 데몬이 발화합니다.
자연어로 예약
geode > 평일 아침 9시마다 AI 뉴스 요약해서 알려줘
에이전트가 schedule_job 도구 (core/tools/definitions.json)를 호출해 일정 표현과 실행할 프롬프트를 분리해 등록합니다. 발화 시각이 되면 그 프롬프트가 새 에이전틱 실행으로 돌아갑니다.
/schedule로 직접 관리
일정 표현과 액션을 각각 따옴표로 감쌉니다. 액션이 없으면 작업이 만들어지지 않습니다. 발화해도 할 일이 없기 때문입니다 (core/cli/commands/schedule.py).
> /schedule # 작업 목록 + 템플릿 > /schedule create "daily at 9:00" "summarize today's AI news" > /schedule status <id> > /schedule disable <id> # 잠시 끄기 > /schedule enable <id> > /schedule run <id> # 지금 즉시 실행 > /schedule delete <id>
일정 표현은 NLScheduleParser(core/scheduler/nl_scheduler.py)가 LLM 호출 없이 규칙 기반으로 해석합니다.
| 패턴 | 예시 |
|---|---|
| 간격 | "every 5 minutes", "every 2 hours", "every 30s" |
| cron형 자연어 | "daily at 9:00", "weekly on monday", "hourly", "every weekday at 14:00" |
| 활동 시간대 | "every 5m during 09:00-22:00" |
| 작업 이름 지정 | "run analysis every 5m" → 이름이 analysis |
jitter와 실행 환경
같은 정각을 공유하는 작업이 한꺼번에 몰리지 않도록, 발화 시각에 작업 ID의 sha256에서 유도한 결정적 전방 오프셋이 더해집니다. 같은 작업은 항상 같은 오프셋, 다른 작업은 흩어집니다. 오프셋 상한은 간격의 10%와 15분 중 작은 값입니다 (core/scheduler/jitter.py). 발화된 작업은 SCHEDULER 모드 세션으로 돌아갑니다. wall-clock 300초 상한이 있고, 승인할 사용자가 없으므로 run_bash와 delegate_task는 차단됩니다 (core/server/supervised/services.py).
실패 모드
| 증상 | 원인 | 해법 |
|---|---|---|
| 예약 시각이 지나도 발화 안 됨 | serve 데몬이 꺼져 있음 | 스케줄러는 데몬 안에서 돕니다. pgrep -f "geode serve"로 확인하고 geode를 다시 실행합니다. |
| 작업이 만들어지지 않음 | 액션 누락 또는 따옴표 없는 인자 | /schedule create "일정" "액션" 두 인자를 모두 따옴표로 감쌉니다. |
| 정각보다 몇 분 늦게 발화 | 의도된 jitter | 정상입니다. thundering herd 방지를 위한 결정적 오프셋입니다. |
| 긴 작업이 도중에 끊김 | SCHEDULER 모드 300초 상한 | 작업을 더 작게 쪼개거나, 긴 조사는 세션에서 직접 실행합니다. |