🚦 日本語ドキュメント
English →

🚦判定ロジックの全体像

L1決定的ゲート → 点数の世界 → 閾値 → 3分岐の流れ、切断安全弁の非対称性、本線と観測(shadow)の分離を3つの図で。

「この電話を切るか・人へ通すか・AI が出るか」を Aegis がどう決めているか、判定の流れを3つの図で示す。 数字(0.8 / 0.3 / 0.6 / 0.95)はすべて 2026-07-21 にコードで裏取りした実値。 ※設計構造の図解であり、性能値・実運用の保証は書かない(この仕様書の読み方)。

図1: 判定フロー全体

第1段 — 着信時(通話前): route-decision(点数を見ない) 着信 L1 決定的ゲート(上から順に照合) 非通知(設定ON時)→ block blocklist(confirmed)→ block whitelist → human(人へ) 保護 OFF → human(人へ) ⚑ score と無関係の独立レーン(点数が存在しない) block → アナウンス → 切断 [社名部] → [用件部 A〜D] の連結再生 human → 人へ直通 ai → AI 受付(デフォルト) 第2段 — 通話中(ai のみ): ルール層 Scorer(verdict port 経由) 点数を見ずに即確定(該当したら打ち切り) blocklist → blocked whitelist → 人へ 営業時間 → after_hours 認証KW → 人へ(0.0) 点数の世界 KWスコア high 0.3 / med 0.15 / low 0.05 開幕フロア score = max(score, 0.6) カテゴリ 一致なら閾値より先に確定 閾値判定 block ≥ 0.8 grey 0.3 < s < 0.8 → 人へ pass ≤ 0.3 → 人へ ⚑ fraud enum: 通話中に classify_call が「fraud」を受理すると spam_score = 0.95(定数)。 0.95 ≥ 安全弁 0.8 のため切断導出が立つ(LLM 由来の加点はこれが唯一)。
図: 判定フロー全体を2段で示す。第1段は着信時: route-decision が L1 決定的ゲートを上から順に照合(非通知(設定ON時)/blocklist/whitelist/保護フラグ)して block / human / ai の3分岐 — このレーンに点数は存在しない。アナウンス([社名部]→[用件部A〜D])は block のみに乗る。第2段は通話中・ai の通話のみ: Scorer はまず点数を見ないゲート(blocklist→whitelist→営業時間→認証KW・該当したら即確定)を通し、その後に点数の世界へ入る: KWスコア→開幕フロア(0.6 へ底上げ・安全弁 0.8 未満)→カテゴリ(一致なら閾値より先に確定)→閾値判定(block ≥ 0.8 / grey 0.3<s<0.8 は人へ / pass ≤ 0.3 は人へ)。LLM 由来の加点は fraud enum の 0.95 が唯一(安全弁超)。設計構造のみ・2026-07-21 にコードで裏取り。

図2: 安全弁の非対称性

切断への道(狭い) ① action が遮断系 form_guided ② spam_score ≥ 0.8(安全弁) AEGIS_TERMINATE_MIN_SCORE AND should_terminate = true 唯一の例外: blocked / after_hours(L1 由来)は 無条件切断 — 安全弁の対象外 人への道(広い・fail-open) 空 transcript → pending 内部例外 → error score < 0.8(grey / pass) 転送先の解決失敗 → すべて人へ 「疑わしきは切らない」 切る = 2条件の AND / 迷い・障害 = 常に人へ(構造で保証)
図: 切断安全弁の非対称性。左(狭い道): should_terminate が true になるのは「action が遮断系(form_guided)」AND「spam_score ≥ 0.8(安全弁 AEGIS_TERMINATE_MIN_SCORE)」の2条件が揃った時だけ。唯一の例外は L1 決定的ゲート由来(blocked / after_hours)で、これは無条件切断・安全弁の対象外。右(広い道): 空 transcript(pending)・内部例外(error)・score が 0.8 未満(grey / pass)・転送先の解決失敗 — すべて人へ倒れる(fail-open)。2026-07-21 に verdict_port.py で裏取り。

図3: 本線と観測の分離

本線(判定する) 通話 verdict port(champion = rules) action / should_terminate 応対: 切断 or 人へ 実線矢印 = 判定に効く 観測(記録のみ) 確定点(transcript-final)で、 AEGIS_VERDICT_MODE=shadow のときだけ(既定 rules = 記録なし) rules 並走(llm 値と並記) shadow_* 弧スコア(Peak + Accumulation) arc_* 検証層 発動条件の観測 verification_* 独立 try/except ×3 — 片方の失敗が他方や通話記録を巻き添えにしない call_logs(記録列) × ⚑ 観測は判定に一切触れない — verdict / should_terminate / route-decision への配線なし
図: 本線と観測は構造で分離されている。左: 本線が判定する — 通話 → verdict port(champion = rules)→ action / should_terminate → 応対。右: 確定点(transcript-final)で、AEGIS_VERDICT_MODE=shadow のときだけ(既定は rules = 記録なし)、3つの収集器が記録のみを書く: rules 並走の記録(shadow_* 列)・会話の弧スコア Peak + Accumulation(arc_* 列)・検証層の発動条件観測(verification_* 列)。各収集器は独立の try/except に置かれ、片方の失敗が他方や通話記録本体を巻き添えにしない。×印の矢印がこの図の主役 — 観測から verdict / should_terminate / route-decision への配線は存在しない。2026-07-21 に realtime_session.py / arc_score.py / verification_trigger.py で裏取り。

考え方(なぜこの形か)

  • L1 は点数を見ない — 登録済みの番号・時間外のような「明白な相手」に計算は不要。決定的ゲートは速く・無料で・判定理由が一義的に説明できる。点数の世界に入るのは、名簿で決められない相手だけ。
  • カスケードの思想 — 簡単なものはルールで即断し、グレーだけを AI(LLM)に回す。お金と時間は「迷う電話」にだけ使う(はじめに 図3・図4と同じ原則)。
  • shadow の思想 — 新しい物差し(llm 判定・弧スコア・検証層観測)は、判定に効かせる前にまず観測から始める。real 0 件の今から記録列だけ先に育てておけば、実機初日からデータが溜まる。
  • FPR 規律 — 測定値は点推定で断言せず、Wilson 95% 信頼区間の区間表記で書く。数字の正は 判定ロジックと精度 へ。
ℹ️出典コード(正)

図の裏取り元: aegis-platform backend/engine/scorer.py(手順1〜7)・verdict_port.py(should_terminate 導出・fail-open)・ opener_floor.py(開幕フロア 0.6)・backend/api/route_decision.py(3分岐・アナウンス解決)・ backend/api/realtime_session.py(確定点の shadow 記録3本)・backend/services/tools_core.py(fraud enum 0.95)。 確定値を変えるときは先に SSoT。