/**
* 対応アドバイスのルール定義(既定値)
*
* ★文言(title / text / actions)はシステム管理の「運用設定」から編集できます★
* 編集された内容は `data/settings/advice.json` に保存され、ここの既定値を上書きします。
* 実行時は `lib/settings/advice.ts` の `loadAdviceRules()` を使ってください。
*
* ★発火条件(どのルールが該当するか)はここではなく `lib/judge/advice.ts` にあります★
* 条件は仕様であり、文言は運用の都合で変わるものなので、意図的に分けています。
* 文言を変えてもテストは壊れません。
*
* Phase A = CLAUDE.md 4.5 の R1〜R4
* Phase B = エラーコード別のアドバイス(モックに存在していたもの)
*/
export type AdviceRuleId = "R1" | "R2" | "R3" | "R4" | "B1" | "B2" | "B3";
export interface AdviceRuleDefinition {
id: AdviceRuleId;
phase: "A" | "B";
/** 1=注意 2=警告 3=重大。行バッジの色は該当ルールの最大レベルで決まる */
level: 1 | 2 | 3;
icon: string;
/** 見出し(編集可) */
title: string;
/** 推定原因(編集可) */
text: string;
/** 推奨アクション(編集可) */
actions: string[];
/** 発火条件の説明。画面の設定編集時に「どんなときに出るか」を示すため(編集不可) */
condition: string;
}
export const DEFAULT_ADVICE_RULES: Record<AdviceRuleId, AdviceRuleDefinition> = {
R1: {
id: "R1",
phase: "A",
level: 1,
icon: "⚠",
title: "出発失敗(R1)",
text: "事前チェックのアラート内容を確認してください。セキュリティ未解除/ロボット異常/充電不足のいずれかが原因です。",
actions: [
"事前チェックのアラート内容を確認",
"セキュリティ解除状況の確認",
"ロボットの充電状態を確認",
],
condition: "出発失敗(初回)",
},
R2: {
id: "R2",
phase: "A",
level: 1,
icon: "⚠",
title: "完了率が極端に低い(R2)",
text: "現場の通路状況+ロボット状態を確認してください。出発直後に停止した可能性があります。",
actions: [
"現場の通路状況を確認",
"ロボット本体の状態を確認",
"障害物の有無を現場に確認",
],
condition: "完了率が10%未満",
},
R3: {
id: "R3",
phase: "A",
level: 2,
icon: "🔶",
title: "2日連続で完了率低下(R3)",
text: "恒常的な環境変化の可能性があります。現場責任者に状況をヒアリングしてください。",
actions: [
"現場責任者へのヒアリング",
"運用手順の再教育",
"消耗品交換の手配",
],
condition: "同一施設で2日以上連続して△以下または出発失敗",
},
R4: {
id: "R4",
phase: "A",
level: 3,
icon: "🔴",
title: "複数日連続で問題継続(R4)",
text: "現場対応では解決しない構造的問題の可能性があります。DFAオンサイト訪問(マップ再作成・環境調査)の手配を検討してください。",
actions: [
"DFAオンサイト訪問の手配を検討",
"マップ再作成の検討",
"機体交換の検討",
],
condition: "同一施設で3日以上連続して△以下または出発失敗",
},
// ---- Phase B(エラー種別ごとのアドバイス) ----
B1: {
id: "B1",
phase: "B",
level: 1,
icon: "🗺",
title: "マップ更新の確認",
text: "マップがレイアウト変更に追従していない可能性があります。直近の棚替え・売場変更がなかったか現場に確認してください。",
actions: ["直近の棚替え・売場変更の有無を確認", "マップ更新の要否を判断"],
condition: "完了率が10%以上70%未満(△判定)",
},
B2: {
id: "B2",
phase: "B",
level: 1,
icon: "🔧",
title: "ハンドルアップ検知",
text: "ハンドルが上がった状態です。現場にハンドルを下ろすよう連絡してください。",
actions: ["現場にハンドルを下ろすよう連絡", "誤操作の防止策を案内"],
condition:
"事前チェック(1回目または2回目)のステータスが lib/config/robot-status-match.ts の B2 リストに一致" +
"(暫定値 Handrail Lifted。trim・大小文字無視。D-078 項2)",
},
B3: {
id: "B3",
phase: "B",
level: 1,
icon: "📡",
title: "オフライン検知",
text: "ネットワーク接続が切れています。Wi-Fiルーターの再起動を現場に依頼してください。",
actions: ["Wi-Fiルーターの再起動を現場に依頼", "電波状況の確認"],
condition:
"事前チェック(1回目または2回目)のステータスが B3 リストに一致。" +
"現在リストは空のため発火しない(値が未判明。D-078 項2)",
},
};
/** 編集可能なフィールド(設定画面で書き換えられる範囲) */
export type EditableAdviceFields = Pick<
AdviceRuleDefinition,
"title" | "text" | "actions"
>;