Gateway
진단
openclaw doctor는 OpenClaw의 복구 + 마이그레이션 도구입니다. 오래된 config/state를 수정하고, 상태를 점검하며, 실행 가능한 복구 단계를 제공합니다.
빠른 시작
openclaw doctorHeadless 및 자동화 모드
--yes
openclaw doctor --yes프롬프트 없이 기본값을 수락합니다(해당되는 경우 재시작/서비스/샌드박스 복구 단계 포함).
--fix
openclaw doctor --fix프롬프트 없이 권장 복구를 적용합니다(안전한 경우 복구 + 재시작).
--lint
openclaw doctor --lintopenclaw doctor --lint --jsonCI 또는 사전 점검 자동화를 위해 구조화된 상태 점검을 실행합니다. 이 모드는 읽기 전용입니다. 프롬프트를 표시하거나, 복구하거나, config를 마이그레이션하거나, 서비스를 재시작하거나, state를 건드리지 않습니다.
--fix --force
openclaw doctor --fix --force공격적인 복구도 적용합니다(사용자 지정 supervisor config를 덮어씀).
--non-interactive
openclaw doctor --non-interactive프롬프트 없이 실행하고 안전한 마이그레이션만 적용합니다(config 정규화 + 온디스크 state 이동). 사람의 확인이 필요한 재시작/서비스/샌드박스 작업은 건너뜁니다. 레거시 state 마이그레이션은 감지되면 자동으로 실행됩니다.
--deep
openclaw doctor --deep추가 gateway 설치를 찾기 위해 시스템 서비스를 스캔합니다(launchd/systemd/schtasks).
쓰기 전에 변경 사항을 검토하려면 먼저 config 파일을 여세요.
cat ~/.openclaw/openclaw.json읽기 전용 lint 모드
openclaw doctor --lint는 자동화 친화적인
openclaw doctor --fix의 형제 명령입니다. 둘 다 doctor 상태 점검을 사용하지만, 접근 방식은
다릅니다.
| 모드 | 프롬프트 | config/state 쓰기 | 출력 | 사용 목적 |
|---|---|---|---|---|
openclaw doctor |
예 | 아니요 | 친숙한 상태 보고서 | 사람이 상태를 확인할 때 |
openclaw doctor --fix |
때때로 | 예, 복구 정책에 따라 | 친숙한 복구 로그 | 승인된 복구 적용 |
openclaw doctor --lint |
아니요 | 아니요 | 구조화된 발견 항목 | CI, 사전 점검, 리뷰 게이트 |
현대화된 상태 점검은 선택적 repair() 구현을 제공할 수 있습니다.
doctor --fix는 해당 복구가 존재하면 이를 적용하고, 아직 마이그레이션되지 않은 점검에는
기존 doctor 복구 흐름을 계속 사용합니다.
구조화된 복구 계약은 복구 보고와 감지도 분리합니다.
detect()는 현재 발견 항목을 보고하고, repair()는 변경 사항,
config/file diff, 파일이 아닌 부작용을 보고할 수 있습니다. 이를 통해 lint 점검이
변경 계획을 세우지 않으면서도 향후 doctor --fix --dry-run 및 diff 출력으로 가는 마이그레이션 경로를 열어 둡니다.
예:
openclaw doctor --lintopenclaw doctor --lint --severity-min warningopenclaw doctor --lint --jsonopenclaw doctor --lint --allopenclaw doctor --lint --only core/doctor/gateway-config --jsonJSON 출력에는 다음이 포함됩니다.
ok: 표시되는 발견 항목 중 선택한 심각도 임계값을 충족한 항목이 있는지 여부checksRun: 실행된 상태 점검 수checksSkipped: 선택한 프로필,--only, 또는--skip으로 건너뛴 점검findings:checkId,severity,message와 선택적path,line,column,ocPath,fixHint가 포함된 구조화된 진단
종료 코드:
0: 선택한 임계값 이상인 발견 항목 없음1: 하나 이상의 발견 항목이 선택한 임계값을 충족함2: lint 발견 항목을 출력하기 전에 명령/런타임 실패
--severity-min info|warning|error를 사용해 출력되는 내용과
0이 아닌 lint 종료를 유발하는 항목을 모두 제어하세요. --all을 사용하면 기본 자동화 세트에서 제외된 더 깊은 opt-in 점검을 포함해 전체 lint 인벤토리를 실행합니다. 좁은 사전 점검 게이트에는 --only <id>를 사용하고,
나머지 lint 실행은 활성 상태로 유지하면서 시끄러운 점검을 일시적으로 제외하려면
--skip <id>를 사용하세요.
--json, --severity-min, --all, --only, --skip 같은 lint 출력 옵션은
반드시 --lint와 함께 사용해야 합니다. 일반 doctor 및 복구 실행은
이를 거부합니다.
수행 작업(요약)
상태, UI, 업데이트
- git 설치에 대한 선택적 사전 업데이트(대화형 전용).
- UI 프로토콜 최신성 점검(프로토콜 스키마가 더 새로우면 Control UI를 다시 빌드).
- 상태 점검 + 재시작 프롬프트.
- Skills 상태 요약(eligible/missing/blocked) 및 Plugin 상태.
Config 및 마이그레이션
- 레거시 값의 config 정규화.
- 레거시 평면
talk.*필드에서talk.provider+talk.providers.<provider>로 Talk config 마이그레이션. - 레거시 Chrome 확장 config 및 Chrome MCP 준비 상태에 대한 브라우저 마이그레이션 점검.
- OpenCode provider override 경고(
models.providers.opencode/models.providers.opencode-go). - 레거시 OpenAI Codex provider/profile 마이그레이션(
openai-codex→openai) 및 오래된models.providers.openai-codex에 대한 shadowing 경고. - OpenAI Codex OAuth profile에 대한 OAuth TLS 전제 조건 점검.
plugins.allow는 제한적이지만 도구 정책이 여전히 wildcard 또는 plugin 소유 도구를 요청할 때 Plugin/tool allowlist 경고.- 레거시 온디스크 state 마이그레이션(sessions/agent dir/WhatsApp auth).
- 레거시 plugin manifest 계약 키 마이그레이션(
speechProviders,realtimeTranscriptionProviders,realtimeVoiceProviders,mediaUnderstandingProviders,imageGenerationProviders,videoGenerationProviders,webFetchProviders,webSearchProviders→contracts). - 레거시 cron 저장소 마이그레이션(
jobId,schedule.cron, 최상위 delivery/payload 필드, payloadprovider,notify: truewebhook fallback jobs). - 레거시 전체 agent runtime-policy 정리. provider/model runtime policy가 활성 route selector입니다.
- plugins가 활성화된 경우 오래된 plugin config 정리.
plugins.enabled=false인 경우 오래된 plugin 참조는 비활성 containment config로 취급되어 보존됩니다.
State 및 무결성
- Session lock file 검사 및 오래된 lock 정리.
- 영향을 받은 2026.4.24 빌드에서 생성된 중복 prompt-rewrite branch에 대한 session transcript 복구.
- Wedged subagent restart-recovery tombstone 감지. startup이 child를 계속 restart-aborted로 취급하지 않도록 오래된 aborted recovery flag를 지우는
--fix지원 포함. - State 무결성 및 권한 점검(sessions, transcripts, state dir).
- 로컬에서 실행할 때 config file 권한 점검(chmod 600).
- Model auth 상태: OAuth 만료를 점검하고, 만료 임박 token을 refresh할 수 있으며, auth-profile cooldown/disabled 상태를 보고합니다.
Gateway, 서비스, supervisor
- 샌드박싱이 활성화된 경우 sandbox image 복구.
- 레거시 서비스 마이그레이션 및 추가 gateway 감지.
- Matrix channel 레거시 state 마이그레이션(
--fix/--repair모드). - Gateway runtime 점검(서비스가 설치되었지만 실행 중이 아님, 캐시된 launchd label).
- Channel 상태 경고(실행 중인 gateway에서 조사).
- Channel별 권한 점검은
openclaw channels capabilities아래에 있습니다. 예를 들어 Discord voice channel 권한은openclaw channels capabilities --channel discord --target channel:<channel-id>로 감사합니다. - 로컬 TUI client가 아직 실행 중인 상태에서 Gateway event-loop 상태가 저하된 경우 WhatsApp 응답성 점검.
--fix는 확인된 로컬 TUI client만 중지합니다. - primary models, fallbacks, image/video generation models, heartbeat/subagent/compaction overrides, hooks, channel model overrides, session route pins의 레거시
openai-codex/*model ref에 대한 Codex route 복구.--fix는 이를openai/*로 다시 쓰고,openai-codex:*auth profiles/order를openai:*로 마이그레이션하며, 오래된 session/whole-agent runtime pin을 제거하고, canonical OpenAI agent ref는 기본 Codex harness에 남깁니다. - 선택적 복구가 포함된 supervisor config 감사(launchd/systemd/schtasks).
- 설치 또는 업데이트 중 shell
HTTP_PROXY/HTTPS_PROXY/NO_PROXY값을 캡처한 gateway service에 대한 embedded proxy environment 정리. - Gateway runtime 모범 사례 점검(Node vs Bun, version-manager paths).
- Gateway port 충돌 진단(기본값
18789).
Auth, 보안, pairing
- 열린 DM policy에 대한 보안 경고.
- local token mode에 대한 Gateway auth 점검(token source가 없을 때 token 생성을 제안하며, token SecretRef config는 덮어쓰지 않음).
- Device pairing 문제 감지(대기 중인 최초 pair request, 대기 중인 role/scope upgrade, 오래된 local device-token cache drift, paired-record auth drift).
Workspace 및 shell
- Linux에서 systemd linger 점검.
- Workspace bootstrap file size 점검(context file의 truncation/near-limit 경고).
- 기본 agent에 대한 Skills 준비 상태 점검. bin, env, config, OS requirements가 누락된 허용 Skills를 보고하며,
--fix는skills.entries에서 사용할 수 없는 Skills를 비활성화할 수 있습니다. - Shell completion 상태 점검 및 자동 설치/업그레이드.
- Memory search embedding provider 준비 상태 점검(local model, remote API key, 또는 QMD binary).
- Source install 점검(pnpm workspace mismatch, 누락된 UI assets, 누락된 tsx binary).
- 업데이트된 config + wizard metadata를 씁니다.
Dreams UI backfill 및 reset
Control UI Dreams scene에는 grounded dreaming workflow를 위한 Backfill, Reset, Clear Grounded 작업이 포함되어 있습니다. 이 작업들은 gateway doctor 스타일 RPC method를 사용하지만, openclaw doctor CLI 복구/마이그레이션의 일부는 아닙니다.
수행하는 작업:
- Backfill은 활성 workspace의 과거
memory/YYYY-MM-DD.md파일을 스캔하고, grounded REM diary pass를 실행하며, 되돌릴 수 있는 backfill entry를DREAMS.md에 씁니다. - Reset은
DREAMS.md에서 표시된 backfill diary entry만 제거합니다. - Clear Grounded는 과거 replay에서 왔고 아직 live recall 또는 daily support가 누적되지 않은 staged grounded-only short-term entry만 제거합니다.
자체적으로 수행하지 않는 작업:
MEMORY.md를 편집하지 않습니다.- 전체 doctor 마이그레이션을 실행하지 않습니다.
- staged CLI path를 명시적으로 먼저 실행하지 않는 한 grounded candidate를 live short-term promotion store에 자동으로 stage하지 않습니다.
grounded historical replay가 일반 deep promotion lane에 영향을 주게 하려면 대신 CLI 흐름을 사용하세요.
openclaw memory rem-backfill --path ./memory --stage-short-term이는 DREAMS.md를 review surface로 유지하면서 grounded durable candidate를 short-term dreaming store에 stage합니다.
자세한 동작 및 근거
0. 선택적 업데이트(git 설치)
이것이 git checkout이고 doctor가 대화형으로 실행 중이면, doctor 실행 전에 업데이트(fetch/rebase/build)를 제안합니다.
1. Config 정규화
config에 레거시 값 형태가 포함되어 있으면(예: channel-specific override가 없는 messages.ackReaction) doctor가 이를 현재 스키마로 정규화합니다.
여기에는 레거시 Talk 평면 필드가 포함됩니다. 현재 공개 Talk speech config는 talk.provider + talk.providers.<provider>이고, realtime voice config는 talk.realtime.*입니다. Doctor는 이전 talk.voiceId / talk.voiceAliases / talk.modelId / talk.outputFormat / talk.apiKey 형태를 provider map으로 다시 쓰고, 레거시 최상위 realtime selector(talk.mode, talk.transport, talk.brain, talk.model, talk.voice)를 talk.realtime로 다시 씁니다.
Doctor는 plugins.allow가 비어 있지 않고 도구 정책이 와일드카드 또는 Plugin 소유 도구 항목을 사용할 때도 경고합니다. tools.allow: ["*"]는 실제로 로드되는 Plugin의 도구에만 일치하며, 전용 Plugin 허용 목록을 우회하지 않습니다.
2. 레거시 설정 키 마이그레이션
설정에 더 이상 사용되지 않는 키가 포함되어 있으면, 다른 명령은 실행을 거부하고 openclaw doctor를 실행하라고 요청합니다.
Doctor는 다음을 수행합니다.
- 어떤 레거시 키가 발견되었는지 설명합니다.
- 적용한 마이그레이션을 표시합니다.
- 업데이트된 스키마로
~/.openclaw/openclaw.json을 다시 씁니다.
Gateway 시작은 레거시 설정 형식을 거부하고 openclaw doctor --fix를 실행하라고 요청합니다. 시작 시 openclaw.json을 다시 쓰지는 않습니다. Cron 작업 저장소 마이그레이션도 openclaw doctor --fix에서 처리됩니다.
현재 마이그레이션:
routing.allowFrom→channels.whatsapp.allowFromrouting.groupChat.requireMention→channels.whatsapp/telegram/imessage.groups."*".requireMentionrouting.groupChat.historyLimit→messages.groupChat.historyLimitrouting.groupChat.mentionPatterns→messages.groupChat.mentionPatternschannels.telegram.requireMention→channels.telegram.groups."*".requireMention- 사용 중단된
channels.webchat및gateway.webchat제거 routing.queue→messages.queuerouting.bindings→ 최상위bindingsrouting.agents/routing.defaultAgentId→agents.list+agents.list[].default- 레거시
talk.voiceId/talk.voiceAliases/talk.modelId/talk.outputFormat/talk.apiKey→talk.provider+talk.providers.<provider> - 레거시 최상위 실시간 Talk 선택기(
talk.mode/talk.transport/talk.brain/talk.model/talk.voice) +talk.provider/talk.providers→talk.realtime routing.agentToAgent→tools.agentToAgentrouting.transcribeAudio→tools.media.audio.modelsmessages.tts.<provider>(openai/elevenlabs/microsoft/edge) →messages.tts.providers.<provider>messages.tts.provider: "edge"및messages.tts.providers.edge→messages.tts.provider: "microsoft"및messages.tts.providers.microsoft- TTS 화자 선택 필드(
voice/voiceName/voiceId) →speakerVoice/speakerVoiceId channels.discord.voice.tts.<provider>(openai/elevenlabs/microsoft/edge) →channels.discord.voice.tts.providers.<provider>channels.discord.accounts.<id>.voice.tts.<provider>(openai/elevenlabs/microsoft/edge) →channels.discord.accounts.<id>.voice.tts.providers.<provider>plugins.entries.voice-call.config.tts.<provider>(openai/elevenlabs/microsoft/edge) →plugins.entries.voice-call.config.tts.providers.<provider>plugins.entries.voice-call.config.tts.provider: "edge"및plugins.entries.voice-call.config.tts.providers.edge→provider: "microsoft"및providers.microsoftplugins.entries.voice-call.config.provider: "log"→"mock"plugins.entries.voice-call.config.twilio.from→plugins.entries.voice-call.config.fromNumberplugins.entries.voice-call.config.streaming.sttProvider→plugins.entries.voice-call.config.streaming.providerplugins.entries.voice-call.config.streaming.openaiApiKey|sttModel|silenceDurationMs|vadThreshold→plugins.entries.voice-call.config.streaming.providers.openai.*bindings[].match.accountID→bindings[].match.accountId- 이름 있는
accounts가 있지만 단일 계정 최상위 채널 값이 남아 있는 채널의 경우, 해당 계정 범위 값을 해당 채널에 대해 선택된 승격 계정으로 이동합니다(대부분의 채널은accounts.default, Matrix는 일치하는 기존 이름 있는/기본 대상을 보존할 수 있음). identity→agents.list[].identityagent.*→agents.defaults+tools.*(tools/elevated/exec/sandbox/subagents)agent.model/allowedModels/modelAliases/modelFallbacks/imageModelFallbacks→agents.defaults.models+agents.defaults.model.primary/fallbacks+agents.defaults.imageModel.primary/fallbacksagents.defaults.llm제거. 느린 제공자/모델 제한 시간에는models.providers.<id>.timeoutSeconds를 사용하고, 전체 실행이 더 오래 지속되어야 할 때는 에이전트/실행 제한 시간을 그 값보다 크게 유지하세요.browser.ssrfPolicy.allowPrivateNetwork→browser.ssrfPolicy.dangerouslyAllowPrivateNetworkbrowser.profiles.*.driver: "extension"→"existing-session"browser.relayBindHost제거(레거시 확장 릴레이 설정)- 레거시
models.providers.*.api: "openai"→"openai-completions"(Gateway 시작은api가 향후 또는 알 수 없는 열거형 값으로 설정된 제공자도 닫힌 실패로 처리하는 대신 건너뜁니다) plugins.entries.codex.config.codexDynamicToolsProfile제거. Codex 앱 서버는 항상 Codex 네이티브 워크스페이스 도구를 네이티브로 유지합니다.
Doctor 경고에는 다중 계정 채널에 대한 계정 기본값 안내도 포함됩니다.
- 두 개 이상의
channels.<channel>.accounts항목이channels.<channel>.defaultAccount또는accounts.default없이 설정된 경우, doctor는 대체 라우팅이 예상치 못한 계정을 선택할 수 있다고 경고합니다. channels.<channel>.defaultAccount가 알 수 없는 계정 ID로 설정된 경우, doctor는 경고하고 설정된 계정 ID 목록을 표시합니다.
2b. OpenCode 제공자 재정의
models.providers.opencode, opencode-zen 또는 opencode-go를 수동으로 추가했다면, 이는 openclaw/plugin-sdk/llm의 기본 제공 OpenCode 카탈로그를 재정의합니다. 이로 인해 모델이 잘못된 API로 강제되거나 비용이 0으로 설정될 수 있습니다. Doctor는 재정의를 제거하고 모델별 API 라우팅 + 비용을 복원할 수 있도록 경고합니다.
2c. 브라우저 마이그레이션 및 Chrome MCP 준비 상태
브라우저 설정이 아직 제거된 Chrome 확장 경로를 가리키는 경우, doctor는 이를 현재 호스트 로컬 Chrome MCP 연결 모델로 정규화합니다.
browser.profiles.*.driver: "extension"은"existing-session"이 됩니다.browser.relayBindHost가 제거됩니다.
Doctor는 defaultProfile: "user" 또는 설정된 existing-session 프로필을 사용할 때 호스트 로컬 Chrome MCP 경로도 감사합니다.
- 기본 자동 연결 프로필에 대해 Google Chrome이 같은 호스트에 설치되어 있는지 확인합니다.
- 감지된 Chrome 버전을 확인하고 Chrome 144 미만이면 경고합니다.
- 브라우저 검사 페이지에서 원격 디버깅을 활성화하라고 알려줍니다(예:
chrome://inspect/#remote-debugging,brave://inspect/#remote-debugging또는edge://inspect/#remote-debugging).
Doctor는 Chrome 측 설정을 대신 활성화할 수 없습니다. 호스트 로컬 Chrome MCP에는 여전히 다음이 필요합니다.
- gateway/node 호스트의 Chromium 기반 브라우저 144+
- 로컬에서 실행 중인 브라우저
- 해당 브라우저에서 활성화된 원격 디버깅
- 브라우저에서 첫 연결 동의 프롬프트 승인
여기서 준비 상태는 로컬 연결 전제 조건에만 관한 것입니다. Existing-session은 현재 Chrome MCP 경로 제한을 유지합니다. responsebody, PDF 내보내기, 다운로드 가로채기, 배치 작업 같은 고급 경로에는 여전히 관리형 브라우저 또는 원시 CDP 프로필이 필요합니다.
이 검사는 Docker, sandbox, remote-browser 또는 기타 headless 흐름에는 적용되지 않습니다. 이들은 계속 원시 CDP를 사용합니다.
2d. OAuth TLS 전제 조건
OpenAI Codex OAuth 프로필이 설정되면, doctor는 OpenAI 인증 엔드포인트를 프로브하여 로컬 Node/OpenSSL TLS 스택이 인증서 체인을 검증할 수 있는지 확인합니다. 프로브가 인증서 오류(예: UNABLE_TO_GET_ISSUER_CERT_LOCALLY, 만료된 인증서 또는 자체 서명된 인증서)로 실패하면 doctor는 플랫폼별 수정 안내를 출력합니다. Homebrew Node를 사용하는 macOS에서는 보통 brew postinstall ca-certificates로 해결됩니다. --deep을 사용하면 gateway가 정상이어도 프로브가 실행됩니다.
2e. Codex OAuth 제공자 재정의
이전에 models.providers.openai-codex 아래에 레거시 OpenAI 전송 설정을 추가했다면, 새 릴리스가 자동으로 사용하는 기본 제공 Codex OAuth 제공자 경로를 가릴 수 있습니다. Doctor는 Codex OAuth와 함께 이러한 오래된 전송 설정을 발견하면, 오래된 전송 재정의를 제거하거나 다시 작성하여 기본 제공 라우팅/대체 동작을 되돌릴 수 있도록 경고합니다. 사용자 지정 프록시와 헤더 전용 재정의는 여전히 지원되며 이 경고를 트리거하지 않습니다.
2f. Codex 경로 복구
Doctor는 레거시 openai-codex/* 모델 참조를 확인합니다. 네이티브 Codex 하네스 라우팅은 표준 openai/* 모델 참조를 사용합니다. OpenAI 에이전트 턴은 OpenClaw OpenAI 제공자 경로 대신 Codex 앱 서버 하네스를 거칩니다.
--fix / --repair 모드에서 doctor는 기본 에이전트 및 에이전트별 참조를 다시 씁니다. 여기에는 기본 모델, 대체 모델, 이미지/비디오 생성 모델, Heartbeat/subagent/Compaction 재정의, 훅, 채널 모델 재정의, 오래 지속된 세션 경로 상태가 포함됩니다.
openai-codex/gpt-*는openai/gpt-*가 됩니다.- Codex 의도는 복구된 에이전트 모델 참조에 대해 제공자/모델 범위
agentRuntime.id: "codex"항목으로 이동합니다. - 런타임 선택은 제공자/모델 범위이므로 오래된 전체 에이전트 런타임 설정과 지속된 세션 런타임 고정은 제거됩니다.
- 복구된 레거시 모델 참조가 기존 인증 경로를 유지하기 위해 Codex 라우팅이 필요한 경우가 아니면, 기존 제공자/모델 런타임 정책은 보존됩니다.
- 기존 모델 대체 목록은 레거시 항목을 다시 쓴 상태로 보존됩니다. 복사된 모델별 설정은 레거시 키에서 표준
openai/*키로 이동합니다. - 지속된 세션
modelProvider/providerOverride,model/modelOverride, 대체 알림 및 인증 프로필 고정은 발견된 모든 에이전트 세션 저장소에서 복구됩니다. /codex ...는 "채팅에서 네이티브 Codex 대화를 제어하거나 바인딩"한다는 뜻입니다./acp ...또는runtime: "acp"는 "외부 ACP/acpx 어댑터 사용"을 뜻합니다.
2g. 세션 경로 정리
Doctor는 설정된 모델이나 런타임을 Codex 같은 Plugin 소유 경로에서 옮긴 뒤 남아 있는 오래된 자동 생성 경로 상태를 찾기 위해 발견된 에이전트 세션 저장소도 스캔합니다.
openclaw doctor --fix는 소유 경로가 더 이상 설정되어 있지 않을 때 modelOverrideSource: "auto" 모델 고정, 런타임 모델 메타데이터, 고정된 하네스 ID, CLI 세션 바인딩, 자동 인증 프로필 재정의 같은 자동 생성된 오래된 상태를 지울 수 있습니다. 명시적인 사용자 또는 레거시 세션 모델 선택은 수동 검토용으로 보고되고 그대로 둡니다. 해당 경로를 더 이상 의도하지 않는 경우 /model ..., /new로 전환하거나 세션을 재설정하세요.
3. 레거시 상태 마이그레이션(디스크 레이아웃)
Doctor는 오래된 온디스크 레이아웃을 현재 구조로 마이그레이션할 수 있습니다.
- 세션 저장소 + 트랜스크립트:
~/.openclaw/sessions/에서~/.openclaw/agents/<agentId>/sessions/로
- 에이전트 디렉터리:
~/.openclaw/agent/에서~/.openclaw/agents/<agentId>/agent/로
- WhatsApp 인증 상태(Baileys):
- 레거시
~/.openclaw/credentials/*.json에서(oauth.json제외) ~/.openclaw/credentials/whatsapp/<accountId>/...로(기본 계정 ID:default)
- 레거시
이러한 마이그레이션은 최선 노력 방식이며 멱등적입니다. doctor는 백업으로 남겨둔 레거시 폴더가 있으면 경고를 표시합니다. Gateway/CLI도 시작 시 레거시 세션 + 에이전트 디렉터리를 자동 마이그레이션하므로, 수동 doctor 실행 없이 기록/인증/모델이 에이전트별 경로에 위치합니다. WhatsApp 인증은 의도적으로 openclaw doctor를 통해서만 마이그레이션됩니다. Talk 제공자/제공자 맵 정규화는 이제 구조적 동등성으로 비교하므로, 키 순서만 다른 차이는 더 이상 반복적인 무작업 doctor --fix 변경을 트리거하지 않습니다.
3a. 레거시 Plugin 매니페스트 마이그레이션
Doctor는 설치된 모든 Plugin 매니페스트에서 더 이상 사용되지 않는 최상위 capability 키(speechProviders, realtimeTranscriptionProviders, realtimeVoiceProviders, mediaUnderstandingProviders, imageGenerationProviders, videoGenerationProviders, webFetchProviders, webSearchProviders)를 검사합니다. 발견되면 이를 contracts 객체로 옮기고 매니페스트 파일을 제자리에서 다시 쓰도록 제안합니다. 이 마이그레이션은 멱등적입니다. contracts 키에 이미 같은 값이 있으면 데이터를 중복하지 않고 레거시 키만 제거합니다.
3b. 레거시 Cron 저장소 마이그레이션
Doctor는 스케줄러가 호환성을 위해 아직 허용하는 오래된 작업 형태가 있는지 Cron 작업 저장소(기본값은 ~/.openclaw/cron/jobs.json, 재정의된 경우 cron.store)도 확인합니다.
현재 Cron 정리 항목은 다음과 같습니다.
jobId→idschedule.cron→schedule.expr- 최상위 payload 필드(
message,model,thinking, ...) →payload - 최상위 전달 필드(
deliver,channel,to,provider, ...) →delivery - payload
provider전달 별칭 → 명시적delivery.channel - 레거시
notify: trueWebhook fallback 작업 →cron.webhook이 설정된 경우 명시적 Webhook 전달로 변경합니다. 공지 작업은 채팅 전달을 유지하고delivery.completionDestination을 얻습니다.cron.webhook이 설정되지 않은 경우 런타임 전달이 이를 읽지 않으므로, 대상이 없는 작업에서는 비활성 최상위notify표시를 제거합니다(공지 포함 기존 전달은 보존됨).
Gateway는 또한 로드 시 잘못된 Cron 행을 정리하므로 유효한 작업은 계속 실행됩니다. 원시 malformed 행은 jobs.json에서 제거되기 전에 활성 저장소 옆의 jobs-quarantine.json으로 복사됩니다. Doctor는 격리된 행을 보고하므로 직접 검토하거나 복구할 수 있습니다.
Gateway 시작은 런타임 투영을 정규화하고 최상위 notify 표시를 무시하지만, Doctor 복구를 위해 저장된 Cron 설정은 그대로 둡니다. cron.webhook이 설정되지 않은 경우 Doctor는 마이그레이션 대상이 없는 작업(delivery.mode가 none/없음, 사용할 수 없는 Webhook 대상, 또는 기존 공지/채팅 전달)의 비활성 표시를 제거하고 기존 전달은 건드리지 않습니다. 따라서 반복적인 doctor --fix 실행이 같은 작업에 대해 더 이상 다시 경고하지 않습니다. cron.webhook이 설정되어 있지만 유효한 HTTP(S) URL이 아닌 경우 Doctor는 계속 경고하고 URL을 수정할 수 있도록 표시를 남깁니다.
Linux에서 Doctor는 사용자의 crontab이 여전히 레거시 ~/.openclaw/bin/ensure-whatsapp.sh를 호출할 때도 경고합니다. 이 호스트 로컬 스크립트는 현재 OpenClaw에서 유지 관리되지 않으며, Cron이 systemd 사용자 버스에 도달할 수 없을 때 ~/.openclaw/logs/whatsapp-health.log에 잘못된 Gateway inactive 메시지를 쓸 수 있습니다. crontab -e로 오래된 crontab 항목을 제거하세요. 현재 상태 확인에는 openclaw channels status --probe, openclaw doctor, openclaw gateway status를 사용하세요.
3c. 세션 잠금 정리
Doctor는 모든 에이전트 세션 디렉터리에서 오래된 쓰기 잠금 파일, 즉 세션이 비정상적으로 종료될 때 남은 파일을 검사합니다. 발견된 각 잠금 파일에 대해 경로, PID, PID가 아직 살아 있는지 여부, 잠금 age, 그리고 오래된 것으로 간주되는지 여부(죽은 PID, 잘못된 소유자 메타데이터, 30분 초과, 또는 OpenClaw가 아닌 프로세스에 속한다고 증명할 수 있는 살아 있는 PID)를 보고합니다. --fix / --repair 모드에서는 죽은, 고아 상태, 재사용된, 오래되고 잘못된 형식의, 또는 OpenClaw가 아닌 소유자의 잠금을 자동으로 제거합니다. 아직 살아 있는 OpenClaw 프로세스가 소유한 오래된 잠금은 보고하지만 그대로 두어 Doctor가 활성 transcript writer를 끊지 않도록 합니다.
3d. 세션 transcript 브랜치 복구
Doctor는 2026.4.24 prompt transcript 재작성 버그로 생성된 중복 브랜치 형태가 있는지 에이전트 세션 JSONL 파일을 검사합니다. 이 형태는 OpenClaw 내부 런타임 컨텍스트가 포함된 버려진 사용자 턴과, 같은 표시 사용자 프롬프트를 포함하는 활성 sibling으로 구성됩니다. --fix / --repair 모드에서 Doctor는 영향을 받은 각 파일을 원본 옆에 백업한 뒤 transcript를 활성 브랜치로 다시 써서 Gateway 기록과 memory reader가 더 이상 중복 턴을 보지 않게 합니다.
4. 상태 무결성 검사(세션 지속성, 라우팅, 안전성)
상태 디렉터리는 운영의 핵심 중추입니다. 이 디렉터리가 사라지면 세션, 자격 증명, 로그, 설정을 잃습니다(다른 곳에 백업이 없는 경우).
Doctor가 확인하는 항목:
- 상태 디렉터리 누락: 치명적인 상태 손실에 대해 경고하고, 디렉터리를 다시 만들지 묻고, 누락된 데이터는 복구할 수 없다고 알려줍니다.
- 상태 디렉터리 권한: 쓰기 가능 여부를 검증합니다. 권한 복구를 제안하고, 소유자/그룹 불일치가 감지되면
chown힌트를 출력합니다. - macOS 클라우드 동기화 상태 디렉터리: 상태가 iCloud Drive(
~/Library/Mobile Documents/com~apple~CloudDocs/...) 또는~/Library/CloudStorage/...아래로 해석될 때 경고합니다. 동기화 기반 경로는 I/O를 느리게 하고 잠금/동기화 race를 일으킬 수 있기 때문입니다. - Linux SD 또는 eMMC 상태 디렉터리: 상태가
mmcblk*마운트 소스로 해석될 때 경고합니다. SD 또는 eMMC 기반 random I/O는 세션 및 자격 증명 쓰기에서 더 느리고 더 빨리 마모될 수 있기 때문입니다. - Linux 휘발성 상태 디렉터리: 상태가
tmpfs또는ramfs로 해석될 때 경고합니다. 세션, 자격 증명, 설정, 그리고 WAL/journal sidecar가 있는 SQLite 상태가 재부팅 시 사라지기 때문입니다. Dockeroverlay마운트는 컨테이너가 남아 있는 동안 쓰기 가능 레이어가 호스트 재부팅 후에도 유지되므로 의도적으로 표시하지 않습니다. - 세션 디렉터리 누락: 기록을 유지하고
ENOENT충돌을 피하려면sessions/와 세션 저장소 디렉터리가 필요합니다. - Transcript 불일치: 최근 세션 항목에 transcript 파일이 없을 때 경고합니다.
- 메인 세션 "1-line JSONL": 메인 transcript가 한 줄뿐일 때 표시합니다(기록이 누적되지 않음).
- 여러 상태 디렉터리: 여러 홈 디렉터리에
~/.openclaw폴더가 있거나OPENCLAW_STATE_DIR이 다른 곳을 가리킬 때 경고합니다(기록이 설치 간에 나뉠 수 있음). - 원격 모드 알림:
gateway.mode=remote이면 Doctor는 원격 호스트에서 실행하라고 알려줍니다(상태가 그곳에 있음). - 설정 파일 권한:
~/.openclaw/openclaw.json이 그룹/월드 읽기 가능하면 경고하고600으로 강화하도록 제안합니다.
5. 모델 인증 상태(OAuth 만료)
Doctor는 auth 저장소의 OAuth 프로필을 검사하고, 토큰이 곧 만료되거나 만료된 경우 경고하며, 안전할 때 갱신할 수 있습니다. Anthropic OAuth/토큰 프로필이 오래된 경우 Anthropic API 키 또는 Anthropic setup-token 경로를 제안합니다. 갱신 프롬프트는 대화형(TTY) 실행 시에만 나타납니다. --non-interactive는 갱신 시도를 건너뜁니다.
OAuth 갱신이 영구적으로 실패하면(예: refresh_token_reused, invalid_grant, 또는 provider가 다시 로그인하라고 알리는 경우) Doctor는 재인증이 필요하다고 보고하고 실행할 정확한 openclaw models auth login --provider ... 명령을 출력합니다.
Doctor는 다음으로 인해 일시적으로 사용할 수 없는 auth 프로필도 보고합니다.
- 짧은 cooldown(rate limit/timeout/auth failure)
- 더 긴 disable(billing/credit failure)
토큰이 macOS Keychain에 있는 레거시 Codex OAuth 프로필(파일 기반 sidecar 레이아웃 이전의 오래된 onboarding)은 Doctor로만 복구됩니다. 대화형 터미널에서 openclaw doctor --fix를 한 번 실행하여 Keychain 기반 레거시 토큰을 auth-profiles.json 안으로 inline 마이그레이션하세요. 그 후 embedded 턴(Telegram, Cron, sub-agent dispatch)은 이를 canonical OpenAI OAuth 프로필로 해석합니다.
6. Hooks 모델 검증
hooks.gmail.model이 설정된 경우 Doctor는 catalog와 allowlist를 기준으로 모델 참조를 검증하고, 해석되지 않거나 허용되지 않으면 경고합니다.
7. Sandbox 이미지 복구
sandboxing이 활성화되어 있으면 Doctor는 Docker 이미지를 확인하고 현재 이미지가 없을 때 빌드하거나 레거시 이름으로 전환하도록 제안합니다.
7b. Plugin 설치 정리
Doctor는 openclaw doctor --fix / openclaw doctor --repair 모드에서 OpenClaw가 생성한 레거시 Plugin dependency staging 상태를 제거합니다. 여기에는 오래된 생성 dependency root, 이전 install-stage 디렉터리, 과거 bundled-plugin dependency repair 코드가 남긴 package-local 잔해, 그리고 현재 번들 매니페스트를 가릴 수 있는 bundled @openclaw/* Plugin의 고아 상태 또는 복구된 관리형 npm 사본이 포함됩니다. 또한 Doctor는 peerDependencies.openclaw를 선언하는 관리형 npm Plugin에 호스트 openclaw 패키지를 다시 링크하여, 업데이트 또는 npm 복구 후에도 openclaw/plugin-sdk/* 같은 package-local 런타임 import가 계속 해석되도록 합니다.
Doctor는 설정에서 참조하지만 로컬 Plugin 레지스트리가 찾지 못하는 누락된 다운로드 가능 Plugin도 다시 설치할 수 있습니다. 예로는 material plugins.entries, 설정된 channel/provider/search 설정, 설정된 agent runtime이 있습니다. 패키지 업데이트 중에는 코어 패키지가 교체되는 동안 Doctor가 package-manager Plugin 복구를 실행하지 않습니다. 설정된 Plugin에 여전히 복구가 필요하면 업데이트 후 openclaw doctor --fix를 다시 실행하세요. Gateway 시작과 설정 reload는 package manager를 실행하지 않습니다. Plugin 설치는 명시적인 Doctor/install/update 작업으로 유지됩니다.
8. Gateway 서비스 마이그레이션 및 정리 힌트
Doctor는 레거시 Gateway 서비스(launchd/systemd/schtasks)를 감지하고 이를 제거한 뒤 현재 Gateway 포트를 사용해 OpenClaw 서비스를 설치하도록 제안합니다. 또한 추가 Gateway 유사 서비스를 검사하고 정리 힌트를 출력할 수 있습니다. 프로필 이름이 붙은 OpenClaw Gateway 서비스는 first-class로 간주되며 "extra"로 표시되지 않습니다.
Linux에서 사용자 수준 Gateway 서비스가 없지만 시스템 수준 OpenClaw Gateway 서비스가 존재하는 경우 Doctor는 두 번째 사용자 수준 서비스를 자동으로 설치하지 않습니다. openclaw gateway status --deep 또는 openclaw doctor --deep로 검사한 다음, 중복 서비스를 제거하거나 시스템 supervisor가 Gateway lifecycle을 소유하는 경우 OPENCLAW_SERVICE_REPAIR_POLICY=external을 설정하세요.
8b. Startup Matrix 마이그레이션
Matrix 채널 계정에 pending 또는 actionable 레거시 상태 마이그레이션이 있으면 Doctor는 (--fix / --repair 모드에서) 마이그레이션 전 snapshot을 만든 뒤 best-effort 마이그레이션 단계인 레거시 Matrix 상태 마이그레이션과 레거시 암호화 상태 준비를 실행합니다. 두 단계 모두 fatal이 아닙니다. 오류는 기록되고 시작은 계속됩니다. read-only 모드(--fix 없이 openclaw doctor)에서는 이 검사를 완전히 건너뜁니다.
8c. 디바이스 페어링 및 인증 drift
Doctor는 이제 일반 health pass의 일부로 디바이스 페어링 상태를 검사합니다.
보고하는 항목:
- pending 최초 페어링 요청
- 이미 페어링된 디바이스의 pending 역할 업그레이드
- 이미 페어링된 디바이스의 pending scope 업그레이드
- 디바이스 id는 아직 일치하지만 디바이스 identity가 승인된 record와 더 이상 일치하지 않는 public-key mismatch 복구
- 승인된 역할에 대한 활성 token이 없는 paired record
- scope가 승인된 pairing baseline 밖으로 drift한 paired token
- Gateway 측 token rotation보다 오래되었거나 오래된 scope metadata를 가진 현재 머신의 로컬 cached device-token 항목
Doctor는 pair request를 자동 승인하거나 device token을 자동 rotation하지 않습니다. 대신 정확한 다음 단계를 출력합니다.
openclaw devices list로 pending request 검사openclaw devices approve <requestId>로 정확한 request 승인openclaw devices rotate --device <deviceId> --role <role>로 새 token rotationopenclaw devices remove <deviceId>로 오래된 record 제거 및 재승인
이는 흔한 "이미 페어링되었지만 여전히 페어링 필요로 표시되는" 허점을 닫습니다. 이제 doctor는 최초 페어링, 대기 중인 역할/범위 업그레이드, 오래된 토큰/디바이스 ID 드리프트를 구분합니다.
9. 보안 경고
프로바이더가 허용 목록 없이 DM에 열려 있거나 정책이 위험한 방식으로 구성된 경우 doctor가 경고를 내보냅니다.
10. systemd linger (Linux)
systemd 사용자 서비스로 실행 중인 경우, doctor는 로그아웃 후에도 Gateway가 계속 살아 있도록 lingering이 활성화되어 있는지 확인합니다.
11. 워크스페이스 상태 (Skills, Plugin, TaskFlow)
doctor는 기본 에이전트의 워크스페이스 상태 요약을 출력합니다.
- Skills 상태: 적격, 요구 사항 누락, 허용 목록 차단 Skills 수를 집계합니다.
- Plugin 상태: 활성화/비활성화/오류 Plugin 수를 집계하고, 오류가 있는 Plugin ID를 나열하며, 번들 Plugin 기능을 보고합니다.
- Plugin 호환성 경고: 현재 런타임과 호환성 문제가 있는 Plugin을 표시합니다.
- Plugin 진단: Plugin 레지스트리에서 내보낸 로드 시점 경고나 오류를 표시합니다.
- TaskFlow 복구: 수동 검사 또는 취소가 필요한 의심스러운 관리형 TaskFlow를 표시합니다.
11b. 부트스트랩 파일 크기
doctor는 워크스페이스 부트스트랩 파일(예: AGENTS.md, CLAUDE.md 또는 기타 주입된 컨텍스트 파일)이 구성된 문자 예산에 가까운지 또는 초과했는지 확인합니다. 파일별 원본 대비 주입된 문자 수, 잘림 비율, 잘림 원인(max/file 또는 max/total), 전체 예산 대비 총 주입 문자 비율을 보고합니다. 파일이 잘렸거나 한도에 가까우면 doctor는 agents.defaults.bootstrapMaxChars 및 agents.defaults.bootstrapTotalMaxChars 조정을 위한 팁을 출력합니다.
11d. 오래된 채널 Plugin 정리
openclaw doctor --fix가 누락된 채널 Plugin을 제거할 때, 해당 Plugin을 참조하던 매달린 채널 범위 구성도 함께 제거합니다. 여기에는 channels.<id> 항목, 해당 채널을 지정한 Heartbeat 대상, agents.*.models["<channel>/*"] 오버라이드가 포함됩니다. 이렇게 하면 채널 런타임은 사라졌지만 구성에서 여전히 Gateway에 바인딩을 요청해 발생하는 Gateway 부팅 루프를 방지합니다.
11c. 셸 완성
doctor는 현재 셸(zsh, bash, fish 또는 PowerShell)에 탭 완성이 설치되어 있는지 확인합니다.
- 셸 프로필이 느린 동적 완성 패턴(
source <(openclaw completion ...))을 사용하는 경우, doctor는 더 빠른 캐시 파일 방식으로 업그레이드합니다. - 프로필에 완성이 구성되어 있지만 캐시 파일이 없으면 doctor가 캐시를 자동으로 다시 생성합니다.
- 완성이 전혀 구성되어 있지 않으면 doctor가 설치를 묻습니다(대화형 모드에서만,
--non-interactive사용 시 건너뜀).
캐시를 수동으로 다시 생성하려면 openclaw completion --write-state를 실행하세요.
12. Gateway 인증 검사 (로컬 토큰)
doctor는 로컬 Gateway 토큰 인증 준비 상태를 확인합니다.
- 토큰 모드에 토큰이 필요한데 토큰 소스가 없으면 doctor가 토큰 생성을 제안합니다.
gateway.auth.token이 SecretRef로 관리되지만 사용할 수 없으면 doctor가 경고하고 일반 텍스트로 덮어쓰지 않습니다.openclaw doctor --generate-gateway-token은 토큰 SecretRef가 구성되어 있지 않은 경우에만 생성을 강제합니다.
12b. 읽기 전용 SecretRef 인식 복구
일부 복구 흐름은 런타임의 빠른 실패 동작을 약화하지 않고 구성된 자격 증명을 검사해야 합니다.
- 이제
openclaw doctor --fix는 대상 구성 복구를 위해 상태 계열 명령과 동일한 읽기 전용 SecretRef 요약 모델을 사용합니다. - 예: Telegram
allowFrom/groupAllowFrom@username복구는 가능한 경우 구성된 봇 자격 증명을 사용하려고 시도합니다. - Telegram 봇 토큰이 SecretRef를 통해 구성되어 있지만 현재 명령 경로에서 사용할 수 없는 경우, doctor는 자격 증명이 구성되었지만 사용할 수 없다고 보고하고, 충돌하거나 토큰이 누락되었다고 잘못 보고하는 대신 자동 해석을 건너뜁니다.
13. Gateway 상태 검사 + 재시작
doctor는 상태 검사를 실행하고 Gateway가 비정상으로 보이면 재시작을 제안합니다.
13b. 메모리 검색 준비 상태
doctor는 구성된 메모리 검색 임베딩 프로바이더가 기본 에이전트에서 준비되었는지 확인합니다. 동작은 구성된 백엔드와 프로바이더에 따라 달라집니다.
- QMD 백엔드:
qmd바이너리를 사용할 수 있고 시작할 수 있는지 검사합니다. 그렇지 않으면 npm 패키지와 수동 바이너리 경로 옵션을 포함한 수정 안내를 출력합니다. - 명시적 로컬 프로바이더: 로컬 모델 파일 또는 인식된 원격/다운로드 가능 모델 URL을 확인합니다. 누락된 경우 원격 프로바이더로 전환할 것을 제안합니다.
- 명시적 원격 프로바이더(
openai,voyage등): API 키가 환경 또는 인증 저장소에 있는지 확인합니다. 누락된 경우 실행 가능한 수정 힌트를 출력합니다. - 레거시 자동 프로바이더:
memorySearch.provider: "auto"를 OpenAI로 처리하고 OpenAI 준비 상태를 확인하며,doctor --fix는 이를provider: "openai"로 다시 씁니다.
캐시된 Gateway 검사 결과를 사용할 수 있는 경우(검사 시점에 Gateway가 정상 상태였던 경우), doctor는 그 결과를 CLI에서 보이는 구성과 상호 참조하고 불일치가 있으면 알립니다. doctor는 기본 경로에서 새로운 임베딩 ping을 시작하지 않습니다. 실시간 프로바이더 검사를 원하면 심층 메모리 상태 명령을 사용하세요.
런타임에서 임베딩 준비 상태를 확인하려면 openclaw memory status --deep를 사용하세요.
14. 채널 상태 경고
Gateway가 정상 상태이면 doctor가 채널 상태 검사를 실행하고 제안된 수정 사항과 함께 경고를 보고합니다.
15. 슈퍼바이저 구성 감사 + 복구
doctor는 설치된 슈퍼바이저 구성(launchd/systemd/schtasks)에 누락되었거나 오래된 기본값(예: systemd network-online 의존성과 재시작 지연)이 있는지 확인합니다. 불일치를 발견하면 업데이트를 권장하고 서비스 파일/작업을 현재 기본값으로 다시 쓸 수 있습니다.
참고:
openclaw doctor는 슈퍼바이저 구성을 다시 쓰기 전에 확인을 요청합니다.openclaw doctor --yes는 기본 복구 프롬프트를 수락합니다.openclaw doctor --fix는 프롬프트 없이 권장 수정 사항을 적용합니다(--repair는 별칭).openclaw doctor --fix --force는 사용자 지정 슈퍼바이저 구성을 덮어씁니다.OPENCLAW_SERVICE_REPAIR_POLICY=external은 Gateway 서비스 수명 주기에 대해 doctor를 읽기 전용으로 유지합니다. 서비스 상태를 보고하고 비서비스 복구는 계속 실행하지만, 외부 슈퍼바이저가 해당 수명 주기를 소유하므로 서비스 설치/시작/재시작/부트스트랩, 슈퍼바이저 구성 재작성, 레거시 서비스 정리는 건너뜁니다.- Linux에서 doctor는 일치하는 systemd Gateway 유닛이 활성 상태일 때 명령/엔트리포인트 메타데이터를 다시 쓰지 않습니다. 또한 중복 서비스 검사 중 비활성 비레거시 추가 Gateway 유사 유닛을 무시하여 동반 서비스 파일이 정리 잡음을 만들지 않도록 합니다.
- 토큰 인증에 토큰이 필요하고
gateway.auth.token이 SecretRef로 관리되는 경우, doctor 서비스 설치/복구는 SecretRef를 검증하지만 해석된 일반 텍스트 토큰 값을 슈퍼바이저 서비스 환경 메타데이터에 저장하지 않습니다. - doctor는 이전 LaunchAgent, systemd 또는 Windows Scheduled Task 설치가 인라인으로 포함한 관리형
.env/SecretRef 기반 서비스 환경 값을 감지하고, 해당 값이 슈퍼바이저 정의가 아니라 런타임 소스에서 로드되도록 서비스 메타데이터를 다시 씁니다. - doctor는
gateway.port변경 후에도 서비스 명령이 여전히 이전--port를 고정하고 있는지 감지하고 서비스 메타데이터를 현재 포트로 다시 씁니다. - 토큰 인증에 토큰이 필요하고 구성된 토큰 SecretRef를 해석할 수 없는 경우, doctor는 실행 가능한 안내와 함께 설치/복구 경로를 차단합니다.
gateway.auth.token과gateway.auth.password가 모두 구성되어 있고gateway.auth.mode가 설정되지 않은 경우, doctor는 모드가 명시적으로 설정될 때까지 설치/복구를 차단합니다.- Linux 사용자 systemd 유닛의 경우, 이제 doctor 토큰 드리프트 검사에는 서비스 인증 메타데이터를 비교할 때
Environment=와EnvironmentFile=소스가 모두 포함됩니다. - doctor 서비스 복구는 구성이 더 새 버전에서 마지막으로 작성된 경우, 이전 OpenClaw 바이너리의 Gateway 서비스를 다시 쓰거나 중지하거나 재시작하지 않습니다. Gateway 문제 해결을 참조하세요.
openclaw gateway install --force를 통해 언제든지 전체 재작성을 강제할 수 있습니다.
16. Gateway 런타임 + 포트 진단
doctor는 서비스 런타임(PID, 마지막 종료 상태)을 검사하고 서비스가 설치되어 있지만 실제로 실행 중이 아닐 때 경고합니다. 또한 Gateway 포트(기본값 18789)의 포트 충돌을 확인하고 가능한 원인(Gateway가 이미 실행 중, SSH 터널)을 보고합니다.
17. Gateway 런타임 모범 사례
doctor는 Gateway 서비스가 Bun 또는 버전 관리형 Node 경로(nvm, fnm, volta, asdf 등)에서 실행될 때 경고합니다. WhatsApp + Telegram 채널에는 Node가 필요하며, 버전 관리자 경로는 서비스가 셸 초기화를 로드하지 않기 때문에 업그레이드 후 깨질 수 있습니다. doctor는 가능한 경우 시스템 Node 설치(Homebrew/apt/choco)로 마이그레이션할 것을 제안합니다.
새로 설치되거나 복구된 macOS LaunchAgent는 대화형 셸 PATH를 복사하는 대신 표준 시스템 PATH(/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin)를 사용합니다. 따라서 Homebrew로 관리되는 시스템 바이너리는 계속 사용할 수 있으며, Volta, asdf, fnm, pnpm 및 기타 버전 관리자 디렉터리가 Node 자식 프로세스가 해석하는 대상을 바꾸지 않습니다. Linux 서비스는 명시적 환경 루트(NVM_DIR, FNM_DIR, VOLTA_HOME, ASDF_DATA_DIR, BUN_INSTALL, PNPM_HOME)와 안정적인 사용자 bin 디렉터리를 계속 유지하지만, 추정된 버전 관리자 폴백 디렉터리는 해당 디렉터리가 디스크에 존재할 때만 서비스 PATH에 기록됩니다.
18. 구성 쓰기 + 마법사 메타데이터
doctor는 모든 구성 변경 사항을 저장하고 doctor 실행을 기록하기 위해 마법사 메타데이터를 찍습니다.
19. 워크스페이스 팁 (백업 + 메모리 시스템)
doctor는 워크스페이스 메모리 시스템이 없을 때 이를 제안하고, 워크스페이스가 아직 git 아래에 없으면 백업 팁을 출력합니다.
워크스페이스 구조와 git 백업(비공개 GitHub 또는 GitLab 권장)에 대한 전체 가이드는 /concepts/agent-workspace를 참조하세요.