b3os-schedulerlisted
Install: claude install-skill b3rys/b3rys-team-os
# b3os-scheduler — b3os durable 스케줄러
팀원이 **세션과 무관하게(durable) 시각에 맞춰 발화하는 반복/예약 잡**을 등록하는 절차 스킬이다. 런타임별 세션 cron(claude `CronCreate`, openclaw/hermes 자체 예약)은 **그 세션이 죽으면 유실**된다. 팀 정본 반복작업(야간 사이클·주기 리마인드·정기 점검)은 이 스케줄러에 등록해 `team.db`에 durable 저장하고, b3os 서버 안의 워커가 발화한다.
## 언��� 쓰나
- "매일 03:04에 X 해라", "평일 09시에 Y 깨워라", "매월 1일 리포트" 같은 **반복 잡**을 durable하게 걸 때
- "N분 뒤 나한테 알려줘" 같은 **1회성 리마인드**를 턴에서 sleep 없이 예약할 때 (dex/에이전트 in-turn sleep 금지)
- 세션 죽어도 살아남아야 하는 팀 정본 스케줄을 등록/이관할 때
- launchd per-job 플리스트를 durable 스케줄러 잡으로 이관할 때
세션 한정 임시 점검(몇 분 뒤 한 번 확인)은 런타임 세션 cron으로도 충분하다 — 이 스킬은 **유실되면 안 되는** 잡에 쓴다.
**`b3os-task-loop`(작업루프)과 구분**: workloop = 정해진 코디네이터 루프(매일 칸반 PM·주간 self-learning 등 고정 프로그램)를 깨우는 기본 인프라. scheduler(이 스킬) = **임의의 durable 반복·예약 잡**을 자유롭게 등록하는 범용 도구. workloop의 스케줄 자체도 이 스케줄러로 이관 가능(launchd per-job → scheduled_job).
## 개념 (실제 구현)
- **정본 저장**: `team.db`의 `scheduled_job` 테이블 (id·kind·schedule_kind·next_run_at(UTC)·schedule_expr·payload_json·enabled·lock_until…). 실행 이력=`scheduled_job_run`.
- **워커**: b3os 서버가 `startSchedulerWorker`로 틱마다(기본 60초, env `B3OS_SCHEDULER_INTERVAL_MS`로 조정·최소 5초) `next_run_at<=now`인 잡을 lease-claim → 발화 → 재계산. 코드=`src/server/scheduler/core.ts`(`runDueSchedulerJobsOnce`)·`workers/schedulerWorker.ts`.
- **발화 = 2종 페이로드**: ①`inbox` — `payload_json`의 인박스 봉투를 `acceptInbound`로 삽입(실제 wake/라우팅은 wakeDispatcher, 신규 라우팅 0). ②`exec` — allowlist된 ops 스크립트를 spawn(에이전트 안 깨우고 결정적 작업 직접 수행, 옛 launchd 대체). inbox는 emit+재계산이 단일 트랜잭션(at-most-once), exec는 async라 실행 후 재계산(at-