管理者コマンド・運営ツール / 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.
// クライアント側 / 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'
}));
};// サーバー側 / 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 Limit | 1分あたり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.
interface AdminCommand {
type: string; // コマンド種別 e.g. "admin:emergency_stop"
payload?: object; // コマンド固有データ / Command-specific data
requestId?: string; // レスポンス照合用 (UUID) / For response correlation
}レスポンス / Response
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
{
"type": "admin:emergency_stop",
"payload": {
"reason": "Inappropriate content detected"
}
}| Field | Type | Required | Description |
|---|---|---|---|
reason | string | Yes | 停止理由(Audit Logに記録) / Stop reason (logged in audit) |
動作 / Behavior:
- ゲームループ即時停止 / Immediately stop game loop
- 進行中のLLM呼び出しをキャンセル / Cancel in-progress LLM calls
- 投げ銭キューを一時保留 / Hold tip queue
- フロントエンドに「メンテナンス中 / Under Maintenance」表示を指示 / Instruct frontend to show maintenance screen
- 全状態をSQLiteに保存 / Persist all state to SQLite
admin:resume
{
"type": "admin:resume",
"payload": {
"reason": "Issue resolved"
}
}| Field | Type | Required | Description |
|---|---|---|---|
reason | string | Yes | 再開理由 / Resume reason |
動作 / Behavior:
- SQLiteから状態を復元 / Restore state from SQLite
- 保留中の投げ銭キューを再処理 / Re-process held tip queue
- ゲームループ再開 / Resume game loop
- フロントエンドのメンテナンス画面を解除 / 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.
{
"type": "admin:set_status",
"payload": {
"character": "john",
"status": {
"hunger": 80,
"mood": 70,
"energy": 90,
"stress": 20
}
}
}| Field | Type | Required | Description |
|---|---|---|---|
character | "john" | "sara" | "eve" | Yes | 対象キャラクター / Target character |
status | object | Yes | 変更するステータス(部分指定可) / Status to change (partial OK) |
status.hunger | number (0-100) | No | 空腹度 / Hunger |
status.mood | number (0-100) | No | 気分 / Mood |
status.energy | number (0-100) | No | 体力 / Energy |
status.stress | number (0-100) | No | ストレス / Stress |
admin:set_love
John と Sara の親密度を強制変更する。
Force-change the love level between John and Sara.
{
"type": "admin:set_love",
"payload": {
"value": 60
}
}| Field | Type | Required | Description |
|---|---|---|---|
value | number (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.
{
"type": "admin:set_money",
"payload": {
"value": 5000
}
}| Field | Type | Required | Description |
|---|---|---|---|
value | number (>= 0) | Yes | LifeCoin残高 / LifeCoin balance |
admin:set_time
ゲーム内時刻・日数を強制変更する。
Force-change the in-game time and day count.
{
"type": "admin:set_time",
"payload": {
"gameDay": 15,
"gameHour": 14,
"gameMinute": 30
}
}| Field | Type | Required | Description |
|---|---|---|---|
gameDay | number | No | ゲーム内日数 / In-game day number |
gameHour | number (0-23) | No | ゲーム内時間 / In-game hour |
gameMinute | number (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
{
"type": "admin:ng_add",
"payload": {
"words": ["spam_word_1", "spam_word_2"],
"type": "exact"
}
}| Field | Type | Required | Description |
|---|---|---|---|
words | string[] | Yes | 追加するNGワード / NG words to add |
type | "exact" | "partial" | "regex" | No | マッチ方式(デフォルト: "partial") / Match type (default: "partial") |
マッチ方式 / Match Types:
exact— 完全一致 / Exact matchpartial— 部分一致(デフォルト) / Partial match (default)regex— 正規表現 / Regular expression
admin:ng_remove
{
"type": "admin:ng_remove",
"payload": {
"words": ["spam_word_1"]
}
}| Field | Type | Required | Description |
|---|---|---|---|
words | string[] | Yes | 削除するNGワード / NG words to remove |
admin:ng_list
現在のNGワードリストを取得する。
Get the current NG word list.
{
"type": "admin:ng_list"
}レスポンス / Response:
{
"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
{
"type": "admin:trigger_event",
"payload": {
"eventId": "wedding",
"params": {}
}
}| Field | Type | Required | Description |
|---|---|---|---|
eventId | string | Yes | イベントID(events_master.json のキー) / Event ID (key from events_master.json) |
params | object | No | イベント固有パラメータ / 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_3ldk | 3LDK引っ越し / 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.
{
"type": "admin:trigger_action",
"payload": {
"character": "john",
"action": "cook",
"dialogue": "今日は特別にフルコース作るよ! / I'll make a full course meal today!"
}
}| Field | Type | Required | Description |
|---|---|---|---|
character | "john" | "sara" | "eve" | Yes | 対象キャラクター / Target character |
action | string | Yes | アクションカテゴリ(gameplay.md 参照) / Action category (see gameplay.md) |
dialogue | string | No | 強制セリフ(省略時は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.
{
"type": "admin:get_state"
}レスポンス / Response:
{
"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.
{
"type": "admin:get_logs",
"payload": {
"count": 50,
"filter": "all"
}
}| Field | Type | Required | Description |
|---|---|---|---|
count | number | No | 取得件数(デフォルト: 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.
{
"type": "admin:get_queue"
}6. 配信制御 / Broadcast Control
配信に関連する制御コマンド。
Commands related to broadcast control.
admin:send_announcement
画面上にアナウンスメッセージを表示する。
Display an announcement message on screen.
{
"type": "admin:send_announcement",
"payload": {
"message": "まもなくメンテナンスに入ります / Maintenance starting soon",
"duration": 30,
"style": "info"
}
}| Field | Type | Required | Description |
|---|---|---|---|
message | string | Yes | 表示メッセージ / Display message |
duration | number | No | 表示秒数(デフォルト: 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.
{
"type": "admin:skip_cycle"
}admin:set_cycle_interval
10分サイクルの間隔を一時的に変更する(テスト・デバッグ用)。
Temporarily change the 10-minute cycle interval (for testing/debugging).
{
"type": "admin:set_cycle_interval",
"payload": {
"intervalMinutes": 5
}
}| Field | Type | Required | Description |
|---|---|---|---|
intervalMinutes | number (1-30) | Yes | サイクル間隔(分) / Cycle interval in minutes |
7. メモリ管理 / Memory Management
AIエージェントの記憶を管理する。
Manage AI agent memories.
admin:memory_list
エージェントの記憶一覧を取得する。
List an agent's memories.
{
"type": "admin:memory_list",
"payload": {
"character": "john",
"count": 20
}
}admin:memory_delete
特定の記憶を削除する(不適切な記憶の除去)。
Delete a specific memory (remove inappropriate memories).
{
"type": "admin:memory_delete",
"payload": {
"character": "john",
"memoryId": "mem_xxxx"
}
}admin:memory_inject
記憶を手動で注入する(シナリオ誘導用)。
Manually inject a memory (for scenario guidance).
{
"type": "admin:memory_inject",
"payload": {
"character": "sara",
"content": "今日はジョンの誕生日だと思い出した / Remembered that today is John's birthday",
"importance": 0.9,
"type": "episodic"
}
}| Field | Type | Required | Description |
|---|---|---|---|
character | "john" | "sara" | "eve" | Yes | 対象キャラクター / Target character |
content | string | Yes | 記憶内容 / Memory content |
importance | number (0.0-1.0) | No | 重要度(デフォルト: 0.5) / Importance (default: 0.5) |
type | "episodic" | "semantic" | No | 記憶タイプ(デフォルト: "episodic") / Memory type (default: "episodic") |
コマンド一覧表 / Command Summary Table
| Command | Category | Description (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_add | NG管理 | NGワード追加 | Add NG words |
admin:ng_remove | NG管理 | NGワード削除 | Remove NG words |
admin:ng_list | NG管理 | 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
// 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.
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_inject | importance > 0.8 は警告ログ出力 / Warning log for importance > 0.8 |
trigger_event (Tier 5) | 高額イベントは確認ログを強化 / Enhanced logging for expensive events |
3. Rate Limiting 詳細 / Rate Limiting Details
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_KEYset in environment - [ ] API Key が32文字以上 / API Key is 32+ characters
- [ ]
/ws/adminが localhost/VPN のみアクセス可 //ws/adminrestricted 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
関連ドキュメント / Related Documents
- アーキテクチャ / Architecture — システム全体図・技術スタック
- リスク & 対策 / Risks — Admin override commands の言及
- MVP スコープ / MVP Scope — 開発スケジュール
- コメント連動 / Live Comments — NGワードフィルタの前段処理
- イベント一覧 / Events — イベントID・トリガー条件