Files
openclaw/cron/jobs.json
T
hyowons 70e2251995 auto: 일일 백업 2026-06-18 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 02:00:02 +09:00

194 lines
37 KiB
JSON

{
"version": 1,
"jobs": [
{
"id": "56d66b54-9a2b-4e94-95d8-fb73efd888ae",
"agentId": "main",
"sessionKey": "agent:main:main",
"name": "오전 브리핑",
"enabled": true,
"createdAtMs": 1774622556732,
"schedule": {
"kind": "cron",
"expr": "30 7 * * *",
"tz": "Asia/Seoul"
},
"sessionTarget": "isolated",
"wakeMode": "now",
"payload": {
"kind": "agentTurn",
"message": "오전 브리핑 HTML 메일 작성. 아래 순서대로 실행:\n\nStep 1: python3 /Users/snowoyh/.openclaw/workspace/scripts/briefing_mail.py prepare morning > /tmp/briefing_morning_prep.json\n JSON 읽어서:\n - already_sent=true면 \"오전 브리핑 이미 발송 완료 (스킵)\" 한 줄 답하고 종료.\n - us_send_directive==\"wait\"면 \"시황 영상 미게시 — 다음 폴백에서 재시도 대기\" 한 줄 답하고 종료 (이후 단계 실행 금지).\n\nStep 2: articles 각 항목에 한국어 평문 설명을 작성. articles[].description에 언론사 리드문(100~500자)이 들어 있음 — 이를 **근거**로 2~3문장 요약. description이 비어 있는 항목만 제목 기반 추정이며, 이 경우 summary 첫 문장을 \"(리드문 없음 — 제목 기반 추정)\"로 시작.\n 작성 기준:\n - 제목을 그대로 옮기지 말고 description 내용을 바탕으로 무슨 일이 왜 생겼고 어떤 영향이 예상되는지 일상어로 풀어서 설명\n - 길이는 필요한 만큼. 2~3문장으로 충분하면 그 정도, 복잡한 사안은 더 길게. 억지 축약/억지 연장 둘 다 하지 말 것\n - 숫자·인용은 description 또는 제목에 명시된 것만 사용 (description 밖 추측·추정 금지)\n - 확신 없는 부분은 \"후속 확인 필요\" 로 마무리\n - '핵심/의미/체크/제 의견' 같은 라벨 구조 사용 금지 — 자연스러운 문장 흐름으로\n - 스크립트가 유사 뉴스는 이미 걸러내지만 혹시 남아 있으면 summary 첫 문장에 \"동일 사안 다른 매체 보도\"로 표기하고 짧게 처리\n - 핵심 수치·고유명사 등 꼭 강조할 부분만 `**...**`로 감싸면 굵게+강조색으로 표시된다. 문장당 1~2곳 이내로 절제.\n - 그 기사가 **우리나라 증시(코스피·코스닥)에 큰 영향**을 줄 만하면(예: 반도체·2차전지 등 수출 대형주, 미국 금리·FOMC, 원/달러 환율, 외국인 수급, 주요 정책·지정학 이벤트) 해당 article 객체에 \"kr_impact\": true 를 추가한다(메일에서 🔥 '국내증시 영향' 배지+빨강 강조 테두리로 표시됨). 그런 기사는 요약 안에서도 영향 포인트를 `**...**`로 더 분명히 강조한다. 영향이 제한적이면 kr_impact 키를 생략(남발 금지, 정말 큰 건만).\n\nStep 3: 해외 증시·이슈 정리 — us_market.transcript(@futuresnow '오늘의 요약', 상세 미국증시)와 behive_market.transcript(비하이브 '주식시황')의 **해외·미국 관련 부분을 합쳐서** 한국어로 정리한다. 두 소스가 같은 사안을 다루면 **중복 제거**하고 더 구체적인 수치·정보로 통합한다.\n - 작성 조건: us_market.available_today 또는 behive_market.available_today 중 하나라도 true면 작성. 둘 다 false면 이 단계를 건너뛴다.\n - 자동자막 오타 문맥 교정(예: 'SM표빗'·'SMP500'→S&P500, '나스닥백'·'나싹'→나스닥, '다오'→다우, 'FMC'→FOMC).\n - 카테고리 그룹(내용 있는 것만, 순서대로): '지수'(S&P500·나스닥·다우·필라델피아 반도체 수치) / '주요 이슈'(매크로·지정학·유가·금리 동인) / '특징주·섹터' / '연준·금리'(FOMC·점도표 등) / '전문가 시각' / '오늘 일정'(미국 지표·이벤트). 권장 카테고리에 안 맞으면 마지막 '기타' 그룹에 모은다(누락 금지).\n - 미국증시 수치·디테일은 @futuresnow가 있으면 그쪽을 우선 채택(더 정확). 전체 불릿 충분히(최소 6개 이상), 억지로 줄이지 말 것. 각 불릿 한 문장으로 명확하게. 핵심 수치·지수 등락률·중요 키워드 등 꼭 강조할 부분만 `**...**`로 감싼다(굵게+강조색으로 표시됨). 불릿당 1~2곳 이내로 절제하고 남발하지 말 것.\n - 국내 증시(코스피·코스닥)에 특히 큰 영향을 줄 항목은 불릿 맨 앞에 '🔥 '를 붙인다(메일에서 강조 배경 밴드로 표시됨). 정말 중요한 1~2개만, 남발 금지.\n - 숫자·인용은 자막에 명시된 것만 사용 (추측 금지).\n\nStep 4: 국내 증시·이슈 정리 — behive_market.transcript(비하이브 '주식시황')에서 **국내(한국) 시장 관련 부분만** 골라 정리한다. 미국·해외 내용은 Step 3(해외)로 보내고 여기서는 제외해 중복을 막는다.\n - 작성 조건: behive_market.available_today가 true면 작성, false면 건너뛴다.\n - 자동자막 오타 문맥 교정.\n - 카테고리 그룹(내용 있는 것만, 순서대로): '지수·수급'(코스피·코스닥·외국인/기관·환율) / '주요 이슈'(국내 매크로·정책) / '섹터·테마' / '주목 종목' / '전략·코멘트'(진행자 시각·대응전략) / '오늘 일정'(국내). 안 맞으면 마지막 '기타' 그룹에 모은다(누락 금지).\n - 특정 종목 매수·매도 권유 표현은 사실 전달(\"진행자는 ~라고 언급\")으로 중립화. 전체 불릿 충분히(최소 5개 이상), 각 불릿 한 문장으로. 핵심 수치·지수 등락률·중요 키워드 등 꼭 강조할 부분만 `**...**`로 감싼다(굵게+강조색으로 표시됨). 불릿당 1~2곳 이내로 절제하고 남발하지 말 것.\n - 국내 증시(코스피·코스닥)에 특히 큰 영향을 줄 항목은 불릿 맨 앞에 '🔥 '를 붙인다(메일에서 강조 배경 밴드로 표시됨). 정말 중요한 1~2개만, 남발 금지.\n\nStep 5: prep JSON을 복사해서 augmented JSON을 Write 도구로 /tmp/briefing_morning_augmented.json 에 저장:\n - articles 배열의 각 원소에 \"summary\": \"<평문 설명 문자열>\" 추가 (단일 문자열, 여러 단락은 '\\n' 구분)\n - 해외 정리를 작성한 경우에만 최상위에 \"overseas_summary\" 추가. 값은 카테고리 그룹 배열: [{\"label\":\"지수\",\"items\":[\"불릿1\",\"불릿2\"]}, ...] (내용 있는 그룹만)\n - 국내 정리를 작성한 경우에만 최상위에 \"domestic_summary\" 추가. 형식은 overseas_summary와 동일한 카테고리 그룹 배열\n - 비하이브 자막(behive_market.transcript)에 **코스피 야간선물** 값이 언급됐으면 최상위 \"kospi_futures_override\"에 \"- 코스피 야간선물: <▲ 또는 ▼> <등락률>%\" 형식 문자열로 넣는다(예: \"- 코스피 야간선물: ▼ 1.15%\", 상승은 ▲). 진행자가 지수레벨까지 말하면 \"- 코스피 야간선물: 1,386 (▼ 1.15%)\"처럼 레벨+괄호로 적되, 등락률만 말하면 레벨 없이 \"▼ 1.15%\" 한 번만 적어 중복 표기하지 말 것.\n - 같은 자막에 **MSCI 한국** 지수 값이 언급됐으면 최상위 \"msci_override\"에 \"- MSCI 한국: <▲ 또는 ▼> <등락률>%\" 형식으로 넣는다(등락률만 알면 \"▼ 2.64%\"처럼 한 번만, 레벨까지 알면 \"205 (▼ 2.64%)\").\n - ⚠️ 두 값 모두, 자동자막이라 수치가 불명확하거나 뭉개졌으면 억지로 넣지 말고 해당 키를 생략한다(생략 시 스크랩값이 그대로 쓰임). 자막에 없으면 당연히 생략.\n - 작성 안 한 키는 넣지 않는다. 나머지 필드(us_market·behive_market 포함)는 prep 그대로 보존.\n\nStep 6: python3 /Users/snowoyh/.openclaw/workspace/scripts/briefing_mail.py compose --input /tmp/briefing_morning_augmented.json > /tmp/briefing_morning_body.html\n\nStep 7: python3 /Users/snowoyh/.openclaw/workspace/scripts/briefing_mail.py send morning --subject \"[오전 브리핑] {date}\" --body-file /tmp/briefing_morning_body.html --html\n ({date}는 prep JSON의 date 값)\n\nStep 8: 성공 시 \"오전 브리핑 HTML 발송 완료 (뉴스 N건, 해외/국내 시황 정리)\" 한 줄. 실패 시 exact error 포함해 한국어로 보고.",
"timeoutSeconds": 900
},
"delivery": {
"mode": "none"
},
"deleteAfterRun": false,
"state": {}
},
{
"id": "c4f2d3e5-0755-4f66-bb22-briefingfb0755",
"agentId": "main",
"sessionKey": "agent:main:main",
"name": "오전 브리핑 (fallback 0755)",
"enabled": true,
"createdAtMs": 1774622556732,
"schedule": {
"kind": "cron",
"expr": "55 7 * * *",
"tz": "Asia/Seoul"
},
"sessionTarget": "isolated",
"wakeMode": "now",
"payload": {
"kind": "agentTurn",
"message": "오전 브리핑 HTML 메일 작성 (07:55 1차 폴백 — 07:30에 시황 영상 미게시로 대기한 경우 보완). 아래 순서대로 실행:\n\nStep 1: python3 /Users/snowoyh/.openclaw/workspace/scripts/briefing_mail.py prepare morning > /tmp/briefing_morning_prep.json\n JSON 읽어서:\n - already_sent=true면 \"오전 브리핑 이미 발송 완료 (스킵)\" 한 줄 답하고 종료.\n - us_send_directive==\"wait\"면 \"시황 영상 미게시 — 다음 폴백에서 재시도 대기\" 한 줄 답하고 종료 (이후 단계 실행 금지).\n\nStep 2: articles 각 항목에 한국어 평문 설명을 작성. articles[].description에 언론사 리드문(100~500자)이 들어 있음 — 이를 **근거**로 2~3문장 요약. description이 비어 있는 항목만 제목 기반 추정이며, 이 경우 summary 첫 문장을 \"(리드문 없음 — 제목 기반 추정)\"로 시작.\n 작성 기준:\n - 제목을 그대로 옮기지 말고 description 내용을 바탕으로 무슨 일이 왜 생겼고 어떤 영향이 예상되는지 일상어로 풀어서 설명\n - 길이는 필요한 만큼. 2~3문장으로 충분하면 그 정도, 복잡한 사안은 더 길게. 억지 축약/억지 연장 둘 다 하지 말 것\n - 숫자·인용은 description 또는 제목에 명시된 것만 사용 (description 밖 추측·추정 금지)\n - 확신 없는 부분은 \"후속 확인 필요\" 로 마무리\n - '핵심/의미/체크/제 의견' 같은 라벨 구조 사용 금지 — 자연스러운 문장 흐름으로\n - 스크립트가 유사 뉴스는 이미 걸러내지만 혹시 남아 있으면 summary 첫 문장에 \"동일 사안 다른 매체 보도\"로 표기하고 짧게 처리\n - 핵심 수치·고유명사 등 꼭 강조할 부분만 `**...**`로 감싸면 굵게+강조색으로 표시된다. 문장당 1~2곳 이내로 절제.\n - 그 기사가 **우리나라 증시(코스피·코스닥)에 큰 영향**을 줄 만하면(예: 반도체·2차전지 등 수출 대형주, 미국 금리·FOMC, 원/달러 환율, 외국인 수급, 주요 정책·지정학 이벤트) 해당 article 객체에 \"kr_impact\": true 를 추가한다(메일에서 🔥 '국내증시 영향' 배지+빨강 강조 테두리로 표시됨). 그런 기사는 요약 안에서도 영향 포인트를 `**...**`로 더 분명히 강조한다. 영향이 제한적이면 kr_impact 키를 생략(남발 금지, 정말 큰 건만).\n\nStep 3: 해외 증시·이슈 정리 — us_market.transcript(@futuresnow '오늘의 요약', 상세 미국증시)와 behive_market.transcript(비하이브 '주식시황')의 **해외·미국 관련 부분을 합쳐서** 한국어로 정리한다. 두 소스가 같은 사안을 다루면 **중복 제거**하고 더 구체적인 수치·정보로 통합한다.\n - 작성 조건: us_market.available_today 또는 behive_market.available_today 중 하나라도 true면 작성. 둘 다 false면 이 단계를 건너뛴다.\n - 자동자막 오타 문맥 교정(예: 'SM표빗'·'SMP500'→S&P500, '나스닥백'·'나싹'→나스닥, '다오'→다우, 'FMC'→FOMC).\n - 카테고리 그룹(내용 있는 것만, 순서대로): '지수'(S&P500·나스닥·다우·필라델피아 반도체 수치) / '주요 이슈'(매크로·지정학·유가·금리 동인) / '특징주·섹터' / '연준·금리'(FOMC·점도표 등) / '전문가 시각' / '오늘 일정'(미국 지표·이벤트). 권장 카테고리에 안 맞으면 마지막 '기타' 그룹에 모은다(누락 금지).\n - 미국증시 수치·디테일은 @futuresnow가 있으면 그쪽을 우선 채택(더 정확). 전체 불릿 충분히(최소 6개 이상), 억지로 줄이지 말 것. 각 불릿 한 문장으로 명확하게. 핵심 수치·지수 등락률·중요 키워드 등 꼭 강조할 부분만 `**...**`로 감싼다(굵게+강조색으로 표시됨). 불릿당 1~2곳 이내로 절제하고 남발하지 말 것.\n - 국내 증시(코스피·코스닥)에 특히 큰 영향을 줄 항목은 불릿 맨 앞에 '🔥 '를 붙인다(메일에서 강조 배경 밴드로 표시됨). 정말 중요한 1~2개만, 남발 금지.\n - 숫자·인용은 자막에 명시된 것만 사용 (추측 금지).\n\nStep 4: 국내 증시·이슈 정리 — behive_market.transcript(비하이브 '주식시황')에서 **국내(한국) 시장 관련 부분만** 골라 정리한다. 미국·해외 내용은 Step 3(해외)로 보내고 여기서는 제외해 중복을 막는다.\n - 작성 조건: behive_market.available_today가 true면 작성, false면 건너뛴다.\n - 자동자막 오타 문맥 교정.\n - 카테고리 그룹(내용 있는 것만, 순서대로): '지수·수급'(코스피·코스닥·외국인/기관·환율) / '주요 이슈'(국내 매크로·정책) / '섹터·테마' / '주목 종목' / '전략·코멘트'(진행자 시각·대응전략) / '오늘 일정'(국내). 안 맞으면 마지막 '기타' 그룹에 모은다(누락 금지).\n - 특정 종목 매수·매도 권유 표현은 사실 전달(\"진행자는 ~라고 언급\")으로 중립화. 전체 불릿 충분히(최소 5개 이상), 각 불릿 한 문장으로. 핵심 수치·지수 등락률·중요 키워드 등 꼭 강조할 부분만 `**...**`로 감싼다(굵게+강조색으로 표시됨). 불릿당 1~2곳 이내로 절제하고 남발하지 말 것.\n - 국내 증시(코스피·코스닥)에 특히 큰 영향을 줄 항목은 불릿 맨 앞에 '🔥 '를 붙인다(메일에서 강조 배경 밴드로 표시됨). 정말 중요한 1~2개만, 남발 금지.\n\nStep 5: prep JSON을 복사해서 augmented JSON을 Write 도구로 /tmp/briefing_morning_augmented.json 에 저장:\n - articles 배열의 각 원소에 \"summary\": \"<평문 설명 문자열>\" 추가 (단일 문자열, 여러 단락은 '\\n' 구분)\n - 해외 정리를 작성한 경우에만 최상위에 \"overseas_summary\" 추가. 값은 카테고리 그룹 배열: [{\"label\":\"지수\",\"items\":[\"불릿1\",\"불릿2\"]}, ...] (내용 있는 그룹만)\n - 국내 정리를 작성한 경우에만 최상위에 \"domestic_summary\" 추가. 형식은 overseas_summary와 동일한 카테고리 그룹 배열\n - 비하이브 자막(behive_market.transcript)에 **코스피 야간선물** 값이 언급됐으면 최상위 \"kospi_futures_override\"에 \"- 코스피 야간선물: <▲ 또는 ▼> <등락률>%\" 형식 문자열로 넣는다(예: \"- 코스피 야간선물: ▼ 1.15%\", 상승은 ▲). 진행자가 지수레벨까지 말하면 \"- 코스피 야간선물: 1,386 (▼ 1.15%)\"처럼 레벨+괄호로 적되, 등락률만 말하면 레벨 없이 \"▼ 1.15%\" 한 번만 적어 중복 표기하지 말 것.\n - 같은 자막에 **MSCI 한국** 지수 값이 언급됐으면 최상위 \"msci_override\"에 \"- MSCI 한국: <▲ 또는 ▼> <등락률>%\" 형식으로 넣는다(등락률만 알면 \"▼ 2.64%\"처럼 한 번만, 레벨까지 알면 \"205 (▼ 2.64%)\").\n - ⚠️ 두 값 모두, 자동자막이라 수치가 불명확하거나 뭉개졌으면 억지로 넣지 말고 해당 키를 생략한다(생략 시 스크랩값이 그대로 쓰임). 자막에 없으면 당연히 생략.\n - 작성 안 한 키는 넣지 않는다. 나머지 필드(us_market·behive_market 포함)는 prep 그대로 보존.\n\nStep 6: python3 /Users/snowoyh/.openclaw/workspace/scripts/briefing_mail.py compose --input /tmp/briefing_morning_augmented.json > /tmp/briefing_morning_body.html\n\nStep 7: python3 /Users/snowoyh/.openclaw/workspace/scripts/briefing_mail.py send morning --subject \"[오전 브리핑] {date}\" --body-file /tmp/briefing_morning_body.html --html\n ({date}는 prep JSON의 date 값)\n\nStep 8: 성공 시 \"오전 브리핑 HTML 발송 완료 (뉴스 N건, 해외/국내 시황 정리)\" 한 줄. 실패 시 exact error 포함해 한국어로 보고.",
"timeoutSeconds": 900
},
"delivery": {
"mode": "none"
},
"deleteAfterRun": false,
"state": {}
},
{
"id": "b3f1c2d4-0830-4f55-aa11-briefingfb0830",
"agentId": "main",
"sessionKey": "agent:main:main",
"name": "오전 브리핑 (fallback 0830)",
"enabled": true,
"createdAtMs": 1774622556732,
"schedule": {
"kind": "cron",
"expr": "30 8 * * *",
"tz": "Asia/Seoul"
},
"sessionTarget": "isolated",
"wakeMode": "now",
"payload": {
"kind": "agentTurn",
"message": "오전 브리핑 HTML 메일 작성 (08:30 2차 폴백·최종 발송 — 07:30·07:55에 시황 영상 미게시로 대기한 경우 보완). 아래 순서대로 실행:\n\nStep 1: python3 /Users/snowoyh/.openclaw/workspace/scripts/briefing_mail.py prepare morning --final > /tmp/briefing_morning_prep.json\n JSON 읽어서:\n - already_sent=true면 \"오전 브리핑 이미 발송 완료 (스킵)\" 한 줄 답하고 종료.\n - us_send_directive==\"wait\"면 \"시황 영상 미게시 — 다음 폴백에서 재시도 대기\" 한 줄 답하고 종료 (이후 단계 실행 금지).\n\nStep 2: articles 각 항목에 한국어 평문 설명을 작성. articles[].description에 언론사 리드문(100~500자)이 들어 있음 — 이를 **근거**로 2~3문장 요약. description이 비어 있는 항목만 제목 기반 추정이며, 이 경우 summary 첫 문장을 \"(리드문 없음 — 제목 기반 추정)\"로 시작.\n 작성 기준:\n - 제목을 그대로 옮기지 말고 description 내용을 바탕으로 무슨 일이 왜 생겼고 어떤 영향이 예상되는지 일상어로 풀어서 설명\n - 길이는 필요한 만큼. 2~3문장으로 충분하면 그 정도, 복잡한 사안은 더 길게. 억지 축약/억지 연장 둘 다 하지 말 것\n - 숫자·인용은 description 또는 제목에 명시된 것만 사용 (description 밖 추측·추정 금지)\n - 확신 없는 부분은 \"후속 확인 필요\" 로 마무리\n - '핵심/의미/체크/제 의견' 같은 라벨 구조 사용 금지 — 자연스러운 문장 흐름으로\n - 스크립트가 유사 뉴스는 이미 걸러내지만 혹시 남아 있으면 summary 첫 문장에 \"동일 사안 다른 매체 보도\"로 표기하고 짧게 처리\n - 핵심 수치·고유명사 등 꼭 강조할 부분만 `**...**`로 감싸면 굵게+강조색으로 표시된다. 문장당 1~2곳 이내로 절제.\n - 그 기사가 **우리나라 증시(코스피·코스닥)에 큰 영향**을 줄 만하면(예: 반도체·2차전지 등 수출 대형주, 미국 금리·FOMC, 원/달러 환율, 외국인 수급, 주요 정책·지정학 이벤트) 해당 article 객체에 \"kr_impact\": true 를 추가한다(메일에서 🔥 '국내증시 영향' 배지+빨강 강조 테두리로 표시됨). 그런 기사는 요약 안에서도 영향 포인트를 `**...**`로 더 분명히 강조한다. 영향이 제한적이면 kr_impact 키를 생략(남발 금지, 정말 큰 건만).\n\nStep 3: 해외 증시·이슈 정리 — us_market.transcript(@futuresnow '오늘의 요약', 상세 미국증시)와 behive_market.transcript(비하이브 '주식시황')의 **해외·미국 관련 부분을 합쳐서** 한국어로 정리한다. 두 소스가 같은 사안을 다루면 **중복 제거**하고 더 구체적인 수치·정보로 통합한다.\n - 작성 조건: us_market.available_today 또는 behive_market.available_today 중 하나라도 true면 작성. 둘 다 false면 이 단계를 건너뛴다.\n - 자동자막 오타 문맥 교정(예: 'SM표빗'·'SMP500'→S&P500, '나스닥백'·'나싹'→나스닥, '다오'→다우, 'FMC'→FOMC).\n - 카테고리 그룹(내용 있는 것만, 순서대로): '지수'(S&P500·나스닥·다우·필라델피아 반도체 수치) / '주요 이슈'(매크로·지정학·유가·금리 동인) / '특징주·섹터' / '연준·금리'(FOMC·점도표 등) / '전문가 시각' / '오늘 일정'(미국 지표·이벤트). 권장 카테고리에 안 맞으면 마지막 '기타' 그룹에 모은다(누락 금지).\n - 미국증시 수치·디테일은 @futuresnow가 있으면 그쪽을 우선 채택(더 정확). 전체 불릿 충분히(최소 6개 이상), 억지로 줄이지 말 것. 각 불릿 한 문장으로 명확하게. 핵심 수치·지수 등락률·중요 키워드 등 꼭 강조할 부분만 `**...**`로 감싼다(굵게+강조색으로 표시됨). 불릿당 1~2곳 이내로 절제하고 남발하지 말 것.\n - 국내 증시(코스피·코스닥)에 특히 큰 영향을 줄 항목은 불릿 맨 앞에 '🔥 '를 붙인다(메일에서 강조 배경 밴드로 표시됨). 정말 중요한 1~2개만, 남발 금지.\n - 숫자·인용은 자막에 명시된 것만 사용 (추측 금지).\n\nStep 4: 국내 증시·이슈 정리 — behive_market.transcript(비하이브 '주식시황')에서 **국내(한국) 시장 관련 부분만** 골라 정리한다. 미국·해외 내용은 Step 3(해외)로 보내고 여기서는 제외해 중복을 막는다.\n - 작성 조건: behive_market.available_today가 true면 작성, false면 건너뛴다.\n - 자동자막 오타 문맥 교정.\n - 카테고리 그룹(내용 있는 것만, 순서대로): '지수·수급'(코스피·코스닥·외국인/기관·환율) / '주요 이슈'(국내 매크로·정책) / '섹터·테마' / '주목 종목' / '전략·코멘트'(진행자 시각·대응전략) / '오늘 일정'(국내). 안 맞으면 마지막 '기타' 그룹에 모은다(누락 금지).\n - 특정 종목 매수·매도 권유 표현은 사실 전달(\"진행자는 ~라고 언급\")으로 중립화. 전체 불릿 충분히(최소 5개 이상), 각 불릿 한 문장으로. 핵심 수치·지수 등락률·중요 키워드 등 꼭 강조할 부분만 `**...**`로 감싼다(굵게+강조색으로 표시됨). 불릿당 1~2곳 이내로 절제하고 남발하지 말 것.\n - 국내 증시(코스피·코스닥)에 특히 큰 영향을 줄 항목은 불릿 맨 앞에 '🔥 '를 붙인다(메일에서 강조 배경 밴드로 표시됨). 정말 중요한 1~2개만, 남발 금지.\n\nStep 5: prep JSON을 복사해서 augmented JSON을 Write 도구로 /tmp/briefing_morning_augmented.json 에 저장:\n - articles 배열의 각 원소에 \"summary\": \"<평문 설명 문자열>\" 추가 (단일 문자열, 여러 단락은 '\\n' 구분)\n - 해외 정리를 작성한 경우에만 최상위에 \"overseas_summary\" 추가. 값은 카테고리 그룹 배열: [{\"label\":\"지수\",\"items\":[\"불릿1\",\"불릿2\"]}, ...] (내용 있는 그룹만)\n - 국내 정리를 작성한 경우에만 최상위에 \"domestic_summary\" 추가. 형식은 overseas_summary와 동일한 카테고리 그룹 배열\n - 비하이브 자막(behive_market.transcript)에 **코스피 야간선물** 값이 언급됐으면 최상위 \"kospi_futures_override\"에 \"- 코스피 야간선물: <▲ 또는 ▼> <등락률>%\" 형식 문자열로 넣는다(예: \"- 코스피 야간선물: ▼ 1.15%\", 상승은 ▲). 진행자가 지수레벨까지 말하면 \"- 코스피 야간선물: 1,386 (▼ 1.15%)\"처럼 레벨+괄호로 적되, 등락률만 말하면 레벨 없이 \"▼ 1.15%\" 한 번만 적어 중복 표기하지 말 것.\n - 같은 자막에 **MSCI 한국** 지수 값이 언급됐으면 최상위 \"msci_override\"에 \"- MSCI 한국: <▲ 또는 ▼> <등락률>%\" 형식으로 넣는다(등락률만 알면 \"▼ 2.64%\"처럼 한 번만, 레벨까지 알면 \"205 (▼ 2.64%)\").\n - ⚠️ 두 값 모두, 자동자막이라 수치가 불명확하거나 뭉개졌으면 억지로 넣지 말고 해당 키를 생략한다(생략 시 스크랩값이 그대로 쓰임). 자막에 없으면 당연히 생략.\n - 작성 안 한 키는 넣지 않는다. 나머지 필드(us_market·behive_market 포함)는 prep 그대로 보존.\n\nStep 6: python3 /Users/snowoyh/.openclaw/workspace/scripts/briefing_mail.py compose --input /tmp/briefing_morning_augmented.json > /tmp/briefing_morning_body.html\n\nStep 7: python3 /Users/snowoyh/.openclaw/workspace/scripts/briefing_mail.py send morning --subject \"[오전 브리핑] {date}\" --body-file /tmp/briefing_morning_body.html --html\n ({date}는 prep JSON의 date 값)\n\nStep 8: 성공 시 \"오전 브리핑 HTML 발송 완료 (뉴스 N건, 해외/국내 시황 정리)\" 한 줄. 실패 시 exact error 포함해 한국어로 보고.",
"timeoutSeconds": 900
},
"delivery": {
"mode": "none"
},
"deleteAfterRun": false,
"state": {}
},
{
"id": "9d2c105f-02a7-416c-9ca3-8aaa0dd522bd",
"agentId": "main",
"sessionKey": "agent:main:main",
"name": "오후 브리핑",
"enabled": true,
"createdAtMs": 1774622556739,
"schedule": {
"kind": "cron",
"expr": "0 19 * * *",
"tz": "Asia/Seoul"
},
"sessionTarget": "isolated",
"wakeMode": "now",
"payload": {
"kind": "agentTurn",
"message": "오후 브리핑 HTML 메일 작성. 아래 순서대로 실행:\n\nStep 1: python3 /Users/snowoyh/.openclaw/workspace/scripts/briefing_mail.py prepare evening > /tmp/briefing_evening_prep.json\n JSON 읽어서 already_sent=true면 \"오후 브리핑 이미 발송 완료 (스킵)\" 한 줄 답하고 종료.\n\nStep 2: articles 각 항목에 한국어 평문 설명을 작성. articles[].description에 언론사 리드문(100~500자)이 들어 있음 — 이를 **근거**로 2~3문장 요약. description이 비어 있는 항목만 제목 기반 추정이며, 이 경우 summary 첫 문장을 \"(리드문 없음 — 제목 기반 추정)\"로 시작.\n 작성 기준:\n - 제목을 그대로 옮기지 말고 description 내용을 바탕으로 무슨 일이 왜 생겼고 어떤 영향이 예상되는지 일상어로 풀어서 설명\n - 길이는 필요한 만큼. 2~3문장으로 충분하면 그 정도, 복잡한 사안은 더 길게. 억지 축약/억지 연장 둘 다 하지 말 것\n - 숫자·인용은 description 또는 제목에 명시된 것만 사용 (description 밖 추측·추정 금지)\n - 확신 없는 부분은 \"후속 확인 필요\" 로 마무리\n - '핵심/의미/체크/제 의견' 같은 라벨 구조 사용 금지 — 자연스러운 문장 흐름으로\n - 스크립트가 유사 뉴스는 이미 걸러내지만 혹시 남아 있으면 summary 첫 문장에 \"동일 사안 다른 매체 보도\"로 표기하고 짧게 처리\n - 핵심 수치·고유명사 등 꼭 강조할 부분만 `**...**`로 감싸면 굵게+강조색으로 표시된다. 문장당 1~2곳 이내로 절제.\n - 그 기사가 **우리나라 증시(코스피·코스닥)에 큰 영향**을 줄 만하면(예: 반도체·2차전지 등 수출 대형주, 미국 금리·FOMC, 원/달러 환율, 외국인 수급, 주요 정책·지정학 이벤트) 해당 article 객체에 \"kr_impact\": true 를 추가한다(메일에서 🔥 '국내증시 영향' 배지+빨강 강조 테두리로 표시됨). 그런 기사는 요약 안에서도 영향 포인트를 `**...**`로 더 분명히 강조한다. 영향이 제한적이면 kr_impact 키를 생략(남발 금지, 정말 큰 건만).\n\nStep 3: behive_close.available_today가 true면, behive_close.transcript(비하이브 '마감시황' 영상 자막)를 읽어 오늘 국내 장 마감 해설을 한국어 카테고리 그룹으로 정리한다.\n - 자동자막 오타 문맥 교정(예: '나싹'→나스닥, '코스닥'·'코스피' 등).\n - 카테고리 그룹(내용 있는 것만, 순서대로): '지수·수급'(코스피·코스닥 마감·외국인/기관·환율) / '주도 섹터·특징주'(오늘 오르내린 섹터·종목) / '주요 이슈'(매크로·정책·이벤트) / '내일 관전포인트'(진행자가 짚은 내일 일정·대응전략). 권장 카테고리에 안 맞으면 마지막 '기타' 그룹에 모은다(누락 금지).\n - 특정 종목 매수·매도 권유 표현은 사실 전달(\"진행자는 ~라고 언급\")으로 중립화. 핵심만 `**...**`로 강조(불릿당 1~2곳).\n - 국내 증시(코스피·코스닥)에 특히 큰 영향을 줄 항목은 불릿 맨 앞에 '🔥 '를 붙인다(메일에서 강조 배경 밴드로 표시됨). 정말 중요한 1~2개만, 남발 금지. 전체 불릿 충분히(최소 5개 이상), 각 불릿 한 문장으로.\n - behive_close.available_today가 false면 이 단계를 건너뛴다 (작성 안 함).\n\nStep 4: prep JSON을 복사해서 augmented JSON을 Write 도구로 /tmp/briefing_evening_augmented.json 에 저장:\n - articles 배열의 각 원소에 \"summary\": \"<평문 설명 문자열>\" 추가 (단일 문자열)\n - 마감시황을 작성한 경우에만 최상위에 \"close_summary\" 추가. 값은 카테고리 그룹 배열: [{\"label\":\"지수·수급\",\"items\":[\"불릿1\",\"불릿2\"]}, ...] (내용 있는 그룹만). 작성 안 했으면 키 생략.\n - 나머지 필드(behive_close 포함)는 prep 그대로 보존.\n\nStep 5: python3 /Users/snowoyh/.openclaw/workspace/scripts/briefing_mail.py compose --input /tmp/briefing_evening_augmented.json > /tmp/briefing_evening_body.html\n\nStep 6: python3 /Users/snowoyh/.openclaw/workspace/scripts/briefing_mail.py send evening --subject \"[오후 브리핑] {date}\" --body-file /tmp/briefing_evening_body.html --html\n ({date}는 prep JSON의 date 값)\n\nStep 7: 성공 시 \"오후 브리핑 HTML 발송 완료 (뉴스 N건, 마감시황 포함여부)\" 한 줄. 실패 시 exact error 포함해 한국어로 보고.",
"timeoutSeconds": 900
},
"delivery": {
"mode": "none"
},
"deleteAfterRun": false,
"state": {}
},
{
"id": "08e9a978-4897-4adc-b9f1-48e19fd96fb0",
"agentId": "budget",
"sessionKey": "agent:budget:main",
"name": "월간 결산 (자산 변동 메일 + 골디 텔레그램)",
"enabled": true,
"createdAtMs": 1776936832705,
"schedule": {
"kind": "cron",
"expr": "0 5 1 * *",
"tz": "Asia/Seoul"
},
"sessionTarget": "isolated",
"wakeMode": "now",
"payload": {
"kind": "agentTurn",
"message": "월간 결산 자동 처리 (매월 1일). 오늘이 Asia/Seoul 기준 매월 1일인지 확인하고, 1일이면 아래 명령을 정확히 한 번 실행한다.\n\npython3 /Users/snowoyh/.openclaw/agents/budget/workspace/skills/monthly-settlement/scripts/monthly_settlement.py\n\n이 스크립트가 budget inbox의 securities_balance envelope 검증·후잉 자동 reconcile·processed/failed 이동·월간 스냅샷 저장·메일과 골디 텔레그램 보고를 모두 담당한다. 스크립트 실행 전에 inbox 파일을 직접 이동하거나 별도 처리하지 않는다. --dry-run 또는 --no-send를 붙이지 않는다.\n\n실행 후 stdout/stderr의 핵심 결과를 확인한다. 실패하면 에러 내용을 골디 텔레그램으로 보고하고, 성공하면 추가 메시지는 보내지 않는다(스크립트 자체 보고와 중복 방지).",
"timeoutSeconds": 300
},
"delivery": {
"mode": "none"
},
"deleteAfterRun": false,
"state": {}
},
{
"id": "80052b62-1c7a-4f8e-91c9-222ae4c3c045",
"agentId": "stock",
"sessionKey": "agent:stock:telegram:direct:8443122995",
"name": "비하이브 종목분석 요약",
"enabled": true,
"deleteAfterRun": false,
"createdAtMs": 1778106343263,
"schedule": {
"kind": "cron",
"expr": "0 7,12,18 * * 1-5",
"tz": "Asia/Seoul"
},
"sessionTarget": "isolated",
"wakeMode": "now",
"payload": {
"kind": "agentTurn",
"message": "비하이브투자자문 신규 '종목분석' 영상 점검 → 검증 성공 시에만 watchlist 저장 + 이메일 발송 + 텔레그램 요약.\n\nStep 1: 신규 영상 메타데이터 fetch (자막은 stdout에 포함되지 않음 — FETCH_CACHE에만 저장됨).\npython3 /Users/snowoyh/.openclaw/agents/stock/workspace/scripts/behive_youtube_digest.py fetch\n\nStep 2: 배열이 비어 있으면 아무 발송도 하지 말고 \"신규 종목분석 영상 없음\" 한 줄 답하고 종료.\n\nStep 3: 각 영상마다 자막을 먼저 꺼내 읽는다:\npython3 /Users/snowoyh/.openclaw/agents/stock/workspace/scripts/behive_youtube_digest.py transcript <VIDEO_ID>\n\n중요: 영상 하나에 종목이 여러 개 나올 수 있다. title의 모든 #종목 태그와 자막 내용을 함께 보고, 종목별 JSON을 각각 따로 만든 뒤 같은 VIDEO_ID로 여러 번 save해도 된다. 종목이 2개면 save도 2번, 3개면 3번 해야 한다. 첫 번째 태그만 저장하고 끝내면 안 된다.\n\n그 자막을 바탕으로 아래 스키마의 JSON을 종목별로 생성해서 save에 전달.\n\nJSON 스키마:\n{\n \"stock\": \"종목명 한 단어 (영상 title의 #태그들 또는 자막 본문에서 식별된 실제 분석 종목명)\",\n \"target\": {\"raw\": \"원문 가격 표현\", \"low\": 숫자, \"high\": 숫자},\n \"buy\": {\"raw\": \"원문 가격 표현\", \"primary\": 숫자, \"levels\": [숫자,...]},\n \"stop\": {\"raw\": \"원문 가격 표현\", \"value\": 숫자},\n \"upside_pct\": 숫자,\n \"summary\": [\"불릿1\", \"불릿2\", \"...\"],\n \"notes\": [\"기타1\", \"...\"]\n}\n\n규칙:\n- 가격이 단일값이면 low=high, primary만 기재. 범위면 low/high 모두 기재\n- 숫자는 원(KRW) 단위 정수. \"13,000원\" → 13000. \"3만원대\" → 30000\n- 가격 정보가 자막에 명시되지 않으면 해당 필드는 {\"raw\": \"언급 없음\"}만 남기고 숫자 키 생략\n- target 또는 buy 가격이 없으면 upside_pct는 null\n- stop(손절가)은 반드시 buy(매입가)보다 낮아야 함. 영상에서 매입가 위에 있는 지지선/경계선 수치가 언급되면 stop이 아니라 notes에 \"지지선 XXX원 이탈 시 하방 열림\" 형태로 기록하고 stop은 {\"raw\": \"언급 없음\"}으로 둘 것\n- transcript_status가 'ok'가 아니면 summary 첫 불릿을 \"(자막 수집 불가 — 제목 기반 추정)\"로 시작\n- 여러 종목 영상이면 각 종목 summary/notes가 서로 섞이지 않게 종목별 문단만 분리해서 저장\n\n필수 검증(하나라도 실패하면 전체 발송 금지):\n- 각 영상의 title #태그 개수와 실제 save할 종목 수를 먼저 대조한다.\n- 자막/제목상 다종목 영상인데 종목 수가 모자라거나, 종목별 내용이 뒤섞여 분리가 불확실하면 실패로 종료한다.\n- 검증이 끝나기 전에는 save/email/notify를 호출하지 않는다.\n- 이미 일부 save한 뒤 불일치가 발견되면 email/notify는 호출하지 말고 실패로 종료한다.\n- \"일단 보내고 정정\" 금지.\n\nStep 4: 모든 영상이 검증을 통과한 경우에만 save 실행.\nprintf '%s' '<JSON>' | python3 /Users/snowoyh/.openclaw/agents/stock/workspace/scripts/behive_youtube_digest.py save <VIDEO_ID>\n\nStep 5: 모든 save 성공 후에만 이메일 발송.\npython3 /Users/snowoyh/.openclaw/agents/stock/workspace/scripts/behive_youtube_digest.py email <VIDEO_ID1> <VIDEO_ID2> ...\n\nStep 6: 이메일 성공 후에만 텔레그램 요약 발송.\npython3 /Users/snowoyh/.openclaw/agents/stock/workspace/scripts/behive_youtube_digest.py notify <VIDEO_ID1> <VIDEO_ID2> ...\n\nStep 7: 종료 시 성공이면 \"이메일 N건 + 텔레그램 알림 완료 (종목명들)\", 실패면 실패 내역만 한 줄 보고.",
"timeoutSeconds": 900
},
"delivery": {
"mode": "none"
},
"failureAlert": {
"after": 1,
"channel": "telegram",
"to": "8443122995",
"mode": "announce",
"accountId": "stock"
},
"state": {}
},
{
"id": "ae946886-5829-4d45-a03a-72e70ed371cd",
"agentId": "main",
"sessionKey": "agent:main:telegram:direct:8443122995",
"name": "Gmail 라벨 분류",
"enabled": true,
"deleteAfterRun": false,
"createdAtMs": 1778461171202,
"schedule": {
"kind": "cron",
"expr": "0 1 * * *",
"tz": "Asia/Seoul"
},
"sessionTarget": "isolated",
"wakeMode": "now",
"payload": {
"kind": "agentTurn",
"message": "Gmail 라벨 자동 분류 작업. 다음 명령을 실행하고 결과만 한 줄로 보고:\npython3 /Users/snowoyh/.openclaw/workspace/scripts/gmail_label_classify.py\n\n성공 시 \"Gmail 라벨 분류 완료 (대상 N건, 신규 라벨 M건)\" 형식으로 요약. 실패 시 exact error 포함.",
"timeoutSeconds": 300
},
"delivery": {
"mode": "none"
},
"failureAlert": {
"after": 1,
"channel": "telegram",
"to": "8443122995",
"mode": "announce",
"accountId": "default"
},
"state": {}
}
]
}