copilot gpt-5-mini HTTP 403 영향 cron 전수 조사
copilot gpt-5-mini HTTP 403 영향 cron 전수 조사
결론
- 09:16 장애 호출은
ocPH-SPY-price-history-refresh세션에서 발생했지만, 실제 작업 명령 실행이 아니라 Hermes가 해당 shell-job을 프롬프트형 AI job처럼 실행한 호출이었다. - 호출 대상은
https://api.githubcopilot.com/chat/completions, 모델은gpt-5-mini, provider는 Copilot. - request dump 안에는 caller stack 필드는 없고, 호출자는 파일명/session_id와 Hermes jobs 상태로 추정했다.
- 현재
ocPH-SPY-price-history-refresh는 shell-job으로 정상 실행 중이며 12:00 실행은 LLM 없이 성공했다. - 응급 우회 적용 완료: OpenClaw/Hermes 기본 모델을 Copilot 우선에서
openai-codex/gpt-5.4우선으로 변경했다. 라우팅 로직은 건드리지 않고 모델 체인/설정만 바꿨다.
request dump 분석
- 파일:
/Users/ron/.hermes/sessions/request_dump_cron_ocPH-SPY-price-history-refresh_20260415_091559_20260415_091605_477567.json - timestamp:
2026-04-15T09:16:05.477549 - session_id:
cron_ocPH-SPY-price-history-refresh_20260415_091559 - reason:
non_retryable_client_error - endpoint:
POST https://api.githubcopilot.com/chat/completions - model:
gpt-5-mini - messages: 2개
- developer: 약 30,809 chars, 대략 7,702 tokens. SOUL/AGENTS/skills 전체 컨텍스트 + cron 안내문.
- user: 약 363 chars, “의미 있는 보고가 있으면 보내고, 없으면 [SILENT]만 응답” 시스템 문구.
- 오류:
PermissionDeniedError / HTTP 403
Access to this endpoint is forbidden. Please review our Terms of Service.
작업 추정
메시지 본문에는 price_history_collector.py 명령이나 SPY 수집 지시가 없었다. 즉 원래 shell command가 LLM에게 전달된 것이 아니라, Hermes cron runner가 빈 prompt job을 실행하듯 Copilot 기본 모델을 호출했다.
근거:
- dump session_id에 ocPH-SPY-price-history-refresh 포함.
- 당시 jobs backup의 해당 job은 shell fields를 가지고 있었지만, 09:17 이전 scheduler backup에는 shell handler가 없었다.
- 현재 scheduler에는 _is_shell_job() / _run_shell_job()가 존재하고, 09:19/10:57/12:00의 같은 job output은 Script Cron Job으로 저장됨.
- 12:00 output: price_history_collector.py --ticker SPY, Exit Code 0, 신규 2개 저장.
모델 라우팅 코드 경로
Hermes
- 설정 파일:
/Users/ron/.hermes/config.yaml - 수정 전:
model:
default: gpt-5-mini
provider: github-copilot
- 이 설정 때문에 프롬프트형 Hermes cron 또는 shell handler 누락 시 Copilot으로 갔다.
OpenClaw shared LLM
- 파일:
/Users/ron/.openclaw/workspace/scripts/shared/llm.py openclaw:main은_openclaw_default_chain()으로 확장된다.- 수정 전 OpenClaw 설정:
{
"primary": "github-copilot/gpt-5-mini",
"fallbacks": ["openai-codex/gpt-5.4"]
}
- 중요:
llm_chat_with_fallback()과llm_chat_direct()는 전체 chain을 순차 시도하지만,llm_chat()은_expand_model_chain([requested_model])[0]만 사용한다. 따라서llm_chat(model="openclaw:main")경로는 수정 전 Copilot 단일 호출이 될 수 있었다.
GitHub/Copilot 의존 코드 경로
- Hermes 내부 provider:
/Users/ron/.hermes/hermes-agent/hermes_cli/models.py,runtime_provider.py,run_agent.py - OpenClaw 공용 LLM:
scripts/shared/llm.py - OpenClaw 큐/오케스트레이터 기본 체인:
scripts/agent_queue_worker.pyscripts/orchestrator.py- 일부 pipeline script는
shared.llm체인을 통해 간접 영향.
영향 범위 평가
Hermes active jobs 7개
| job | type | LLM 영향 | 마지막 상태 | 우회 상태 |
|---|---|---|---|---|
vault-analyst-feedback |
prompt | Hermes 기본 모델 사용. 직접 영향 | ok / 2026-04-15 09:00 | Hermes 기본값을 openai-codex/gpt-5.4로 변경 |
ocPH-SPY-price-history-refresh |
shell | 현재는 LLM 없음. 09:16은 shell handler 누락 시점의 오작동 | ok / 2026-04-15 12:00 | 현재 shell handler로 정상 |
ocAK-AK000-bond-daily-dry-run |
shell | script 내부 shared.llm 사용 |
ok / 2026-04-15 09:22 | shared chain 변경으로 우회 |
ocAO-AO003-bond-morning-command |
shell | 외부 Gmail monitor script에서 LLM 가능성 | ok / 2026-04-15 09:33 | shared chain 변경으로 우회 가능 |
macro-series-collector |
shell | LLM 없음 | ok / 2026-04-15 10:56 | 영향 없음 |
fed-liquidity-aggregator |
shell | LLM 없음 | error / 2026-04-15 10:57 | 영향 없음. 입력 데이터 부재 이슈 |
ocM-M019-blog-monitor |
shell | script 내부 shared.llm 사용 |
미실행 | shared chain 변경으로 우회 |
OpenClaw jobs
- 현재 OpenClaw enabled job 수: 0.
- 비활성 job까지 전수 스캔하면 Copilot 또는 shared LLM 간접 영향 후보는 44개.
- 이들은 재활성화/마이그레이션 시 shared chain 우회 효과를 받는다.
| job | enabled | reason | script | last | last_run |
|---|---|---|---|---|---|
vault-note-atomizer제텔카스텐 원자화 파이프라인 |
N | script-llm | note_atomizer.py |
ok | 2026-04-12 03:30 |
deep-enricher200 정리 딥 분석 파이프라인 |
N | script-llm | deep_enricher.py |
ok | 2026-04-12 04:10 |
intelligence-github-release-monitor지능엔진: GitHub 릴리즈 모니터 |
N | script-llm | github_release_monitor.py |
ok | 2026-04-12 10:33 |
intelligence-blog-monitor지능엔진: 블로그 모니터 |
N | script-llm | blog_monitor.py |
ok | 2026-04-12 10:34 |
gmail-credit-monitorGmail 크레딧 아그리콜 리포트 모니터 |
N | script-llm | gmail_credit_monitor.py |
ok | 2026-04-12 10:34 |
cost-monitor-daily일일 비용 모니터링 |
N | script-llm | cost_monitor.py |
ok | 2026-04-12 05:30 |
moltbook-digestmoltbook-digest |
N | script-llm | moltbook_digest.py |
ok | 2026-03-30 08:34 |
jisik-promote-dkzkyq지식사랑방 수신함 → 200 정리 (전용 승격) |
N | script-llm | note_atomizer.py |
ok | 2026-04-12 03:15 |
methodology-harvester방법론 패턴 자동 수확 |
N | script-llm | methodology_harvester.py |
ok | 2026-04-10 12:32 |
intelligence-discovery-enricher지능엔진: 발견 볼트 힌트 생성 |
N | script-llm | discovery_enricher.py |
ok | 2026-04-12 01:35 |
indicator-extractor시장 지표 자동 추출·축적 |
N | script-llm | indicator_extractor.py |
ok | 2026-04-10 15:00 |
dm-analyst-botdm-analyst-bot |
N | script-llm | dm_analyst_bot.py |
ok | 2026-04-05 11:40 |
session-skill-extractor세션 스킬 자동 추출 |
N | script-llm | session_skill_extractor.py |
ok | 2026-04-12 04:30 |
vault-architect-afternoonvault-architect-afternoon |
N | script-llm | vault_architect.py |
ok | 2026-04-14 10:11 |
etf-insight-extractorETF 컨센서스 인사이트 추출 |
N | script-llm | etf_insight_extractor.py |
ok | 2026-04-10 16:25 |
etf-weekly-reportETF 주간리포트 |
N | script-llm | etf_insight_extractor.py |
ok | 2026-04-06 11:43 |
bond-daily-report채권 일일 브리핑 리포트 (황대진) |
N | script-llm | bond_daily_report.py |
ok | 2026-04-11 10:55 |
intelligence-mutation-loop가설 돌연변이 루프 |
N | script-llm | hypothesis_engine.py |
ok | 2026-04-14 10:11 |
context-review-loop7일 컨텍스트 보강 루프 |
N | script-llm | context_review_loop.py |
ok | 2026-04-12 09:30 |
claude-practice-monitorClaude 프랙티스 모니터 |
N | script-llm | claude_practice_monitor.py |
ok | 2026-04-12 05:30 |
oil-supply-monitor글로벌 석유 공급망 모니터 |
N | script-llm | oil_supply_monitor.py |
ok | 2026-04-12 06:00 |
oil-supply-monitor-afternoon석유 공급망 모니터 (오후 14시) |
N | script-llm | oil_supply_monitor.py |
ok | 2026-04-12 12:00 |
oil-supply-monitor-evening석유 공급망 모니터 (저녁 21시) |
N | script-llm | oil_supply_monitor.py |
ok | 2026-04-11 18:00 |
methodology-weekly-reflector방법론 주간 고찰 |
N | script-llm | methodology_reflector.py |
ok | 2026-04-12 06:10 |
methodology-feedback-inbox방법론 피드백 수신 |
N | script-llm | methodology_inbox.py |
ok | 2026-04-14 13:32 |
sector_news_scorer섹터 뉴스 LLM 중요도 채점 |
N | script-llm | sector_news_scorer.py |
ok | 2026-04-12 08:30 |
agent-community-reportAgent Community 일일 리포트 |
N | script-llm | agent_community_report.py |
ok | 2026-04-11 23:50 |
thesis-tracker투자 테제 추적 |
N | script-llm | thesis_tracker.py |
ok | 2026-04-14 10:11 |
note_atomizer_relinkNote Atomizer Relink (주간 재링크) |
N | script-llm | note_atomizer.py |
ok | 2026-04-12 04:00 |
commodity-spike-morning원자재 급변 감지 (아침) |
N | script-llm | commodity_spike_analyzer.py |
ok | 2026-04-10 12:30 |
commodity-spike-watch원자재 실시간 감시 |
N | script-llm | commodity_spike_analyzer.py |
ok | 2026-04-12 13:42 |
vault-note-atomizer-midday제텔카스텐 원자화 파이프라인 (오후) |
N | script-llm | note_atomizer.py |
ok | 2026-04-12 14:00 |
morning-briefing모닝 브리핑 생성 |
N | script-llm | morning_briefing.py |
ok | 2026-04-12 07:30 |
evening-briefing이브닝 브리핑 생성 |
N | script-llm | morning_briefing.py |
ok | 2026-04-11 18:30 |
bond-morning-poll채권 메일 아침 폴링 (황대진 → bond_daily_report 자동 트리거) |
N | script-llm | gmail_credit_monitor.py |
ok | 2026-04-10 12:01 |
cowork-lite코워크 라이트 (3시간 주기) |
N | job-model | health_check.py |
ok | 2026-04-12 13:00 |
cowork-full코워크 풀 (새벽 심층 분석) |
N | job-model | smart_home.py |
ok | 2026-04-12 04:00 |
gmail-newsletter-collectorGmail 뉴스레터 수집기 |
N | script-llm | gmail_newsletter_collector.py |
ok | 2026-04-12 06:47 |
1abfbacd-02a9-424f-ad39-1bce30a21112technical-stat-models 기술통계모델 |
N | job-model | `` | ok | 2026-04-09 10:35 |
755caea6-4f80-4a24-89d1-27ea059d79ectechnical-stat-models |
N | job-model | `` | ok | 2026-04-09 06:50 |
e27b3e01-7e58-440f-98aa-849f767d89f9price-history-collector 가격 이력 수집 |
N | job-model | `` | ok | 2026-04-09 08:11 |
note_atomizer_daily_fullNote Atomizer Full (매일 수신함 소화) |
N | script-llm | note_atomizer.py |
ok | 2026-04-12 03:00 |
0969c044-8afd-40a7-af21-b4eb3819d55ctechnical-stat-models |
N | job-model | `` | error | 2026-04-10 17:36 |
vault-lint-advanced-weeklyVault Lint Advanced 주간 점검 |
N | script-llm | vault_lint_advanced.py |
ok | 2026-04-12 05:00 |
count 44
응급 우회 적용 내역
변경 파일
/Users/ron/.openclaw/workspace/scripts/shared/llm.py/Users/ron/.openclaw/openclaw.json/Users/ron/.hermes/config.yaml
백업:
- /Users/ron/.openclaw/workspace/scripts/shared/llm.py.bak-copilot403-20260415T122912
- /Users/ron/.openclaw/openclaw.json.bak-copilot403-20260415T122912
- /Users/ron/.hermes/config.yaml.bak-copilot403-20260415T122912
OpenClaw 우회
openclaw:main기본 primary를github-copilot/gpt-5-mini에서openai-codex/gpt-5.4로 변경.DEFAULT_MODEL_CHAIN,PREMIUM_MODEL_CHAIN,DIRECT_DEFAULT_CHAIN,DIRECT_PREMIUM_CHAIN모두 Copilot을 뒤쪽으로 내림.- Copilot 항목은 삭제하지 않고 degraded fallback으로 남김.
- 라우팅 함수/로직은 수정하지 않음.
현재 확장 결과:
openclaw:main => [
'openai-codex/gpt-5.4',
'openrouter/nvidia/nemotron-3-super-120b-a12b:free',
'openrouter/minimax/minimax-m2.5',
'ollama/qwen2.5:3b',
'github-copilot/gpt-5-mini'
]
Hermes 우회
/Users/ron/.hermes/config.yaml
model:
default: gpt-5.4
provider: openai-codex
- 직접 적용 대상:
vault-analyst-feedback같은 프롬프트형 Hermes cron. - Gateway는 죽이지 않았고 재시작하지 않았다. 새 cron session 생성 시 설정 반영되는 경로로 판단한다.
dry-run 검증 결과
실제 gateway socket probe는 이 Codex sandbox에서 PermissionError(1, Operation not permitted)로 막혀 live LLM 호출은 수행하지 못했다. 대신 설정/라우팅 dry-run으로 검증했다.
검증 명령:
cd /Users/ron/.openclaw/workspace
python3 -m py_compile scripts/shared/llm.py
python3 - <<'PY'
import sys
sys.path.insert(0,'/Users/ron/.openclaw/workspace/scripts')
from shared import llm
print('openclaw_main', llm._expand_model_chain(['openclaw:main']))
print('default_chain', llm.DEFAULT_MODEL_CHAIN)
print('premium_chain', llm.PREMIUM_MODEL_CHAIN)
print('direct_default_chain', llm.DIRECT_DEFAULT_CHAIN)
print('direct_premium_chain', llm.DIRECT_PREMIUM_CHAIN)
assert llm._expand_model_chain(['openclaw:main'])[0] == 'openai-codex/gpt-5.4'
assert llm.DEFAULT_MODEL_CHAIN[0] == 'openai-codex/gpt-5.4'
assert llm.PREMIUM_MODEL_CHAIN[0] == 'openai-codex/gpt-5.4'
assert llm.DIRECT_DEFAULT_CHAIN[0] == 'openai-codex/gpt-5.4'
assert llm.DIRECT_PREMIUM_CHAIN[0] == 'openai-codex/gpt-5.4'
print('ASSERT_OK')
PY
결과:
openclaw_main ['openai-codex/gpt-5.4', 'openrouter/nvidia/nemotron-3-super-120b-a12b:free', 'openrouter/minimax/minimax-m2.5', 'ollama/qwen2.5:3b', 'github-copilot/gpt-5-mini']
default_chain ['openai-codex/gpt-5.4', 'openrouter/nvidia/nemotron-3-super-120b-a12b:free', 'openrouter/minimax/minimax-m2.5', 'ollama/qwen2.5:3b', 'github-copilot/gpt-5-mini']
premium_chain ['openai-codex/gpt-5.4', 'openrouter/minimax/minimax-m2.5', 'openrouter/nvidia/nemotron-3-super-120b-a12b:free', 'ollama/qwen2.5:3b', 'github-copilot/gpt-5-mini']
direct_default_chain ['openai-codex/gpt-5.4', 'openrouter/minimax/minimax-m2.5', 'ollama/qwen2.5:3b', 'github-copilot/gpt-4o-mini']
direct_premium_chain ['openai-codex/gpt-5.4', 'openrouter/minimax/minimax-m2.5', 'openrouter/nvidia/nemotron-3-super-120b-a12b:free', 'ollama/qwen2.5:3b', 'github-copilot/gpt-4o-mini']
ASSERT_OK
Hermes 설정 dry-run:
cd /Users/ron/.hermes/hermes-agent
venv/bin/python - <<'PY'
import yaml, pathlib
p=pathlib.Path('/Users/ron/.hermes/config.yaml')
with p.open() as f: cfg=yaml.safe_load(f)
print('model.default', cfg.get('model',{}).get('default'))
print('model.provider', cfg.get('model',{}).get('provider'))
assert cfg.get('model',{}).get('default') == 'gpt-5.4'
assert cfg.get('model',{}).get('provider') == 'openai-codex'
print('ASSERT_OK')
PY
결과:
model.default gpt-5.4
model.provider openai-codex
ASSERT_OK
1개 job 라우팅 dry-run:
41c2736f0527 vault-analyst-feedback job_model=None job_provider=None effective_default=openai-codex/gpt-5.4
사용자 행동 필요 여부
- 즉시 운영 우회는 적용됨.
- Copilot 자체를 다시 1순위로 쓰려면 사용자 행동이 필요할 수 있음:
- GitHub Copilot OAuth 재로그인
- Copilot Terms of Service 재동의
- 구독/권한 상태 확인
- API token 재발급 또는
copilot login재실행 - 지금은 Copilot을 뒤로 내렸으므로 긴급 운영에는 필수 아님.
잔존 리스크
- Hermes Gateway 재시작 없음
- 사용자 지시대로 죽이지 않았다.
- 이미 실행 중인 프로세스가 config를 캐시한다면
/Users/ron/.hermes/config.yaml변경은 다음 프로세스/세션부터 반영될 수 있다. llm_chat()단일 호출 구조openclaw:main은 이제 Codex가 1순위라 안전하지만,llm_chat(model="github-copilot/gpt-5-mini")처럼 직접 Copilot을 지정한 호출은 여전히 Copilot으로 간다.- Copilot은 체인 끝에 남아 있음
- 모든 대체 provider가 실패하면 마지막에 Copilot을 시도할 수 있다.
- 완전 차단은 더 강한 정책 변경이지만 이번 지시는 “폴백 정의” 수준이므로 삭제하지 않았다.
- 별도 네트워크/DNS 장애
- 오늘 FRED/Telegram DNS 장애도 관찰됨. Copilot 403과 별개 원인이다.
자체평가
- 정확성: 4.7/5 — dump/endpoint/model/caller 추정과 영향 경로를 증거로 분리했고, 우회는 모델 정의만 변경했다.
- 완성도: 4.6/5 — active/inactive job 영향 표와 변경 내역/검증 포함. live LLM 호출은 sandbox socket 제한으로 미수행.
- 검증: 4.4/5 — py_compile, config parse, chain assertion, job effective route dry-run 완료. 실제 gateway 호출 검증은 제한됨.
- 최소 변경: 4.8/5 — 라우팅 로직·Gateway·cron 실행은 건드리지 않고 설정/체인 정의만 변경.
- 종합: 4.63/5