Skip to content

管理者コマンド・運営ツール / Admin Commands & Operations Tools

概要 / Overview

ライブ配信中に運営が介入するための管理コマンド設計。緊急停止・再開、パラメータ強制変更、NGワード管理、イベント強制トリガーなど、安全かつ迅速に配信を制御する仕組みを定義する。

Admin command design for operator intervention during live streaming. Defines mechanisms for emergency stop/resume, parameter overrides, NG word management, forced event triggers, and other controls to manage the broadcast safely and quickly.

認証方式 / Authentication

API Key 認証 / API Key Authentication

シンプルなAPI Keyベースの認証を採用する。管理者コマンドは少人数の運営チームのみが使用するため、OAuth等の複雑な認証は不要。

Simple API Key-based authentication. Since admin commands are used only by a small operations team, complex auth like OAuth is unnecessary.

# 環境変数で管理 / Managed via environment variables
ADMIN_API_KEY=sk-admin-xxxxxxxxxxxxxxxxxxxx

認証フロー / Authentication Flow

┌─────────────────┐
│ Admin Client    │
│ (Browser/CLI)   │
└────────┬────────┘

         │ 1. WebSocket接続時にAPI Keyを送信
         │    Send API Key on WebSocket connection


┌─────────────────────────────────────────────┐
│ Backend Server (Node.js)                     │
│                                              │
│  ┌─────────────────────────────────────┐    │
│  │ Auth Middleware                       │    │
│  │                                      │    │
│  │  1. API Key検証 / Validate API Key   │    │
│  │  2. Rate Limit確認 / Check rate limit│    │
│  │  3. Audit Log記録 / Write audit log  │    │
│  └──────────────────────┬──────────────┘    │
│                          │                   │
│                    ✓ Authenticated            │
│                          │                   │
│                          ▼                   │
│  ┌─────────────────────────────────────┐    │
│  │ Admin Command Handler                │    │
│  └─────────────────────────────────────┘    │
└──────────────────────────────────────────────┘

WebSocket 接続 / WebSocket Connection

管理者用WebSocketは、通常のゲーム用WebSocketとは別のパス /ws/admin で接続する。

Admin WebSocket connects on a separate path /ws/admin, distinct from the regular game WebSocket.

typescript
// クライアント側 / Client side
const ws = new WebSocket('ws://localhost:3000/ws/admin');

ws.onopen = () => {
  // 接続後、最初に認証メッセージを送信
  // Send auth message immediately after connection
  ws.send(JSON.stringify({
    type: 'admin:auth',
    apiKey: 'sk-admin-xxxxxxxxxxxxxxxxxxxx'
  }));
};
typescript
// サーバー側 / Server side
wss.on('connection', (ws, req) => {
  if (req.url === '/ws/admin') {
    // 認証待ち状態(10秒以内に認証必須)
    // Awaiting auth (must authenticate within 10 seconds)
    const authTimeout = setTimeout(() => ws.close(4001, 'Auth timeout'), 10000);

    ws.once('message', (data) => {
      const msg = JSON.parse(data.toString());
      if (msg.type === 'admin:auth' && msg.apiKey === process.env.ADMIN_API_KEY) {
        clearTimeout(authTimeout);
        ws.isAdmin = true;
        ws.send(JSON.stringify({ type: 'admin:auth_ok' }));
      } else {
        ws.close(4003, 'Invalid API key');
      }
    });
  }
});

セキュリティ要件 / Security Requirements

要件 / Requirement詳細 / Detail
API Key 長 / Key length最低32文字 / Minimum 32 characters
通信暗号化 / Encrypted transportローカル以外はWSS (TLS) 必須 / WSS required except localhost
Rate Limit1分あたり60コマンドまで / Max 60 commands per minute
IP制限 / IP restriction設定可能。デフォルトはlocalhost only / Configurable. Default: localhost only
Audit Log全コマンドを日時・操作者と共に記録 / Log all commands with timestamp & operator
Key Rotation定期的なキー更新を推奨 / Periodic key rotation recommended

コマンドフォーマット / Command Format

リクエスト / Request

全コマンドはJSON形式でWebSocket経由で送信する。

All commands are sent as JSON via WebSocket.

typescript
interface AdminCommand {
  type: string;        // コマンド種別 e.g. "admin:emergency_stop"
  payload?: object;    // コマンド固有データ / Command-specific data
  requestId?: string;  // レスポンス照合用 (UUID) / For response correlation
}

レスポンス / Response

typescript
interface AdminResponse {
  type: 'admin:result';
  requestId?: string;  // リクエストのrequestIdを返す / Echo request ID
  success: boolean;
  command: string;     // 実行されたコマンド / Executed command type
  data?: object;       // コマンド固有の返却データ / Command-specific return data
  error?: string;      // エラー時のメッセージ / Error message if failed
  timestamp: string;   // ISO 8601
}

エラーコード / Error Codes

Code意味 / Meaning
AUTH_FAILED認証失敗 / Authentication failed
AUTH_TIMEOUT認証タイムアウト / Auth timed out
RATE_LIMITEDレート制限超過 / Rate limit exceeded
INVALID_COMMAND不明なコマンド / Unknown command type
INVALID_PAYLOADペイロード不正 / Invalid payload data
TARGET_NOT_FOUND指定対象が存在しない / Specified target not found
ALREADY_IN_STATE既にその状態 / Already in requested state
INTERNAL_ERRORサーバー内部エラー / Internal server error

コマンド一覧 / Command List

1. 緊急停止・再開 / Emergency Stop & Resume

配信中の緊急事態に即座に対応する。停止中はゲームループ・LLM呼び出し・投げ銭処理が全て一時停止し、フロントエンドには「メンテナンス中」を表示する。

Respond immediately to emergencies during streaming. While stopped, the game loop, LLM calls, and tip processing are all paused. Frontend displays "Under Maintenance".

admin:emergency_stop

json
{
  "type": "admin:emergency_stop",
  "payload": {
    "reason": "Inappropriate content detected"
  }
}
FieldTypeRequiredDescription
reasonstringYes停止理由(Audit Logに記録) / Stop reason (logged in audit)

動作 / Behavior:

  1. ゲームループ即時停止 / Immediately stop game loop
  2. 進行中のLLM呼び出しをキャンセル / Cancel in-progress LLM calls
  3. 投げ銭キューを一時保留 / Hold tip queue
  4. フロントエンドに「メンテナンス中 / Under Maintenance」表示を指示 / Instruct frontend to show maintenance screen
  5. 全状態をSQLiteに保存 / Persist all state to SQLite

admin:resume

json
{
  "type": "admin:resume",
  "payload": {
    "reason": "Issue resolved"
  }
}
FieldTypeRequiredDescription
reasonstringYes再開理由 / Resume reason

動作 / Behavior:

  1. SQLiteから状態を復元 / Restore state from SQLite
  2. 保留中の投げ銭キューを再処理 / Re-process held tip queue
  3. ゲームループ再開 / Resume game loop
  4. フロントエンドのメンテナンス画面を解除 / Remove maintenance screen from frontend

2. パラメータ強制変更 / Parameter Override

キャラクターのステータスやゲーム状態を直接変更する。バランス調整やトラブル対応に使用。

Directly modify character statuses or game state. Used for balance adjustments and troubleshooting.

admin:set_status

キャラクターのステータス値を強制変更する。

Force-change a character's status values.

json
{
  "type": "admin:set_status",
  "payload": {
    "character": "john",
    "status": {
      "hunger": 80,
      "mood": 70,
      "energy": 90,
      "stress": 20
    }
  }
}
FieldTypeRequiredDescription
character"john" | "sara" | "eve"Yes対象キャラクター / Target character
statusobjectYes変更するステータス(部分指定可) / Status to change (partial OK)
status.hungernumber (0-100)No空腹度 / Hunger
status.moodnumber (0-100)No気分 / Mood
status.energynumber (0-100)No体力 / Energy
status.stressnumber (0-100)Noストレス / Stress

admin:set_love

John と Sara の親密度を強制変更する。

Force-change the love level between John and Sara.

json
{
  "type": "admin:set_love",
  "payload": {
    "value": 60
  }
}
FieldTypeRequiredDescription
valuenumber (0-100)Yes親密度(下限40のフロアは維持) / Love level (floor of 40 still applies)

親密度フロア / Love Floor

risks.md で定義されている通り、親密度の下限は40。admin:set_love で40未満を指定した場合、40に自動補正される。ただし force: true を指定すると下限を無視できる(テスト・デバッグ用)。

As defined in risks.md, love has a floor of 40. Values below 40 are auto-corrected to 40 unless force: true is specified (for testing/debugging only).

admin:set_money

所持金(LifeCoin残高)を強制変更する。

Force-change the LifeCoin balance.

json
{
  "type": "admin:set_money",
  "payload": {
    "value": 5000
  }
}
FieldTypeRequiredDescription
valuenumber (>= 0)YesLifeCoin残高 / LifeCoin balance

admin:set_time

ゲーム内時刻・日数を強制変更する。

Force-change the in-game time and day count.

json
{
  "type": "admin:set_time",
  "payload": {
    "gameDay": 15,
    "gameHour": 14,
    "gameMinute": 30
  }
}
FieldTypeRequiredDescription
gameDaynumberNoゲーム内日数 / In-game day number
gameHournumber (0-23)Noゲーム内時間 / In-game hour
gameMinutenumber (0-59)Noゲーム内分 / In-game minute

3. NGワード管理 / NG Word Management

コメントフィルタのNGワードリストを動的に追加・削除する。再起動不要で即時反映。

Dynamically add/remove NG words from the comment filter. Applied immediately without restart.

admin:ng_add

json
{
  "type": "admin:ng_add",
  "payload": {
    "words": ["spam_word_1", "spam_word_2"],
    "type": "exact"
  }
}
FieldTypeRequiredDescription
wordsstring[]Yes追加するNGワード / NG words to add
type"exact" | "partial" | "regex"Noマッチ方式(デフォルト: "partial") / Match type (default: "partial")

マッチ方式 / Match Types:

  • exact — 完全一致 / Exact match
  • partial — 部分一致(デフォルト) / Partial match (default)
  • regex — 正規表現 / Regular expression

admin:ng_remove

json
{
  "type": "admin:ng_remove",
  "payload": {
    "words": ["spam_word_1"]
  }
}
FieldTypeRequiredDescription
wordsstring[]Yes削除するNGワード / NG words to remove

admin:ng_list

現在のNGワードリストを取得する。

Get the current NG word list.

json
{
  "type": "admin:ng_list"
}

レスポンス / Response:

json
{
  "type": "admin:result",
  "success": true,
  "command": "admin:ng_list",
  "data": {
    "words": [
      { "word": "spam_word_1", "type": "partial", "addedAt": "2026-03-11T10:00:00Z" },
      { "word": "bad_regex.*", "type": "regex", "addedAt": "2026-03-11T11:30:00Z" }
    ],
    "total": 2
  }
}

4. イベント強制トリガー / Forced Event Trigger

投げ銭なしでイベントを強制発火する。テスト・演出調整・特別配信に使用。

Force-trigger events without tips. Used for testing, effect tuning, and special broadcasts.

admin:trigger_event

json
{
  "type": "admin:trigger_event",
  "payload": {
    "eventId": "wedding",
    "params": {}
  }
}
FieldTypeRequiredDescription
eventIdstringYesイベントID(events_master.json のキー) / Event ID (key from events_master.json)
paramsobjectNoイベント固有パラメータ / Event-specific parameters

主要イベントID / Key Event IDs:

eventId説明 / Description
tip_itemアイテム出現(itemId パラメータ必須) / Item spawn (requires itemId param)
amusement_park遊園地デート / Amusement park date
wedding結婚式 / Wedding
moving_3ldk3LDK引っ越し / Moving to 3LDK
overseas_trip海外旅行 / Overseas trip
seasonal_cherry桜イベント / Cherry blossom event
seasonal_fireworks花火大会 / Fireworks festival
seasonal_snow雪景色 / Snow scene
seasonal_christmasクリスマス / Christmas
makeup仲直りイベント / Makeup event

admin:trigger_action

キャラクターに特定のアクションを強制実行させる。

Force a character to perform a specific action.

json
{
  "type": "admin:trigger_action",
  "payload": {
    "character": "john",
    "action": "cook",
    "dialogue": "今日は特別にフルコース作るよ! / I'll make a full course meal today!"
  }
}
FieldTypeRequiredDescription
character"john" | "sara" | "eve"Yes対象キャラクター / Target character
actionstringYesアクションカテゴリ(gameplay.md 参照) / Action category (see gameplay.md)
dialoguestringNo強制セリフ(省略時はLLM生成) / Forced dialogue (LLM generates if omitted)

5. 状態確認・インスペクション / State Inspection

現在のゲーム状態を確認する。デバッグやトラブルシューティングに使用。

Inspect the current game state. Used for debugging and troubleshooting.

admin:get_state

ゲーム全体の状態スナップショットを取得する。

Get a full game state snapshot.

json
{
  "type": "admin:get_state"
}

レスポンス / Response:

json
{
  "type": "admin:result",
  "success": true,
  "command": "admin:get_state",
  "data": {
    "gameDay": 7,
    "gameTime": "14:30",
    "isRunning": true,
    "lifeCoinBalance": 3500,
    "totalTipsReceived": 12000,
    "characters": {
      "john": {
        "action": "cook",
        "position": { "x": 5, "y": 3 },
        "status": { "hunger": 45, "mood": 72, "energy": 60, "stress": 35 }
      },
      "sara": {
        "action": "work",
        "position": { "x": 8, "y": 6 },
        "status": { "hunger": 50, "mood": 65, "energy": 55, "stress": 40 }
      },
      "eve": {
        "action": "nap",
        "position": { "x": 6, "y": 4 },
        "status": { "hunger": 60, "mood": 80, "energy": 40, "stress": 10 }
      }
    },
    "love": 68,
    "eveBond": 55,
    "currentCycle": 42,
    "nextCycleAt": "2026-03-11T14:40:00Z",
    "pendingTips": 0,
    "pendingComments": 8,
    "items": ["kotatsu", "bookshelf", "microwave"],
    "unlockedEvents": ["seasonal_cherry", "seasonal_fireworks"]
  }
}

admin:get_logs

直近のゲームログを取得する。

Get recent game logs.

json
{
  "type": "admin:get_logs",
  "payload": {
    "count": 50,
    "filter": "all"
  }
}
FieldTypeRequiredDescription
countnumberNo取得件数(デフォルト: 50、最大: 500) / Number of entries (default: 50, max: 500)
filter"all" | "actions" | "tips" | "comments" | "errors" | "admin"Noログ種別フィルタ / Log type filter

admin:get_queue

現在の投げ銭キュー・コメントキューの状態を取得する。

Get the current tip queue and comment queue status.

json
{
  "type": "admin:get_queue"
}

6. 配信制御 / Broadcast Control

配信に関連する制御コマンド。

Commands related to broadcast control.

admin:send_announcement

画面上にアナウンスメッセージを表示する。

Display an announcement message on screen.

json
{
  "type": "admin:send_announcement",
  "payload": {
    "message": "まもなくメンテナンスに入ります / Maintenance starting soon",
    "duration": 30,
    "style": "info"
  }
}
FieldTypeRequiredDescription
messagestringYes表示メッセージ / Display message
durationnumberNo表示秒数(デフォルト: 10) / Display duration in seconds (default: 10)
style"info" | "warning" | "error"No表示スタイル(デフォルト: "info") / Display style (default: "info")

admin:skip_cycle

現在の10分サイクルを即座に終了し、次のサイクルを開始する。

Immediately end the current 10-minute cycle and start the next one.

json
{
  "type": "admin:skip_cycle"
}

admin:set_cycle_interval

10分サイクルの間隔を一時的に変更する(テスト・デバッグ用)。

Temporarily change the 10-minute cycle interval (for testing/debugging).

json
{
  "type": "admin:set_cycle_interval",
  "payload": {
    "intervalMinutes": 5
  }
}
FieldTypeRequiredDescription
intervalMinutesnumber (1-30)Yesサイクル間隔(分) / Cycle interval in minutes

7. メモリ管理 / Memory Management

AIエージェントの記憶を管理する。

Manage AI agent memories.

admin:memory_list

エージェントの記憶一覧を取得する。

List an agent's memories.

json
{
  "type": "admin:memory_list",
  "payload": {
    "character": "john",
    "count": 20
  }
}

admin:memory_delete

特定の記憶を削除する(不適切な記憶の除去)。

Delete a specific memory (remove inappropriate memories).

json
{
  "type": "admin:memory_delete",
  "payload": {
    "character": "john",
    "memoryId": "mem_xxxx"
  }
}

admin:memory_inject

記憶を手動で注入する(シナリオ誘導用)。

Manually inject a memory (for scenario guidance).

json
{
  "type": "admin:memory_inject",
  "payload": {
    "character": "sara",
    "content": "今日はジョンの誕生日だと思い出した / Remembered that today is John's birthday",
    "importance": 0.9,
    "type": "episodic"
  }
}
FieldTypeRequiredDescription
character"john" | "sara" | "eve"Yes対象キャラクター / Target character
contentstringYes記憶内容 / Memory content
importancenumber (0.0-1.0)No重要度(デフォルト: 0.5) / Importance (default: 0.5)
type"episodic" | "semantic"No記憶タイプ(デフォルト: "episodic") / Memory type (default: "episodic")

コマンド一覧表 / Command Summary Table

CommandCategoryDescription (JP)Description (EN)
admin:emergency_stop緊急ゲーム緊急停止Emergency stop
admin:resume緊急ゲーム再開Resume game
admin:set_statusパラメータキャラステータス変更Change character status
admin:set_loveパラメータ親密度変更Change love level
admin:set_moneyパラメータ所持金変更Change LifeCoin balance
admin:set_timeパラメータゲーム内時刻変更Change in-game time
admin:ng_addNG管理NGワード追加Add NG words
admin:ng_removeNG管理NGワード削除Remove NG words
admin:ng_listNG管理NGワード一覧取得List NG words
admin:trigger_eventイベントイベント強制発火Force-trigger event
admin:trigger_actionイベントアクション強制実行Force character action
admin:get_state確認ゲーム状態取得Get game state
admin:get_logs確認ログ取得Get logs
admin:get_queue確認キュー状態取得Get queue status
admin:send_announcement配信アナウンス表示Show announcement
admin:skip_cycle配信サイクルスキップSkip current cycle
admin:set_cycle_interval配信サイクル間隔変更Change cycle interval
admin:memory_listメモリ記憶一覧List memories
admin:memory_deleteメモリ記憶削除Delete memory
admin:memory_injectメモリ記憶注入Inject memory

実装アーキテクチャ / Implementation Architecture

ディレクトリ構成 / Directory Structure

packages/backend/src/
├── admin/
│   ├── AdminWebSocketHandler.ts   # WebSocket接続・認証管理
│   ├── AdminCommandRouter.ts      # コマンドルーティング
│   ├── AdminAuthMiddleware.ts     # API Key検証・Rate Limit
│   ├── AdminAuditLogger.ts        # 監査ログ
│   └── commands/
│       ├── EmergencyCommands.ts    # 緊急停止・再開
│       ├── ParameterCommands.ts   # パラメータ変更
│       ├── NgWordCommands.ts      # NGワード管理
│       ├── EventCommands.ts       # イベントトリガー
│       ├── InspectionCommands.ts  # 状態確認
│       ├── BroadcastCommands.ts   # 配信制御
│       └── MemoryCommands.ts      # メモリ管理
└── server.ts                      # Express + WebSocket (admin path追加)

コマンドルーター / Command Router

typescript
// AdminCommandRouter.ts
type CommandHandler = (payload: unknown) => Promise<AdminResponse>;

class AdminCommandRouter {
  private handlers: Map<string, CommandHandler> = new Map();

  register(command: string, handler: CommandHandler): void {
    this.handlers.set(command, handler);
  }

  async execute(command: string, payload: unknown): Promise<AdminResponse> {
    const handler = this.handlers.get(command);
    if (!handler) {
      return { success: false, error: 'INVALID_COMMAND' };
    }
    return handler(payload);
  }
}

監査ログ / Audit Log

全管理コマンドの実行を記録する。SQLiteの admin_audit_log テーブルに保存。

All admin command executions are recorded. Stored in the admin_audit_log table in SQLite.

sql
CREATE TABLE admin_audit_log (
  id          INTEGER PRIMARY KEY AUTOINCREMENT,
  timestamp   TEXT NOT NULL DEFAULT (datetime('now')),
  command     TEXT NOT NULL,
  payload     TEXT,          -- JSON
  success     INTEGER NOT NULL,  -- 0 or 1
  error       TEXT,
  ip_address  TEXT,
  duration_ms INTEGER
);
# ログ例 / Log example
[2026-03-11T14:30:00Z] ADMIN admin:set_status {"character":"john","status":{"mood":80}} → OK (12ms)
[2026-03-11T14:31:00Z] ADMIN admin:emergency_stop {"reason":"Test"} → OK (3ms)
[2026-03-11T14:35:00Z] ADMIN admin:resume {"reason":"Test complete"} → OK (45ms)

管理画面(将来) / Admin Dashboard (Future)

MVP段階ではWebSocket経由のCLI/スクリプトでの操作を想定するが、将来的にはブラウザベースの管理画面を構築する。

For MVP, operations are performed via CLI/scripts over WebSocket. A browser-based admin dashboard will be built in the future.

┌─────────────────────────────────────────────────────────────┐
│ Admin Dashboard (future)                                     │
│                                                              │
│  ┌──────────────────────────────────────────────────────┐   │
│  │ Status Monitor                                        │   │
│  │  John: cooking (hunger:45 mood:72)                    │   │
│  │  Sara: working  (hunger:50 mood:65)                   │   │
│  │  Eve:  napping  (hunger:60 mood:80)                   │   │
│  │  Love: 68  |  LifeCoin: 3,500  |  Day: 7              │   │
│  └──────────────────────────────────────────────────────┘   │
│                                                              │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐   │
│  │ 緊急停止  │ │ 再開     │ │ スキップ  │ │ アナウンス    │   │
│  │ STOP     │ │ RESUME   │ │ SKIP     │ │ ANNOUNCE     │   │
│  └──────────┘ └──────────┘ └──────────┘ └──────────────┘   │
│                                                              │
│  ┌──────────────────────────────────────────────────────┐   │
│  │ Recent Logs / Audit Trail                             │   │
│  │  14:30 - admin:set_status john mood=80                │   │
│  │  14:25 - Cycle #42 completed                          │   │
│  │  14:20 - Tip 500LC from yuki_chan                      │   │
│  └──────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

セキュリティ考慮事項 / Security Considerations

1. ネットワーク分離 / Network Isolation

┌───────────────────────────────────────────────────┐
│ Production Environment                             │
│                                                    │
│  Port 3000: Game WebSocket (public)                │
│    └─ /ws/game  ← Viewer frontend connects here   │
│                                                    │
│  Port 3000: Admin WebSocket (restricted)           │
│    └─ /ws/admin ← Admin only, IP restricted        │
│                                                    │
│  Firewall: /ws/admin は localhost or VPN のみ       │
│            /ws/admin accessible from localhost/VPN  │
└───────────────────────────────────────────────────┘

2. 危険コマンドの安全策 / Safeguards for Dangerous Commands

コマンド / Command安全策 / Safeguard
emergency_stop確認不要(緊急時は即時実行) / No confirmation (immediate in emergencies)
set_love (< 40)force: true が必要 / Requires force: true
set_money (< 0)拒否 / Rejected
memory_delete削除前に対象記憶の内容をレスポンスに含める / Include memory content in response before deletion
memory_injectimportance > 0.8 は警告ログ出力 / Warning log for importance > 0.8
trigger_event (Tier 5)高額イベントは確認ログを強化 / Enhanced logging for expensive events

3. Rate Limiting 詳細 / Rate Limiting Details

typescript
const RATE_LIMITS = {
  global: { max: 60, windowMs: 60_000 },    // 全コマンド合計 / All commands total
  emergency: { max: 5, windowMs: 60_000 },   // 緊急コマンド / Emergency commands
  parameter: { max: 30, windowMs: 60_000 },  // パラメータ変更 / Parameter changes
  event: { max: 10, windowMs: 60_000 },      // イベントトリガー / Event triggers
};

4. 本番環境チェックリスト / Production Checklist

  • [ ] ADMIN_API_KEY が環境変数に設定済み / ADMIN_API_KEY set in environment
  • [ ] API Key が32文字以上 / API Key is 32+ characters
  • [ ] /ws/admin が localhost/VPN のみアクセス可 / /ws/admin restricted to localhost/VPN
  • [ ] WSS (TLS) が有効(リモートアクセス時) / WSS (TLS) enabled for remote access
  • [ ] Audit Log テーブルが作成済み / Audit log table created
  • [ ] Rate Limit が設定済み / Rate limits configured
  • [ ] 緊急停止のテスト完了 / Emergency stop tested
  • [ ] 緊急停止後の再開テスト完了 / Resume after emergency stop tested