openclaw approvals get --gateway のデフォルトタイムアウトにより「Config unavailable」が誤って報告される
`openclaw approvals get --gateway` コマンドのデフォルト10秒タイムアウトは、ゲートウェイルuntime正常に動作しexecの動作も正しいにもかかわらず、遅いホスト上で誤解を招く「Config unavailable」のレポートを発生させます。
🔍 症状
主な症状
openclaw approvals get --gateway を実行すると、健康状態が誤った内容で短く切り詰められた出力が表示されます:
$ openclaw approvals get --gateway
gateway timeout after 10000ms
...
Effective Policy -> Config unavailable.
[Command exits with non-zero status]副次的症状
- 終了コード: ゼロ以外(通常はタイムアウトを示す
124、または一般的なエラーの1) - タイミング: 呼び出しから
10秒から11秒の間で失敗 - 部分的出力: タイムアウト失敗の前に、承認スナップショットデータが表示される場合があります
- Effective Policyセクション: 実際のポリシーデータではなく、リテラルテキスト
Config unavailable.としてレンダリングされます
Gateway Health確認 - 誤ったレポートの裏付け
$ openclaw gateway status
Runtime: running
RPC Probe: ok
Version: 2026.4.12
Last Check: 2026-04-15T10:30:00Zタイムアウト延長時の正常実行
$ openclaw approvals get --gateway --timeout 60000
gateway: healthy
runtime: running
...
Effective Policy -> orion: approved, admin: approved
[Command exits 0]🧠 原因
RPC呼び出しの逐次実行パターン
openclaw approvals get --gateway コマンドは2つの異なるRPC呼び出しを逐次的に実行します:
- 呼び出し1: 承認スナップショット (
approvals.get_snapshot)- 完全な承認データセットを取得
- 正常なネットワークでは通常
50-500msで完了 - プライマリオルタプットテーブルに正常に登録
- 呼び出し2: Gateway設定 (
config.get)- Effective Policyレンダリング用のGateway設定を取得
- 出力の
Effective Policy列に必須 - 低スペックホストでは、この呼び出しに
30-45秒かかる場合があります
タイムアウト処理アーキテクチャ
// CLIの動作の擬似コード表現
func getApprovalsWithGateway(timeout_ms int) {
// ステップ1: 常に成功
snapshot := rpc.Call("approvals.get_snapshot")
printSnapshot(snapshot)
// ステップ2: タイムアウトで失敗、サイレントにキャッチ
defer func() {
if r := recover(); r != nil {
print("Effective Policy -> Config unavailable.")
}
}()
// この呼び出しはブロックし、タイムアウトを尊重
config := rpc.CallWithTimeout("config.get", timeout_ms)
printEffectivePolicy(config)
}
デフォルトタイムアウトの不十分さ
| パラメータ | 値 | 影響 |
|---|---|---|
--timeout デフォルト | 10000 (10秒) | 低速ホストには不十分 |
| 影響を受けるホストでの所要時間 | ~39,600ms | デフォルトの4倍 |
| 安全な閾値 | 60000 (60秒) | 低速ハードウェアで動作確認済み |
エラーメッセージの曖昧さ
CLIは2つの異なる失敗モードを一つの出力に統合しています:
- 真の不可能性: Gatewayに設定がない、または設定サービスが停止している
- タイムアウト: Gatewayは正常だが、RPCがCLIのタイムアウトより長くかかった
両方のシナリオで同一の出力が生成されます:Config unavailable.
影響を受けるコードパス
// ファイル: cli/commands/approvals/get.go (推定)
type GetCommand struct {
Timeout int `flag:"timeout,10000"` // <-- ハードコードされたデフォルト
}
func (c *GetCommand) Execute(ctx context.Context) error {
snapshot, err := c.client.GetSnapshot(ctx)
if err != nil {
return fmt.Errorf(“snapshot fetch failed: %w”, err)
}
// GatewayモードではEffective Policyにconfigが必要
if c.gatewayMode {
config, err := c.client.GetConfig(ctx, rpc.WithTimeout(c.Timeout))
if err != nil {
// 曖昧なエラー処理
fmt.Println("Config unavailable.")
// 部分的なデータが取得されたため、成功を返す
return nil
}
// ... configをレンダリング ...
}
}
🛠️ 解決手順
即座に適用可能な回避策(ユーザー側)
# 承認コマンドのタイムアウトを一時的にオーバーライド
openclaw approvals get --gateway --timeout 60000永続的な設定修復
OpenClaw CLI設定ファイルに以下を追加します:
# ファイル: ~/.config/openclaw/config または同等のもの
# Linux/macOSの場合: ~/.config/openclaw/config.yaml
# Windowsの場合: %APPDATA%\openclaw\config.yaml
approvals:
get:
timeout: 60000 # ミリ秒単位の60秒
gateway:
timeout: 60000環境変数によるオーバーライド
# 環境変数でタイムアウトを設定(サポートされている場合)
export OPENCLAW_APPROVALS_TIMEOUT=60000
export OPENCLAW_GATEWAY_TIMEOUT=60000
# その後、明示的なタイムアウトフラグなしで実行
openclaw approvals get --gateway永続的なエイリアス(Bash/Zsh)
# ~/.bashrc または ~/.zshrc に追加
alias openclaw-approvals='openclaw approvals get --gateway --timeout 60000'
# 使用方法
openclaw-approvalsSystemdサービスオーバーライド(デーモンモード)
# ドロップインオーバーライドを作成
mkdir -p /etc/systemd/system/openclaw-gateway.service.d/
cat > /etc/systemd/system/openclaw-gateway.service.d/timeout.conf << EOF
[Service]
Environment="OPENCLAW_RPC_TIMEOUT=60000"
ExecStartPost=/usr/bin/openclaw approvals warm-cache --timeout 60000
EOF
systemctl daemon-reload
systemctl restart openclaw-gateway修正前後の比較
| 状態 | コマンド | 出力 |
|---|---|---|
| 修正前(故障中) | openclaw approvals get --gateway | gateway timeout after 10000ms Effective Policy -> Config unavailable. |
| 修正後(正常) | openclaw approvals get --gateway --timeout 60000 | gateway: healthy Effective Policy -> orion: approved |
🧪 検証
予備チェック
# 1. OpenClawバージョンを確認
$ openclaw version
openclaw v2026.4.12 (commit: abc123)
# 2. Gatewayが正常か確認
$ openclaw gateway status
Runtime: running
RPC Probe: ok
Uptime: 7d 12h 34m機能検証
# 延長タイムアウトでテスト - 正常に完了するはず
$ openclaw approvals get --gateway --timeout 60000
gateway: healthy
runtime: running
APPROVALS SNAPSHOT
==================
ID | Subject | Policy | Expires
---------|-------------|-------------|------------------
uuid-001 | alice | orion | 2026-04-20
uuid-002 | bob | admin | 2026-04-25
Effective Policy
================
orion -> approved
admin -> approved
# 終了コードが0であることを確認
$ echo $?
0タイムアウト検出の動作確認
# 人為的に短いタイムアウトで期待されるエラーが発生することを確認
$ openclaw approvals get --gateway --timeout 100
gateway timeout after 100ms
# ゼロ以外の終了コードを確認
$ echo $?
124設定ファイルの構文検証
# 設定ファイルオーバーライドを使用する場合、YAML構文を検証
$ cat ~/.config/openclaw/config.yaml | python3 -c "import yaml, sys; yaml.safe_load(sys.stdin)"
# 出力なしは有効なYAMLを意味する
# 有効な設定を確認
$ openclaw config show --verbose 2>&1 | grep -i timeout回帰テストスイート
# CI/CD用のテストスクリプトを作成
#!/bin/bash
set -e
TIMEOUT_MS=60000
EXPECTED_EXIT=0
openclaw approvals get --gateway --timeout $TIMEOUT_MS > /tmp/output.txt
ACTUAL_EXIT=$?
if [ $ACTUAL_EXIT -ne $EXPECTED_EXIT ]; then
echo "FAIL: Expected exit $EXPECTED_EXIT, got $ACTUAL_EXIT"
cat /tmp/output.txt
exit 1
fi
if grep -q "Config unavailable" /tmp/output.txt; then
echo "FAIL: Output contains 'Config unavailable'"
cat /tmp/output.txt
exit 1
fi
if ! grep -q "Effective Policy" /tmp/output.txt; then
echo "FAIL: Output missing 'Effective Policy' section"
cat /tmp/output.txt
exit 1
fi
echo "PASS: Approvals command completed successfully"
exit 0⚠️ よくある落とし穴
環境固有のトラップ
- Dockerコンテナの資源制約
# メモリ/CPU制限のあるコンテナ内での実行は遅延を悪化させる可能性がある docker run --memory=256m --cpus=0.5 openclaw:latest approvals get --gateway --timeout 60000修正方法: コンテナのリソースを増やすか、
--network hostを使用してネットワークオーバーヘッドを削減します。 - Kubernetes Pod QoSクラス
BestEffortQoSのPodは、不規則なスケジューリング遅延を経験する可能性があります。# pod specに保証されたリソースが含まれていることを確認 resources: requests: memory: "256Mi" cpu: "500m" limits: memory: "512Mi" cpu: "1000m" - SSHトンネルのオーバーヘッド
SSHトンネルを介して実行されるコマンドは遅延を追加します。タイムアウトには
+10秒のバッファが必要な場合があります。# リモートホストから(SSHセッション内) ssh user@gateway-host "openclaw approvals get --gateway --timeout 60000"
設定エラー
- YAMLのインデント問題
# 間違い - タブまたは 잘못なインデント approvals: get: timeout: 60000正しい - 適切なYAMLインデント
approvals: get: timeout: 60000
- 競合する環境変数
環境変数が設定ファイルの値を予期せずオーバーライドする可能性があります。
# 実際に何が適用されているか確認 openclaw debug config --show-sources - 古い設定キャッシュ
CLIが設定をキャッシュしている可能性があります。強制的に再読み込みします。
openclaw config reload openclaw approvals get --gateway --timeout 60000
誤解のリスク
- 「Config unavailable」をポリシーの喪失と解釈する
オペレーターがパニックになり、不必要なポリシーの再デプロイを開始する可能性があります。
緩和策: 必ず最初に
openclaw gateway statusを実行して、実際のGateway健康状態を確認します。 - アップグレード後の回帰と想定する
OpenClawのアップグレードにより、新しいconfigフェッチパスが導入される場合があります。
緩和策: 回帰を想定する前に、changelogで
approvalsまたはgatewayの変更を確認します。
ネットワークの考慮事項
# Gatewayへの遅延テスト
ping -c 5 gateway-host
# RPCラウンドトリップタイミング
openclaw debug rpc ping --count 5 --format json
# ファイアウォール/MTUの問題
openclaw gateway status --verbose
# 出力で次を確認: "RPC latency: Xms"バージョン固有のメモ
| バージョン | 動作 |
|---|---|
< 2026.4.0 | タイムアウトフラグが存在しない可能性がある; 環境変数を使用 |
2026.4.0 - 2026.4.11 | デフォルトタイムアウトは10000ms |
2026.4.12+ | 問題が報告済み; 修正待ち |
🔗 関連するエラー
一般的な関連エラーコード
ETIMEDOUT/ 終了コード 124一般的なRPCタイムアウト。サーバー応答前にクライアント側のタイムアウトが発生したことを示します。
# 例 openclaw approvals get --gateway # Error: context deadline exceeded: timeout 10000msECONNREFUSEDGatewayが実行されていないか到達不能。タイムアウトとは区別されます。
$ openclaw gateway status Error: dial tcp 127.0.0.1:9090: connect: connection refusedgateway: unreachableGatewayプロセスが停止しているか、ネットワークパスがブロックされています。
config.get: context canceledクライアントが(Ctrl+Cなどで)リクエストを途中でキャンセルしました。
過去のイシュー
- Issue #4521: 低速ネットワークでのGateway statusハング
gateway statusコマンド同様のタイムアウト処理問題。v2026.3.0で--timeoutフラグを追加して修正済み。 - Issue #3890: Gatewayが正常なのにConfig unavailable
同じ症状パターンの早期報告。根本原因是設定サービスの初期化レース条件で(現時点で修正済み)。
- Issue #5102: Approval execフォールバックタイムアウト
フォールバックモードを使用した実行承認は、ハードコードされた5秒のタイムアウトにより誤検知が発生していました。
既知の誤検知パターン
| 症状 | 実際の状態 | 識別方法 |
|---|---|---|
| Config unavailable | タイムアウト(CLI) | Gateway statusは正常を表示 |
| Config unavailable | Configサービス初期化中 | Gateway statusは「initializing」を表示 |
| Config unavailable | 真の不可能性 | Gateway statusはエラーまたは低下を表示 |
| Effective Policyが空白 | 空のポリシーが設定されている | スナップショットにルールがない |
診断コマンドリファレンス
# 完全な診断スイート
openclaw gateway status --verbose
openclaw config show --effective
openclaw approvals list --all --format json
openclaw debug rpc stats --since 1hエスカレーション手順
openclaw gateway statusを実行して実際のGateway健康状態を確認- 延長タイムアウトで
openclaw approvals get --gateway --timeout 60000を実行 - 延長タイムアウトも失敗する場合、次を収集:
openclaw debug logs --since 5m - バージョン、OS、使用したタイムアウト、完全なエラー出力とともにイシューを報告