April 22, 2026 • バージョン: 2026.4.14

[TelegramグループスラッシュコマンドがOpenClaw 2026.4.12→2026.4.14へのアップグレード後に動作しなくなった] - Telegram Group Slash Commands Stop Working After OpenClaw 2026.4.12 → 2026.4.14 Upgrade

OpenClawバージョン upgrade 後、特定botアカウントのグループチャットでTelegramスラッシュコマンドピッカーおよび手動コマンドが失敗するリグレッション。ヘルスチェックは引き続きOKを報告します。

🔍 症状

主な症状

2026.4.12 から 2026.4.14 へのアップグレード後に以下の症状が見られました:

  • スラッシュコマンドピッカーの障害: Telegramグループで / を入力しても、Morty(@RickS_C137_bot)がネイティブコマンド自動補完UIに表示されません。
  • 手動コマンドの障害: /status@RickS_C137_bot を単独メッセージとして送信しても応答がありません。
  • シングルチェックマークの表示: 送信したコマンドメッセージにTelegramのチェックマークが1つだけ表示されます(サーバーにメッセージが配信済み)。2つ目のチェックマーク(ユーザーにメッセージが配信済み)は表示されず、コマンドが処理されなかったことを示しています。

診断コマンドの出力例

# ヘルスチェックはスラッシュコマンドが壊れていてもOKと報告する
$ openclawctl status telegram --account morty
Channel: telegram
Account: morty (@RickS_C137_bot)
Status: HEALTHY
Last ping: 2026-04-15T10:23:45Z
Commands registered: true

# しかしグループではスラッシュコマンドが表示されない
# (期待値: コマンドピッカーに /status、/help 等が表示される)
# (実際: 空の自動補完またはピッカーにMortyが表示されない)
# グループチャットからの手動コマンドテスト
$ /status@RickS_C137_bot
# (期待値: ボットがステータスで応答する)
# (実際: シングルチェックマーク、応答なし)

# 2026.4.14 のデバッグログ一部
[2026-04-15T10:24:01.123] DEBUG [telegram] Received update 123456789: {message: {...}, entities: [{type: "bot_command", ...}]}
[2026-04-15T10:24:01.124] WARN  [commands] Command "/status" not routed - no matching target for group context

環境コンテキスト

  • ホストプラットフォーム: Raspberry Pi 5
  • チャンネル: Telegram
  • 影響を受けるアカウント: morty@RickS_C137_bot
  • チャットタイプ: Telegramグループ(Dev Team)
  • 動作していたバージョン: 2026.4.12
  • 壊れたバージョン: 2026.4.14
  • コントロールボット: 2026.4.5 の別のボットは正常に動作中

🧠 原因

技術分析

このリグレッションは、2026.4.122026.4.14 のバージョン間でOpenClawがTelegramグループのコンテキスト内でコマンドターゲットを解決する方法の変更に起因しています。

障害の順序

  1. コマンド登録フェーズ(setMyCommands): ボットはTelegram Bot APIの setMyCommands を使用して正常にコマンドを登録します。これがヘルスチェックで「Commands registered: true」と報告される理由であり、2026.4.5 の別のボットが正常に動作し続ける理由でもあります。コマンド登録は影響を受けていません。
  2. コマンドルーティングフェーズ(受信アップデート): グループチャットでスラッシュコマンドが受信されると、Telegram Updateペイロードには以下が含まれます:
    {
      "message": {
        "chat": {"id": -123456789, "type": "group"},
        "text": "/status@RickS_C137_bot",
        "entities": [{"type": "bot_command", "offset": 0, "length": 21}]
      }
    }
  3. ターゲット解決の失敗: リグレッションにより、src/channels/telegram/command-routing.ts のロジックが変更され、メッセージがグループチャットから送信された場合、ボットメンション(@RickS_C137_bot)が設定済みアカウントに対してどのように検証されるかが変更されました。
  4. サイレントドロップ: ターゲット解決に失敗したコマンドは、エラー応答を返す代わりにサイレントにドロップされ、シングルチェックマーク症状(メッセージは配信されたが処理されなかった)が発生します。

アーキテクチャの不整合

2026.4.14 での変更により、グループのコンテキストにおけるコマンドターゲット解決に より厳密なマッチングアルゴリズムが使用されるようになりました:

// 2026.4.12 (動作していた)
function resolveCommandTarget(update, accounts) {
  if (update.message.chat.type === 'group') {
    // 有効なボットメンション付きコマンドを受け入れる
    return accounts.find(a => a.username === extractMention(update.message.text));
  }
  // ... シングルチャットのフォールバック
}

// 2026.4.14 (壊れている)
function resolveCommandTarget(update, accounts) {
  if (update.message.chat.type === 'group') {
    // 壊れている: メンションに加えてバインディングの一致を要求
    const binding = resolveGroupBinding(update.message.chat.id);
    const mentionedAccount = accounts.find(a => a.username === extractMention(update.message.text));
    if (binding && binding.account !== mentionedAccount?.name) {
      return null; // サイレントドロップ - 根本原因
    }
    return mentionedAccount;
  }
}

この追加のバインディングチェックは、以下の場合に有効なコマンドを誤ってフィルタリングします:

  • グループにプライマリバインディングがある(例:別のアカウントへのバインディング)
  • ユーザーが @RickS_C137_bot を明示的にメンションしてコマンドを送信する
  • メンションされたアカウント(morty)がバインドされたデフォルトではない

メンションはグループバインディングに関係なくそのボットを明示的にターゲットとしているため、コマンドは morty にルーティングされるべきです。

🛠️ 解決手順

オプションA: ロールバック(即時の救済)

サービスの即時復元が必要な場合:

# 2026.4.12 にロールバック
$ openclawctl downgrade --version 2026.4.12
Downgrading from 2026.4.14 to 2026.4.12...
Stopping OpenClaw service...
Rolling back binary...
Restoring configuration from backup...
Starting OpenClaw service...
Rollback complete.

$ openclawctl status
OpenClaw v2026.4.12
Status: RUNNING
All channels: HEALTHY

オプションB: パッチの適用(修正が利用可能な場合)

後続のリリース(例:2026.4.15+)でリグレッションがパッチされたら:

# パッチ適用バージョンにアップグレード
$ openclawctl upgrade --version latest
Upgrading to OpenClaw v2026.4.15 (contains fix for #XXXX)...
Downloading package...
Verifying checksum...
Stopping service...
Installing new binary...
Starting service...
Upgrade complete.

# 修正を確認
$ openclawctl status | grep version
OpenClaw v2026.4.15

オプションC: 設定による回避策

パッチを待つ間、グループバインディング設定を変更して影響を受けるアカウントを含めます:

注意: これは一時的な回避策であり、複数のボットが同じグループで応答する必要がある場合に意図しない副作用を引き起こす可能性があります。

# Before (2026.4.14 config) - causes the regression
channels:
  telegram:
    accounts:
      morty:
        apiToken: "${MORTY_TOKEN}"
        username: "RickS_C137_bot"
    bindings:
      - groupId: -123456789
        account: morty  # Only morty bound, other mentions dropped

# After (workaround) - allow all accounts in group
channels:
  telegram:
    accounts:
      morty:
        apiToken: "${MORTY_TOKEN}"
        username: "RickS_C137_bot"
    bindings:
      - groupId: -123456789
        account: "*"  # Wildcard allows any mentioned account

オプションD: 明示的なコマンドホワイトリスト(代替回避策)

ワイルドカードバインディングが望ましくない場合は、明示的なホワイトリストにグループコンテキストが含まれていることを確認します:

# 2026.4.14 の強化設定
channels:
  telegram:
    accounts:
      morty:
        apiToken: "${MORTY_TOKEN}"
        username: "RickS_C137_bot"

commands:
  native: "auto"
  nativeSkills: "auto"
  allowFrom:
    telegram:
      - group: -123456789  # Explicit group ID
        accounts:
          - morty
          - "*"  # Or other accounts that should respond

🧪 検証

検証手順

修正(ロールバック、アップグレード、または設定変更)を適用した後、以下の手順で修正を確認します:

ステップ1: サービスのヘルスチェック

$ openclawctl status
OpenClaw v2026.4.15
Status: RUNNING
Channels:
  telegram:morty: HEALTHY

ステップ2: コマンド登録の確認

$ openclawctl telegram commands list --account morty
Bot: @RickS_C137_bot
Registered commands:
  - /status
  - /help
  - /settings
  - /skills
Registration status: ACTIVE

ステップ3: スラッシュコマンドピッカーテスト(グループチャット)

Telegramグループ(Dev Team)で:

# 1. Clear any existing conversation with the bot
# 2. Navigate to the group chat
# 3. Type "/" - you should see @RickS_C137_bot in the autocomplete
# 4. Select "/status" - it should appear in the input field

期待結果: コマンドピッカーに /status@RickS_C137_bot/help@RickS_C137_bot 等が表示されます。

ステップ4: 手動コマンドテスト

# In the group chat, send:
/status@RickS_C137_bot

# Expected response: Bot replies with status information
# Expected indicator: Two checkmarks (message read)

ステップ5: デバッグログの確認

$ openclawctl logs --follow --filter telegram | grep -i command
[2026-04-15T10:30:01.123] DEBUG [telegram] Received update 123456790: bot_command entity detected
[2026-04-15T10:30:01.124] DEBUG [telegram] Resolved target account: morty
[2026-04-15T10:30:01.125] DEBUG [commands] Routing "/status" to skill: status
[2026-04-15T10:30:01.200] INFO  [commands] Command executed successfully: /status (took 75ms)

ステップ6: リグレッション確認テスト

# ボットメンション付きでテスト(2026.4.14で壊れていた)
/hello@RickS_C137_bot
# 期待値: ボットが応答(シングルチェックマークでドロップされない)

# メンションなしでテスト
/hello
# 期待値: グループバインディングされたアカウントにルーティング

成功基準

修正が検証済みとみなされるには、以下すべてに合格する必要があります:

  • openclawctl statusStatus: RUNNING とすべてのチャンネルが HEALTHY と表示される
  • Telegramスラッシュコマンドピッカーがグループで / を入力したときにボットのコマンドを表示する
  • /status@RickS_C137_bot が2つのチェックマーク付きで応答を返す
  • デバッグログに明示的にメンションされたコマンドに対して Resolved target account: morty と表示される

⚠️ よくある落とし穴

環境固有のトラップ

  • Raspberry Pi 5固有の問題: ARM64バイナリにはキャッシュの問題が発生する可能性があります。ロールバックまたはアップグレード後、バイナリキャッシュをクリアしてください: sudo rm -rf /var/cache/openclaw/binaries/* 然后再重启服务。
  • Dockerデプロイ: Dockerで実行している場合、バージョン変更後にコンテナを再作成(再起動ではなく)してください:
    $ docker-compose down
    $ docker-compose pull openclaw:2026.4.15
    $ docker-compose up -d
  • マルチアカウントTelegramセットアップ: バインディングで account: "*" を使用する回避策は、複数のボットが同じグループのメンバーである場合、複数のボットが同じコマンドに応答する可能性があります。

設定の間違い

  • グループID形式が不正: TelegramグループIDはチャットユーザー名や正の数ではなく、負の数形式(例:-123456789)を使用する必要があります。
  • ホワイトリストとブラックリストの混乱: commands.allowFrom.telegram セクションはホワイトリストモデルを使用します。アカウントがリストされていない場合、そのソースからのコマンドはサイレントにドロップされます。
  • 環境変数がリロードされていない: 設定変更後、環境変数が正しく読み込まれていることを確認してください:
    $ openclawctl config reload
    Configuration reloaded from /etc/openclaw/config.yaml
    

    影響を受けるアカウントが表示されることを確認

    $ openclawctl telegram accounts list

エッジケース

  • プレミアムグループと通常グループ: プレミアムグループは移行後に異なるグループID形式を使用している可能性があります。@userinfobot または @JSONDumpBot を使用してグループ内で正しいIDを確認してください。
  • グループ作成後に追加されたボット: ボットが初期設定後にグループに追加された場合、ボットがグループの管理者として再追加される必要がある場合があります。コマンドの可視性が正常に動作するために。
  • ボットプライバシーモード: 問題報告者がプライバシーモードが無効であることを確認していますが、BotFatherで /mybots → ボットを選択 → → ボット設定 → グループプライバシーを確認 → オフにしてください。
  • コマンドスコープ: Telegramコマンドにはスコープ設定があります。コマンドが ScopeType.PRIVATE(ではなく ScopeType.DEFAULT)で登録されていないことを確認してください:
    # BotFatherで確認
    /mybots > @RickS_C137_bot > Edit Bot > Edit Commands
    # すべてのコマンドはプライベートチャットに制限されず、全世界で表示される必要がある

診断の間違い

  • シングルチェックマークの誤解: シングルチェックマークは以下を意味することがあります:
    1. コマンドがサイレントにドロップされた(リグレッション症状)
    2. メッセージ配信のネットワーク問題
    3. ユーザーによってボットがブロックされた
    デバッグログを使用してこれらのケースを区別してください。
  • ヘルスチェックとコマンド機能の混同: ヘルスチェックはボットが送信メッセージと受信アップデートを行えることを確認します。コマンドルーティングは確認しません。実際のスラッシュコマンドで常にテストしてください。

🔗 関連するエラー

直接関連する問題

  • "Bot command autocomplete not showing in groups"(Telegram Bot API) - setMyCommands スコープ設定とプライバシーモードに関連。プライベートチャットではコマンドが見えるがグループピッカーでは見えないという症状。
  • "Commands silently dropped in multi-account setups" - 複数のTelegramアカウントが設定されている場合のコマンドターゲット解決に関する過去の機能強化。2026.4.8 での以前の変更が部分的に元に戻された可能性があります。

似た症状、異なる原因

  • E_TELEGRAM_COMMAND_NO_TARGET - アカウントがボットメンションと一致しない場合に発生。設定の問題を示唆し、リグレッションではありません。
  • E_TELEGRAM_BOT_NOT_IN_GROUP - ボットはグループに参加している必要があります。BotFatherの /mybots で確認してください。
  • E_TELEGRAM_PRIVACY_MODE_ENABLED(ノンブロッキング警告) - プライバシーモードはボットが受信するメッセージを制限します。無効にするとグループメッセージへのアクセスが復元されます。
  • E_COMMAND_ROUTING_GROUP_CONTEXT - グループバインディング解決に失敗した場合の内部エラー。バインディング設定を確認してください。
  • E_TELEGRAM_API_ERROR 400: Bad Request: chat not found - 通常は設定内のグループID形式が正しくないことを示します。

バージョン履歴のコンテキスト

  • 2026.4.5 - コントロールボットの正常動作バージョン。比較のベースライン。
  • 2026.4.8 - マルチアカウントコマンドルーティングの以前の変更。このリグレッションはこの変更の一部を取り消した可能性があります。
  • 2026.4.12 - 最後に正常に動作していたバージョン。2026.4.14 でリグレッションが導入されました。
  • 2026.4.14 - 影響を受けるバージョン。グループのコンテキストでのコマンドターゲット解決にリグレッションが含まれています。

関連する設定エリア

  • channels.telegram.accounts.*.username - ボットのTelegramユーザー名と正確に一致する必要があります(APIでは大文字小文字を区別しませんが、確認してください)。
  • channels.telegram.bindings - コマンドルーティングに影響するグループからアカウントへのマッピング。
  • commands.nativecommands.nativeSkills - コマンド登録の可視性を制御します。
  • commands.allowFrom.telegram - コマンドソースの明示的なホワイトリスト。

エビデンスとソース

このトラブルシューティングガイドは、FixClaw Intelligence パイプラインによってコミュニティの議論から自動的に合成されました。