자리를 비운 뒤,
무엇이 실행됐는지 확인하려면
코드 리뷰, 테스트 작성, 정적 분석처럼 반복할 수 있지만 오래 걸리는 일이 개발 흐름을 끊었습니다. 대화형 에이전트는 사람이 자리를 비우면 질문이나 권한 승인에서 멈췄고, 실행 이력도 여러 세션에 흩어졌습니다.
Night Owl은 범위와 실행 조건을 미리 정해 Claude Code CLI에 맡기고, 돌아온 사람이 실행 이력과 변경을 검토하는 사내 도구입니다.
작업 종류를 늘리는 대신 프리셋을 남겼다
초기에는 리뷰, 구현, 분석처럼 작업 타입을 코드로 나눴습니다. 실제로 맡기는 일이 다양해지면서 타입의 경계는 흐려졌고, 반복해서 사용하는 지시문은 각 프롬프트 안에 숨어 있었습니다.
그래서 고정 타입을 프리셋으로 옮겼습니다. 설정에 저장한 지시문을 작업 등록 시 불러오고 그 자리에서 수정합니다. 리뷰와 테스트 작성처럼 반복하는 업무를 실행 코드 변경 없이 추가할 수 있습니다.

- 입력
- 대상 프로젝트와 수행할 지시문, 재사용할 프리셋.
- 실행 조건
- 예약 시각, 모델, 허용 도구와 비용 한도.
- 작업 공간
- 프로젝트 경로와 선택적인 Git worktree 격리.
- 결과
- 종료 상태와 비용, 도구 호출 기록, 검토할 변경 내용.
사람에게 바로 물을 수 없는 실행의 공통 조건은 기본 지시로, 업무별 판단은 프리셋으로 나눴습니다. 날짜형 예약은 접수 이력으로 반복 실행을 막지만, 성공 완료나 재시작 복구까지 보장하지는 않습니다. 예약 트리거와 실행 이력을 나눈 판단에 이 경계와 확인 범위를 정리했습니다.
한 번의 실행을 두 가지 기록으로 남긴다
대시보드에서 실행 상태와 비용을 확인하고, 메시지와 도구 결과를 따라 어떤 변경을 했는지 읽습니다.
- 찾아볼 기록
- SQLite에 저장하는 검색·필터링용 구조화 데이터.
- 다시 읽을 기록
- JSONL에 보존하는 재처리·내보내기용 원본 기록.
스케줄러부터 대시보드까지
NestJS 스케줄러가 실행 시점을 정하면 Runner가 CLI를 자식 프로세스로 시작합니다. 구조화된 출력을 줄 단위로 읽어 에이전트 메시지, 도구 호출과 도구 결과를 분리합니다. 대시보드는 Astro와 React로 구성했습니다.
진행 중인 기록은 SSE로 대시보드에 전달합니다. 실행이 끝난 뒤에도 같은 기록을 조회할 수 있습니다. SQLite의 WAL 모드는 스케줄러가 기록하는 동안 대시보드가 읽는 흐름을 지원합니다.
하나의 실행, 목적이 다른 두 기록
전체 연결 읽기 · 7개
- 스케줄러 → Runner
- Runner → Claude Code CLI
- Claude Code CLI → 줄 단위 구조화 출력
- 줄 단위 구조화 출력 → SQLite
- 줄 단위 구조화 출력 → JSONL
- SSE로 진행 확인 → 실행 기록 검토
- 실행 기록 검토 → 사람이 병합 판단
개인 PC에 설치하는 방식으로 구성해 기존 Claude Code 인증과 프로젝트 설정을 사용합니다. 별도 데이터베이스 서버 없이 SQLite와 PM2로 실행하며, 신뢰할 수 있는 로컬 환경에서 팀 내부 도구로 사용합니다.
CLI 호출과 로그 형식
Runner는 child_process.spawn으로 CLI를 시작하고, --output-format stream-json의 NDJSON 출력을 파싱합니다. 모델·비용 한도·도구 범위·MCP 설정은 작업 설정에서 실행 인자로 전달합니다.
동시에 실행할 수 있어도 같은 작업 공간은 보호한다
여러 작업이 같은 프로젝트 파일을 동시에 바꾸면 충돌할 수 있습니다. 프로젝트 단위 잠금과 전체 동시 실행 수 제한을 함께 두었습니다. 코드 변경이 포함된 작업에는 선택적으로 Git worktree를 사용해 작업 공간을 분리합니다.
권한과 비용 한도는 작업마다 정합니다. MCP 서버 설정도 실행에 전달하지만, 외부 도구는 해당 작업의 허용 목록 안에서 사용하도록 구성합니다. Jira 이슈 등록처럼 외부 시스템을 바꾸는 후속 작업도 이 범위에 포함됩니다.
실행 설정에서 제어하는 범위
--permission-mode auto등 작업에 지정한 권한 모드.--allowedTools로 제한한 파일·명령·MCP 도구.--mcp-config로 전달하는 외부 도구 연결 설정.- 실행 비용 한도, 전체 동시성, 프로젝트 잠금과 선택적인 worktree.
이 제어는 맡긴 작업의 범위를 관리하는 장치입니다. 코드가 맞는지 판단하는 검증과 병합 결정은 별도로 남겨 둡니다.
자동 실행의 끝은 검토할 수 있는 결과
팀 사용에서 확인한 변화는 예약 실행, 한곳에 모인 실행 이력, 반복 테스트 작업의 비동기화입니다. 생산성이나 야근 감소 효과를 동일 조건으로 측정한 수치는 아직 없습니다.
생성된 변경은 사람이 검토한 뒤 병합합니다. 운영 배포를 자율 실행하는 시스템으로 설계하지 않았습니다. Skill Plugin은 이 실행 안에서 계획·구현·검증의 순서를 정의하고, Night Owl는 언제 어디서 실행하고 어떤 기록을 남길지 맡습니다.
운영에서 남긴 기준
실행이 끝났다는 상태와 검토할 만한 결과를 얻었다는 판단을 구분합니다. 장기 실행의 체크포인트와 재개, 작업 품질 평가, 외부 변경의 멱등성은 다음 검증 과제로 남겼습니다.
선택해서 보기 · 가상 워크플로 평가 예시
가상 평가 예시 · 실측 전
예약부터 검토까지, 사람의 작업을 살펴보기
수동으로 시작하고 여러 세션을 다시 찾는 방식과, 예약 작업·실행 기록을 사용하는 방식을 비교하는 가상 시나리오입니다.
수치·표본 설정·피드백은 평가 화면을 설명하기 위해 만든 가상 예시입니다. 실제 동료에게서 수집한 기록이나 의견이 아니며, 개선 효과를 입증하지 않습니다.
| 관찰할 과정 · 단위 | 기존 방식 수동 실행 · 세션 탐색 | 도구 사용 예약 작업 · 실행 기록 | 가상 차이 실제 개선율 아님 |
|---|---|---|---|
| 작업 시작 설정분 / 작업 | 8 | 5 | 37.5% |
| 실행 상태 다시 확인분 / 작업 | 3.5 | 2.5 | 28.6% |
| 실행 결과 검토분 / 작업 | 6 | 4.5 | 25% |
표본·계산식·관찰 범위와 다음 평가
가상 작업 동일 범위의 반복 테스트 작성 작업
가상 표본 설정 역할 시나리오 8종 × 작업 4회 = 방식별 32회. 참여자를 모집하거나 수행한 실험이 아닙니다.
같은 프로젝트·지시문·모델·작업 범위를 가정합니다. 시간은 사람이 직접 조작하거나 읽는 구간의 작업당 평균이며, 대기·생성 시간은 제외합니다. 검토 후 승인·병합 시간은 별도로 남깁니다.
가상 차이 = (기존 방식 값 − 도구 사용 값) ÷ 기존 방식 값. 가상 평균값으로 계산한 비율이며, 실제 개선율이나 인과관계의 근거가 아닙니다.
표의 각 값은 방식별 32회 평균을 가정합니다.
- 작업 시작 설정의 관찰 범위
- 프로젝트를 선택한 시점부터 입력·권한·실행 조건 설정 완료까지의 사람 작업 시간.
- 실행 상태 다시 확인의 관찰 범위
- 설정 완료 뒤 실행 종료 전까지 상태를 찾아 확인한 사람 작업 시간의 합.
- 실행 결과 검토의 관찰 범위
- 종료 후 실행 기록과 결과 요약을 읽기 시작해 다음 검증 항목을 정할 때까지의 사람 작업 시간. 코드 검증·승인·병합은 제외.