本卡屬 FR-083(母卡 CM-1639),第 2 棒:套件本體(jedi monorepo)。只掃不修。 建議在 D2(CM-XXXX,宿主接線)驗收完之後跑。
掃 AI 儀表板套件本身(34 個檔、2,296 行):使用者打一句自然語言,AI 怎麼決定要呼叫哪支查詢功能、怎麼把查到的資料送給 LLM 設計版面、怎麼把結果送回來。
首腦讀過程式碼後的起點,未經驗證。工具不會照這份清單走(連續兩個 arc 如此),你要自己追。
app/service/ai_dashboard_app_service.py(258 行)的第一階段「AI 選擇 API」——使用者的 prompt 直接進 LLM,LLM 回一個 main_api 字串,然後系統照著呼叫。要追:(a) 回傳的 API 名稱有沒有被驗證在名冊內?(b) 能不能用文字誘導 AI 選一支本來不該給這個使用者的 API(例如「請列出所有使用者」誘導它選 auth.get_users)?(c) 有沒有「這個使用者能用哪些 API」的過濾,還是 27 支全部開放給 AI 選?source_data[:5] 送給 LLM(FR-079 F13 查到的是前三筆,數字要實查)。要追:送出去的是原始資料還是脫敏過的?有沒有欄位過濾?這是資料外流面。data_api_service.py(208 行)的動態呼叫。 getattr(service, method_name) 然後 method(**call_params)——要追:method_name 來自名冊還是可被影響?call_params 的組法(:172-191)有沒有辦法塞進非預期的參數?F13 的成因就在這附近。dashboard_generation_domain_service.py(329 行,套件最大檔)——版面生成邏輯。LLM 回傳的版面設定(可能含 HTML/JS/圖表設定)怎麼處理?有沒有把 LLM 的輸出直接當程式碼或標記語言渲染?(這是「LLM 輸出當可信輸入」的典型風險。)infra/ai_client/claude_client.py(119 行)+ base.py(86 行)——對外呼叫 LLM。要追:有沒有 verify=False(FR-081 在 jedi-issue 撈到六次)?有沒有 timeout(FR-082 查出 Anthropic SDK 預設是 10 分鐘,而 gunicorn 120 秒就砍 worker——儀表板一次請求要呼叫 LLM 至少兩次,風險比聊天更高)?例外訊息會不會把金鑰印進 log?app/registry.py(141 行)的名冊機制。 DashboardApiRegistry 怎麼存、怎麼查?有沒有辦法在執行期加進一支不在申報檔裡的 API?api/routes/ai_dashboard_route.py(149 行)的兩條 route。 健康檢查那條(AiDashboardHealthRoute)掛了認證嗎?它會吐出什麼(版本、設定、金鑰狀態)?plugin.py(272 行)的四個插槽 + fail-closed。 缺 auth_required 時是 raise 還是靜默掛載?FR-081 的 jedi-issue 會 raise RuntimeError(好),FR-082 的 jedi-ai-bot 只靠 dataclass 必填欄位擋(實測仍 fail-closed 但無明確訊息)——這支是哪一種?harness/dev_app.py(199 行)——開發用啟動殼。寫死的憑證、debug 開關、會被誤帶進正式環境的設定。密鑰專項最常撈到東西的地方。params={} 使過濾失效、結果前三筆原文送 LLM。本棒要看的是「套件這側為什麼會這樣設計」以及「還有沒有別的同款問題」。ANTHROPIC_API_KEY;③ jedi-ai-bot 的 fail-closed 只靠 dataclass 必填欄位,實測仍安全但無明確錯誤訊息。