virtual-insanity
← 리포트 목록

copilot gpt-5-mini HTTP 403 영향 cron 전수 조사

2026-04-15 copilot403 [phase17-followup, copilot, llm-routing, audit]

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.py
  • scripts/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-enricher
200 정리 딥 분석 파이프라인
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-monitor
Gmail 크레딧 아그리콜 리포트 모니터
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-digest
moltbook-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-bot
dm-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-afternoon
vault-architect-afternoon
N script-llm vault_architect.py ok 2026-04-14 10:11
etf-insight-extractor
ETF 컨센서스 인사이트 추출
N script-llm etf_insight_extractor.py ok 2026-04-10 16:25
etf-weekly-report
ETF 주간리포트
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-loop
7일 컨텍스트 보강 루프
N script-llm context_review_loop.py ok 2026-04-12 09:30
claude-practice-monitor
Claude 프랙티스 모니터
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-report
Agent 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_relink
Note 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-collector
Gmail 뉴스레터 수집기
N script-llm gmail_newsletter_collector.py ok 2026-04-12 06:47
1abfbacd-02a9-424f-ad39-1bce30a21112
technical-stat-models 기술통계모델
N job-model `` ok 2026-04-09 10:35
755caea6-4f80-4a24-89d1-27ea059d79ec
technical-stat-models
N job-model `` ok 2026-04-09 06:50
e27b3e01-7e58-440f-98aa-849f767d89f9
price-history-collector 가격 이력 수집
N job-model `` ok 2026-04-09 08:11
note_atomizer_daily_full
Note Atomizer Full (매일 수신함 소화)
N script-llm note_atomizer.py ok 2026-04-12 03:00
0969c044-8afd-40a7-af21-b4eb3819d55c
technical-stat-models
N job-model `` error 2026-04-10 17:36
vault-lint-advanced-weekly
Vault 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을 뒤로 내렸으므로 긴급 운영에는 필수 아님.

잔존 리스크

  1. Hermes Gateway 재시작 없음
  2. 사용자 지시대로 죽이지 않았다.
  3. 이미 실행 중인 프로세스가 config를 캐시한다면 /Users/ron/.hermes/config.yaml 변경은 다음 프로세스/세션부터 반영될 수 있다.
  4. llm_chat() 단일 호출 구조
  5. openclaw:main은 이제 Codex가 1순위라 안전하지만, llm_chat(model="github-copilot/gpt-5-mini")처럼 직접 Copilot을 지정한 호출은 여전히 Copilot으로 간다.
  6. Copilot은 체인 끝에 남아 있음
  7. 모든 대체 provider가 실패하면 마지막에 Copilot을 시도할 수 있다.
  8. 완전 차단은 더 강한 정책 변경이지만 이번 지시는 “폴백 정의” 수준이므로 삭제하지 않았다.
  9. 별도 네트워크/DNS 장애
  10. 오늘 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