NxtCloud NxtCloud Workshop / AI 에이전트 크루 실습
로그인

Lab 06: 반복 작업을 예약한다

Lab 06: 반복 작업을 예약한다

이 Lab을 마치면 이런 결과물이 남습니다.

자동 승인으로 실행되어 재고 부족을 발견한 보고
무인 실행에서 실제 재고 수치와 재고 부족을 확인한 보고
이 실습의 핵심 질문

사람이 없는 시각에 에이전트가 실행될 때, 도구 승인은 누가 하고 성공과 실패는 어디서 확인하는가?

지금까지 모든 실행은 사람이 시작했습니다. 이번에는 반복 일정을 걸어 시간이 실행을 시작하게 만듭니다. 스케줄 잡은 채팅으로 만들고, Schedule 화면에서 관리합니다. 사람이 승인을 눌러줄 수 없는 실행에서 무슨 일이 생기는지도 두 Approval 정책으로 비교합니다.

학습 목표
  • 스케줄 잡을 채팅으로 만들고 화면에서 관리합니다.
  • Add Job 폼의 필드와 운영 옵션을 읽고 각 의미를 확인합니다.
  • 예약(scheduled) 실행과 수동(manual) 실행을 이력에서 구분합니다.
  • 무인 실행의 도구 승인 문제를 Default와 Auto-approve로 비교 실험합니다.
  • List · Calendar · Executions · Logs 화면의 용도를 구분합니다.
시작 조건

이 실습은 주로 Schedule 화면에서 진행합니다. 잡 생성은 채팅으로 하므로 공통 준비의 세션 연결도 필요합니다.

□ Gateway가 실행 중이고 대시보드에 접속해 있다
□ Schedule 화면이  No scheduled jobs yet
□ Git 작업 트리에 수정(M)이 없다

번역: No scheduled jobs yet은 아직 예약된 작업이 없다는 뜻입니다.

이 실습의 잡은 2분 간격으로 반복됩니다. 관찰이 끝나면 반드시 Pause합니다. 그대로 두면 몇 분마다 실행이 반복됩니다.

5단계의 성공 결과는 Lab 1의 실습 데이터(labs/01-agent-creation/store)를 읽습니다. Lab 1을 마친 hands-on 클론이 있어야 같은 결말이 나옵니다.

실행 한 번이 수십 초에서 수 분 걸릴 수 있습니다. 기다리는 동안 화면별 역할과 실행 상태를 관찰합니다.


Step 1: 빈 스케줄과 프리셋을 본다

Schedule을 엽니다. 빈 화면에 두 가지 생성 경로가 안내됩니다.

[+ Create your first job]     or ask in chat — try "remind me to check my pipeline every morning"

번역: 첫 잡을 만들거나, 채팅에서 요청하세요 — “매일 아침 파이프라인을 확인하라고 알려 줘”처럼.

빈 Schedule 화면과 프리셋 카드
두 가지 잡 생성 경로와 반복 작업 프리셋

UI 폼과 채팅, 두 경로가 있습니다. 이 실습에서는 폼은 읽는 데 쓰고, 만드는 것은 채팅으로 합니다. 폼의 실행 동작은 2단계에서 한 줄로만 확인하고, 실제 잡은 cron_add로 만듭니다.

프리셋 카드(Dependency Guardian, Nightly Build Watch, Error Digest, Standup Brief)는 스케줄의 대표 용도를 보여 줍니다 — 주간 점검, 야간 빌드, 오류 요약, 스탠드업 브리핑. 카드마다 주기(Weekly · Mondays 6:00am, Every 24 hours · 2:00am)가 붙어 있습니다. 전부 사람이 없는 시각의 반복 작업입니다.

🎯 체크포인트
  • Schedule 화면에서 UI 폼과 채팅이라는 두 생성 경로를 확인했습니다.
  • 프리셋 카드와 반복 주기 표시를 확인했습니다.
Step 2: Add Job 폼을 읽는다

Add Job을 눌러 폼을 엽니다. 만들지는 않고 읽기만 합니다.

New Job 패널
잡을 만들 때 입력하는 기본 필드

기본 필드는 다섯입니다 — Name(이름), Message(발화 시 에이전트에게 가는 프롬프트), Schedule(Every interval · Weekly schedule · Cron expression 세 방식), Agent, Model.

아래로 내리면 운영 옵션이 더 있습니다.

Add Job 폼 하단 운영 옵션
Approval, Silent mode, Strict schedule, Hide in chat 옵션
옵션의미
Approval실행 중 도구 호출을 어떻게 승인할지 — 이 랩의 핵심 실험 대상
Silent mode자동 메시지 전달을 끄고 에이전트가 알릴 때만 알림
Strict schedule정시 엄수. 기본은 트래픽 분산을 위해 발화 시각을 무작위로 흩뿌림
Hide in chat실행 세션을 세션 목록에서 숨김 — 요약·정리 같은 fire-and-forget 잡용

Approval 드롭다운을 열어 봅니다.

Approval 선택지
Default와 Auto-approve Approval 정책
Default
Auto-approve

번역: Default는 도구 호출마다 승인을 기다리고, Auto-approve는 묻지 않고 실행합니다.

무인 실행에서 이 차이가 무엇을 만드는지는 5단계에서 실험합니다. 폼을 닫습니다.

이 버전에서는 폼으로 만든 잡의 실행이 실패합니다 — 폼이 기록하는 Agent 지정 값을 실행기가 해석하지 못하기 때문입니다. 이 실습에서는 그 사실만 확인하고, 잡 생성과 실행은 채팅 경로로 진행합니다.

🎯 체크포인트
  • Name·Message·Schedule·Agent·Model 필드의 의미를 확인했습니다.
  • Approval·Silent mode·Strict schedule·Hide in chat의 의미를 확인했습니다.
  • DefaultAuto-approve의 차이를 확인하고 폼을 닫았습니다.
Step 3: 채팅으로 잡을 만든다

아무 세션에서 입력합니다.

cron_add를 사용해 2분마다 실행되는 "NXT 아침 재고 점검" 작업을 만들어 줘.
내용은 "재고 점검 보고를 해 줘. 데이터가 없으면 없다는 사실만 보고한다."로 한다.
채팅으로 잡을 생성하는 요청
cron_add로 2분 간격 잡을 만드는 채팅 요청

에이전트가 cron_add 도구를 로드해 잡을 만듭니다. @kirocrew-cron 도구들은 자동 승인 목록에 있어 승인 카드 없이 진행됩니다.

채팅 잡 생성 진행 단계
cron_add 요청을 처리하는 생성 단계

Message에 넣은 문장을 봐 둡니다 — “데이터가 없으면 없다는 사실만 보고한다”. Lab 4에서 배운 방어선을 무인 실행에도 건 것입니다. 이 한 줄이 5단계에서 일합니다.

Schedule 화면의 List 뷰로 돌아오면 잡이 보입니다 — Ready, NEXT RUN에 카운트다운이 표시됩니다. 시간이 이 작업의 시작 버튼입니다.

만든 직후 채팅에서 cron_trigger로 바로 실행하면 Job not found가 날 수 있습니다 — 실행 중인 스케줄러가 새 잡을 아직 메모리에 올리지 못한 동기화 지연입니다. 잠시 뒤에는 정상 동작합니다.

🎯 체크포인트
  • cron_add를 사용해 NXT 아침 재고 점검 잡을 만들었습니다.
  • Message에 데이터가 없을 때 추측하지 않는 방어선을 넣었습니다.
  • List 뷰에서 ReadyNEXT RUN 카운트다운을 확인했습니다.
  • Job not found가 발생할 수 있는 동기화 지연을 참고로 확인했습니다.
Step 4: 시간이 실행을 시작한다

2분 안에 예약 발화가 옵니다 — 정해진 시각이 되어 Message가 에이전트에게 전달되는 것입니다.

이번에는 승인을 누르지 않습니다. 실행 중 알림 패널이나 세션에 승인 요청이 떠도 그대로 둡니다. Lab 5에서는 눌러서 진행시켰지만, 이 실습의 관찰 대상은 사람이 자리에 없는 무인 실행입니다.

기다리는 동안 실행이 어디에 보이는지 확인해 둡니다.

예약 실행 중인 잡과 NEXT RUN now 표시
예약 발화가 시작되어 NEXT RUN이 now가 된 상태
Logs 탭의 진행 중 실행
Logs에서 진행 중 실행의 경과 시간을 확인하는 모습

실행이 끝나면 Executions에 기록이 생깁니다. TRIGGER 컬럼을 봅니다 — 예약 발화는 scheduled, 사람이 Run 또는 Run Now를 누른 것은 manual로 구분됩니다.

예약 실행 완료 기록
Executions에 남은 scheduled 실행 기록

실행 기록에는 cron-history 감사 정보도 남습니다. 진행 중인 실행은 Logs, 끝난 실행은 Executions에서 확인한다는 구분을 기억합니다.

🎯 체크포인트
  • List에서 실행 중인 잡의 상태 변화를 확인했습니다.
  • 진행 중 실행은 Logs에서 확인했습니다.
  • 완료된 실행이 Executions에 기록되는 것을 확인했습니다.
  • TRIGGER에서 scheduledmanual을 구분했습니다.
Step 5: 무인 실행의 승인 문제를 비교 실험한다 ★★

예약 실행 결과를 열어 보면 상태는 OK인데 6분 넘게 걸렸고, 재고 수치가 없습니다. 요약을 읽습니다.

- 이번 실행에서 재고 파일 접근을 두 가지 방법으로 시도했으나 모두 거부되었습니다.
- 따라서 재고 데이터는 이번 세션에서 검증하지 못했습니다.
- "데이터 없음"이 아니라 "접근 거부로 확인 불가" 상태입니다 — 이 둘은 다릅니다.
접근 거부 상태를 정확히 보고한 예약 실행
데이터 없음과 접근 거부로 확인 불가를 구분한 보고

원인은 Approval: Default입니다. 무인 실행도 도구를 쓰려면 승인이 필요한데, 승인을 눌러줄 사람이 없습니다. 에이전트는 파일 읽기를 두 번 시도했고, 두 번 다 거부된 채로 남은 것으로 확인된 사실만 보고했습니다.

Message의 방어선도 확인합니다. 추측으로 재고 수치를 만들지 않았고, “데이터 없음”과 “확인 불가”를 구분해 보고했습니다. 실패한 실행이 아니라, 할 수 없었던 것을 정확히 말한 실행입니다.

이제 승인 정책을 바꿔 다시 실행합니다. 잡 상세 Details 탭에서 ApprovalAuto-approve로 바꾸고 SaveRun Now를 누릅니다.

Approval을 Auto-approve로 변경한 잡 상세
잡 상세에서 Approval을 Auto-approve로 변경

이번에는 파일을 읽었고, 실제 수치가 나왔고, 재고 부족까지 발견했습니다.

- store 폴더의 재고 파일 2개(inventory-status.md, orders-today.md)를 정상적으로 읽었습니다.
- 품목별 총재고는 mug 17, bottle 12, hub 13, sensor 11, cable 1이며,
  오늘 주문 5건 중 ORD-1043(cable 2개)이 재고(1개) 부족입니다.

같은 잡, 같은 Message로 두 실행을 이력에서 나란히 봅니다.

Approval소요결과
Default399초승인을 기다리다 거부 — 접근 불가를 보고
Auto-approve39.8초파일을 읽고 재고 부족 발견

같은 잡, 같은 Message였습니다. Default는 승인 대기가 병목이 되어 느리고 확인을 못 한 채 끝날 수 있고, Auto-approve는 빠르지만 도구 사용을 묻지 않습니다. 무인 실행을 만들 때는 이 선택을 잡마다 정해야 합니다.

이 실습의 핵심 결론입니다. 스케줄 등록은 절반입니다. 나머지 절반은 첫 실행의 확인 — 트리거가 무엇이었고, 승인은 어떻게 처리됐고, 결과가 확인된 사실인지 확인 불가였는지까지 확인하는 것입니다. Default 실행은 승인 대기로 느려지고 확인 불가로 끝날 수 있고, Auto-approve 실행은 빠르지만 도구 사용을 묻지 않습니다.

🎯 체크포인트
  • Default 실행에서 접근 거부와 “확인 불가” 보고를 확인했습니다.
  • Auto-approve로 바꾸고 수동 실행(manual)을 수행했습니다.
  • 실제 재고 수치와 ORD-1043 재고 부족을 확인했습니다.
  • 두 실행의 소요 시간과 결과 차이를 확인했습니다.
Step 6: 네 가지 화면의 역할과 타임존을 구분한다
화면무엇을 보는가언제 쓰는가
List등록된 잡과 다음 실행 시각잡 관리 — Pause, Run, Delete
Calendar미래 실행 예정일정·빈도와 타임존 검토
Executions완료된 실행 결과상태, 소요 시간, 트리거, 결과 확인
Logs진행 중 실행현재 실행의 단계와 경과 시간 확인

Calendar 뷰로 전환합니다.

주간 Calendar 뷰
주간 그리드에서 미래 실행 예정과 타임존을 확인하는 Calendar 뷰

주간 그리드에 미래 실행 예정이 점으로 찍혀 있습니다. 상단의 타임존 선택(Render in Asia/Seoul (UTC+9))도 확인합니다. 분산된 팀이라면 “아침 9시”가 누구의 아침인지가 여기서 정해집니다.

🎯 체크포인트
  • Logs·Executions·Calendar·List의 역할을 표로 구분했습니다.
  • Calendar에서 미래 실행 예정과 타임존(Asia/Seoul, UTC+9)을 확인했습니다.
Step 7: 정리하고 감사 기록을 확인한다

반복 잡은 자동으로 사라지지 않습니다. 관찰이 끝나면 List 뷰에서 실습 잡을 Pause합니다. 이력을 남겨두고 싶으면 Pause로 충분하고, 완전히 지우려면 Delete합니다.

터미널에서 잡을 확인합니다.

kirocrew cron list

잡을 삭제한 경우에도 Executions 이력과 실행 기록 파일(~/.kiro/crew/cron-history/)은 남습니다. 이는 잡을 지워도 보존되는 감사 기록이므로 정상입니다.

cron-history에는 어떤 잡이 언제 실행되었고 어떤 트리거와 결과를 남겼는지 확인할 근거가 있습니다. 스케줄 운영은 잡을 등록하는 데서 끝나지 않고, 이 기록을 확인하는 데서 완성됩니다.

마지막 Lab 7은 무인 실행이 열어준 것 위에서 사람이 내려야 하는 결정을 다룹니다.

🎯 체크포인트
  • 실습 잡을 Pause하거나 Delete했습니다.
  • kirocrew cron list로 현재 잡 상태를 확인했습니다.
  • Executions~/.kiro/crew/cron-history/가 감사 기록으로 남는 것을 확인했습니다.
성공 조건
  • Add Job 폼의 필드와 옵션 4종(Approval·Silent mode·Strict schedule·Hide in chat)을 읽었습니다.
  • 채팅(cron_add)으로 2분 간격 잡을 만들었습니다.
  • 예약 발화를 관찰하고 Logs(진행 중)와 Executions(완료)의 역할을 구분했습니다.
  • TRIGGER 컬럼에서 scheduledmanual을 구분했습니다.
  • Default 실행에서 승인 거부와 “확인 불가” 보고를 확인했습니다.
  • Auto-approve로 바꿔 실제 수치와 재고 부족, 소요 시간 차이를 확인했습니다.
  • Pause 또는 Deletekirocrew cron list와 감사 기록을 확인했습니다.
실패를 학습 기회로 사용하는 방법
증상먼저 확인할 항목
만든 직후 트리거가 Job not found정상일 수 있습니다 — 스케줄러 반영 전 동기화 지연이므로 잠시 뒤 다시 시도합니다.
실행이 몇 분씩 걸림Approval: Default의 승인 대기입니다 — 5단계의 비교 대상입니다.
진행 중인데 Executions가 비어 있음Executions는 완료 기록입니다 — 진행 중은 잡 상세의 Logs 탭에서 확인합니다.
폼으로 만든 잡의 실행이 실패함이 버전에서는 Agent 지정 값을 실행기가 해석하지 못합니다 — 이 실습은 채팅(cron_add) 경로로 진행합니다.
잡을 지웠는데 이력이 남아 있음정상입니다 — 실행 이력은 cron-history 감사 기록으로 유지됩니다.
핵심 정리

스케줄은 시간을 시작 버튼으로 만듭니다. 등록이 아니라 첫 실행의 확인까지가 설정입니다.

무인 실행의 도구 승인은 잡마다 정하는 선택입니다 — Default는 승인을 기다리다 확인 불가로 끝날 수 있고, Auto-approve는 빠르지만 묻지 않습니다.

진행 중은 Logs에, 완료는 Executions에, 미래는 Calendar에, 관리는 List에 있습니다. 이력을 보는 습관이 없으면 실패가 조용히 반복됩니다.

확장 — 설정 파일에서 설계를 읽는다

지금까지 대시보드에서 바꾼 설정은 전부 한 파일에 모입니다. 홈 디렉터리의 ~/.kiro/crew/config.json을 편집기로 열어봅니다. 수정하지 말고 읽기만 합니다.

400줄 가까운 파일이지만 키를 하나씩 외울 필요는 없습니다. 이 파일에서 볼 것은 이 도구를 만든 팀이 무엇을 걱정했는가입니다. 우리가 에이전트가 들어간 서비스를 만들 때 똑같이 정해야 하는 것들이라, 남의 설계도를 미리 보는 셈입니다. 아래는 발췌입니다 — 여러분의 파일은 값이 다를 수 있습니다. 지금까지 실습하며 대시보드에서 바꾼 설정이 이 파일에 쌓여 있기 때문입니다.

위험한 기능은 기본값이 꺼져 있고, 이름에 경고가 들어 있습니다.

"dangerously_skip_permissions": false,
"apps_allow_third_party": false,
"yolo_duration": "6h"

승인을 통째로 끄는 키에는 dangerously_ 접두사가 붙어 있습니다. 파일을 열어본 사람이 이름만 보고도 한 번 멈추게 만든 것입니다. 전체 신뢰(yolo)조차 무기한이 아니라 6시간 뒤 만료됩니다. 위험한 스위치를 만들 수는 있지만, 켜기 어렵게 하고 켜져 있는 시간을 제한합니다.

무인 실행에는 자원 한도가 붙어 있습니다.

"subagent_timeout_secs": 1800,
"subagent_stall_idle_secs": 120,
"resource_critical_gb": 2.0

사람이 지켜보는 채팅과 달리, 예약 실행이나 서브에이전트는 잘못 돌아가도 멈춰줄 사람이 없습니다. 그래서 시간 초과, 멈춤 감지, 메모리 하한 같은 한도가 설정에 들어가 있습니다.

외부 채널은 기능보다 허용 목록이 먼저입니다.

"slack":    { "allowed_users": [] },
"telegram": { "enabled": false, "allowed_user_ids": [] },
"discord":  { "enabled": false, "allowed_user_ids": [] }

Slack·Telegram·Discord 같은 채널 섹션이 전부 “누가 쓸 수 있는가”로 시작합니다. 비어 있으면 아무도 못 씁니다. 채널을 연결하는 기능을 먼저 만들고 접근 제어를 나중에 붙이는 게 아니라, 반대 순서입니다.

기록에도 상한이 있습니다.

"cron_history": {
  "cron_summary_cap": 200,
  "cron_trace_cap_kb": 50,
  "cron_max_records_per_job": 100
}

7단계에서 본 실행 이력이 무한히 쌓이지 않는 이유입니다. 감사 기록은 남기되, 잡당 개수와 크기에 상한을 둡니다.

5단계의 승인 실험과 이어지는 자리도 하나 있습니다 — "hooks": {}. Default 모드에서 특정 도구만 자동 승인하는 규칙이 들어가는 자리인데, 아직 이걸 편집하는 화면이 대시보드에 없어서 비어 있습니다. 전부 승인(Auto-approve)과 전부 대기(Default) 사이의 중간 단계가 들어갈 자리가 엔진 쪽에 먼저 마련되어 있는 셈입니다.

팀 토론

먼저 스스로 답해 본 뒤 접힌 답과 비교해 보세요.

실패한 잡이 3일 동안 조용히 실패를 반복했다면 어떻게 발견되는가? 어떻게 발견되게 만들 것인가?

생각해 볼 답

기본 상태에서는 누군가 Executions를 열어봐야 발견됩니다. 발견되게 만들려면 실패를 사람이 있는 곳으로 밀어내야 합니다. 결과를 받는 채널을 연결하거나, 이벤트에 알림을 걸거나, “어제 실행 이력을 요약 보고하는 잡”을 하나 더 둘 수 있습니다. 감시를 자동화하는 것도 결국 하나의 잡입니다.

Strict schedule은 언제 필요한가? 기본값은 왜 발화 시각을 분산하는가?

생각해 볼 답

기본값은 같은 시각에 잡이 몰릴 때 부하가 튀는 것을 막기 위해 발화 시각을 흩뿌립니다. 마감 직전 점검, 정시 보고, 다른 시스템과 시각을 맞추는 동기화처럼 시각 자체가 의미인 작업에는 Strict schedule이 필요합니다.

무인 실행에 Auto-approve를 줄 때 무엇을 확인해야 하는가?

생각해 볼 답

그 잡의 Message가 시킬 수 있는 일의 범위를 확인해야 합니다. 읽고 보고하는 잡은 Auto-approve를 고려할 수 있지만, 파일을 쓰거나 지우거나 외부로 보내는 Message라면 승인 없이 실행될 위험을 먼저 평가해야 합니다.

스케줄의 Message에 Lab 2의 스킬 트리거 단어를 넣으면 무인 실행에도 스킬이 적용되는가?

생각해 볼 답

Message는 발화 시 에이전트에게 가는 프롬프트입니다. 세션에서 트리거가 작동하는 조건이라면 무인 실행에서도 같은 경로로 로드될 수 있습니다. Message에 트리거 단어를 넣고 실행 세션에서 Loaded skill(s) 표시를 확인해 실험해 보세요.

확장 질문

Cron expression으로 “평일 아침 9시”를 표현해 보라. Weekly와 무엇이 다른가?

생각해 볼 답
0 9 * * 1-5

번역: 분 0, 시각 9시, 모든 날짜·월, 월~금에 실행한다는 뜻입니다.

Weekly는 요일과 시각을 UI로 고르는 방식이라 읽기 쉽고, cron 표현식은 Weekly로 표현하기 어려운 조합까지 씁니다. 팀이 함께 관리하는 잡이라면 읽기 쉬운 방식을 우선할 수 있습니다.

이 스케줄로 “매일 아침 어제 세션 요약 보고”를 만든다면 Message를 어떻게 쓰겠는가?

생각해 볼 답

할 일(어제 세션들의 주제와 결과 요약), 방어선(세션이 없으면 없다고 보고), 출력 형식(항목별 한 줄)을 Message에 함께 적습니다. 읽기만 하는 잡이라면 Approval 정책도 작업 범위에 맞춰 선택합니다.

자기 상황으로 연습하기

핸즈온에서 만든 반복 스케줄을 여러분의 정기적인 확인 업무로 바꾸어 한 번 더 만들어 봅니다. 실제 민감 데이터나 회사 자료는 넣지 말고, 가상의 프로젝트명과 상태값으로 예약 메시지와 성공 여부 확인 절차를 연습하세요.

  • 대학생: 매일 저녁 과제 마감 점검 잡을 만들어 보세요. 가상의 과목별 마감 목록에서 내일 마감 과제만 보고하게 하고, Executions에서 예약 실행이 성공했는지 확인합니다.
  • 대학원생: 매주 연구 진행 점검 잡을 만들어 보세요. 가상의 실험 목록에서 지연된 항목과 다음 검토일을 요약하게 하고, 수동 트리거의 성공 이력과 실패 원인을 확인합니다.
  • 교수: 매주 강의 준비 점검 잡을 만들어 보세요. 가상의 읽기자료·활동·평가 체크리스트를 보고하게 하고, Calendar에서 반복 시각을 확인한 뒤 Executions에서 결과를 검토합니다.
  • 공공기관 재직자: 매일 업무 시작 전 가상의 민원 처리 현황 점검 잡을 만들어 보세요. 미처리 건수와 기한 임박 항목만 요약하게 하고, 실패가 반복되지 않도록 이력을 확인하는 절차를 함께 정합니다.
  • 일반 직장인: 매일 아침 프로젝트 위험 신호 점검 잡을 만들어 보세요. 가상의 태스크 상태에서 지연·차단·담당자 미지정 항목을 보고하게 하고, List·Calendar·Executions·Logs를 각각 어떤 운영 확인에 쓸지 정리합니다.