狀態:設計定案(D1–D11 已拍板)|建立日期:2026-07-26|母案含 4 子需求 × 15 子任務 討論稿(含流程圖):
discussion.html(Artifact 亦可線上瀏覽)
| 日期 | 變更 | 對應 |
|---|---|---|
| 2026-07-26 | 初版設計定案,D1–D11 全數拍板(照建議) | FR-056 母案 |
| 2026-07-26 | T-2.3 落點修正:任務類型 UI 應加在 ProjectPlanningView.vue(規劃頁控制項實作 Tab 任務面板),非 TaskSetupView.vue(後者為斷頭半成品頁:ui_routes 無條目、無導覽點、fetchTree API 路徑在 BE 未註冊)。首次實作(FE f7d4968)revert 重做;BE 不受影響。TaskSetupView 是否清除列收尾待辦。 |
T-2.3 返工 |
| 2026-07-26 | plan 遺漏補洞:detection_tool_param_schemas 零 seed(56.1 只 seed 連線欄位、漏掃描參數 schema),而 connector params.hosts 必填 + T-2.3 UI 動態拉 schema 渲染 → 現況整條鏈掃描必炸「缺少掃描目標」。T-2.3 加 Step 0.5 補 OpenVAS param_schema seed(hosts 必填 + timeout_sec/scan_config_id/scanner_id 選填,key 與 connector 消費端對齊)。另註記:連線 4 欄位對 python-gvm 已足,但 port 9390 TLS 直連有部署前提(Docker 版 GVMd 常只開 Unix socket),列真實環境驗證第一檢查項。 |
T-2.3 Step 0.5 |
客戶希望在專案任務中把「執行檢測工具」自動化:租戶設定好自家的檢測工具(第一個接 OpenVAS,未來 Nessus / SonarQube 等)→ 任務指定為「檢測工具執行」→ 按下開始 → 透過裝在客戶端的 Agent 觸發掃描 → 結果自動回收成該任務的證據 → 通知負責人 → 完成任務。目的是省掉 user 手動跑整條流程。
設定檢測工具(url/key 加密存 config schema)
→ 安裝 & 註冊 Agent(沿用 FR-039 既有 mTLS 註冊)
→ 任務設為「檢測工具執行」+ 設掃描參數(IP/網址/設備)
→ 按「開始執行任務」
→ Agent 心跳領到派工 → 呼叫工具(API/CLI)→ 掃描完成回傳報告
→ 報告存回 job_evidences(source=DETECTION_TOOL)
→ 發信通知負責人
→ 依「完成模式」flag:auto 系統自動按完成 / manual 任務留在 PROCESSING 等人工手動完成(不新增狀態)
| 項目 | 狀態 | 說明 |
|---|---|---|
| FE 檢測工具管理頁 | 純 mock | ToolPluginManage.vue:7 工具寫死、零 API、啟用只收一個 key 欄位、重整即重置。要接真後端重做。 |
| Agent 認證鏈 | 已完備 | FR-039 的 evidence-agent(獨立 repo)自我註冊 + mTLS 憑證 + 心跳輪詢已可用,agent_type 已預留多型。認證這層不用重做。 |
| Agent 任務下發 | 完全沒有 | 無 command queue / job dispatch,心跳 payload 不夾帶待辦;Agent 端也無 executor。全新範疇。 |
| 任務類型 | 要擴充 | GrcJobType 寫死 StrEnum(只 general / survey),任務顯示真相在範本 BPMN userTask(actionType/actionInfo)。 |
| 證據自動上傳 | 有現成 pattern | job_evidences.source 已區分 SYSTEM_UPLOAD / DRIVE_SYNC;ImportDriveFileHandler 用系統帳號自動寫證據。掃描轉證據照抄,加 DETECTION_TOOL 來源。 |
| config schema | 不存在 | 目前僅 compliance / oscal / public / survey 四 schema。最接近的 tenant 設定表是 tenant_drive_integrations(每租戶一筆、加密 token)——當加密範式參考。 |
| # | 決策 | 定案 |
|---|---|---|
| D1 | config schema 定位 | typed 表,非通用 key-value blob。config 作為「設定類 schema 命名空間」,裡面放明確 typed 表(detection_tools 等),未來別種設定各自開 typed 表,不塞單一 blob。 |
| D2 | 憑證加密方式 | 沿用 app 層對稱加密(mirror tenant_drive_integrations 的 *_encrypted 欄位),金鑰走環境變數 / 部署密鑰不進版控。不引入新 KMS。 |
| D3 | Agent 派工機制 | 心跳夾帶待辦(heartbeat 回應加 pending_tasks),改動最小、認證零改。結果走獨立 result endpoint。推播(SocketIO)列未來,不進第一版。 |
| D4 | 報告是否 parse 成結構化 findings | 第一版只存原始報告當證據。parse 成 findings / 自動配對控制項是更大題目,獨立成未來 FR,不混入。 |
| D5 | 工具 connector 架構 | 三層 adapter(工具 × 連線型態 × 共用 core),沿用 FR-043/044 registry 泛化 pattern。第一版只實作 OpenVAS,介面留好。 |
| D6 | 停用/重置的「有任務正被配置」提醒 | 軟提醒:停用/重置前查「引用此工具設定的任務數」,彈窗提醒數量 + 放行,不硬擋(比照 FR-051 軟提醒)。 |
| D7 | 部門(org_unit)層級設定 | 表結構留 org_unit_id 欄位(預留),第一版邏輯只做租戶層級。未來下放部門不用改 schema。 |
| D8 | 完成模式預設值 | 預設 manual(系統不自動按完成)。掃描結果通常需人確認才算數;auto 則掃完自動 complete_job。注意:manual 不是新狀態,只是系統不主動呼叫既有 complete_job,任務留在 PROCESSING 等人工手動完成——零 JobStatus 新增、不動 jedi_flow_engine。 |
| D9 | 憑證怎麼到 Agent | (a) 雲端解密後隨派工下發(走 mTLS 通道,Agent 用完即丟不落地)。雲端仍是憑證唯一保管處(加密存放)。不採 Agent 自持——要客戶在 Agent 端自設不實際,雲端 UI 統一設定才符合產品體驗。 |
| D10 | OpenVAS 整合方式 | API(python-gvm,GVM protocol),非 CLI。程式化控制掃描比解析 CLI 輸出穩定;與 FR-056.1 seed 的 connection_type=API 一致。 |
| D11 | 掃描報告的 evidence_type | 用既有 FILE,不用 REPORT。REPORT 型別會牽動其他判斷證據檔案的地方、改動面大;第一版 FILE 最安全,要區分檢測報告類證據未來另開需求。 |
config schema 放租戶設定與工具目錄(D1 typed 表)。evidence-agent repo)長出 executor 執行能力。job_evidences)回流(D4 只存報告)。@transaction/session 紀律、authz 守門、error code 規範一律照 CLAUDE.md,不破例。雲端 Guidant AI
├── 前端:檢測工具管理頁 · 任務設置頁 · 任務執行抽屜
├── 後端(DDD)
│ ├── config schema(新)
│ │ ├── detection_tools 工具目錄(取代 FE 寫死清單)
│ │ ├── tenant_detection_tool_configs 租戶憑證(加密)
│ │ └── detection_tool_param_schemas 動態欄位定義(版更用)
│ └── compliance schema
│ ├── agent_tasks(新) 派工 + 狀態機
│ ├── detection_executions(新) 執行歷史
│ └── job_evidences 證據(既有,加 DETECTION_TOOL 來源)
└── ⇅ mTLS+JWT 心跳夾帶派工
客戶端
└── Agent(evidence-agent)+ 新 executor 模組 → OpenVAS(未來 Nessus/SonarQube)
| 欄位 | 型別 | 說明 |
|---|---|---|
| id / uid | bigint / uuid | 主鍵 |
| code | varchar | openvas / nessus / sonarqube(唯一) |
| name / description | varchar / text | 顯示名稱、說明(可 i18n) |
| connection_type | varchar | API / CLI——決定 executor 走哪條 |
| config_field_schema | jsonb | 設定頁要填的欄位定義(key/label/type/required/secret) |
| status | varchar | available / coming_soon(灰掉不給設定) |
| enabled | bool | 平台層總開關 |
| 欄位 | 型別 | 說明 |
|---|---|---|
| id / uid | bigint / uuid | 主鍵 |
| tenant_id / org_unit_id | uuid | 租戶隔離(org_unit 預留,D7 第一版只租戶層級) |
| detection_tool_id | FK | 指向 detection_tools |
| credentials | jsonb / text(加密) | url / key / token / 帳密——app 層加密(D2) |
| field_values | jsonb | 對應 config_field_schema 的非機敏值 |
| status | varchar | enabled / disabled |
| last_tested_at / result | timestamptz | 最後一次測試連線的時間與結果 |
FE 管理頁需要「列出本租戶所有 config 含狀態」的讀取 API(
GET /detection-tools/configs),FE 才能正確渲染卡片(哪些工具已設定、enabled/disabled)。回傳只含has_credentials(bool),絕不回憑證明文/密文。細節見 implementation-plan.md T-1.3 Step 9。
| 欄位 | 型別 | 說明 |
|---|---|---|
| id | bigint | 主鍵 |
| detection_tool_id | FK | 指向 detection_tools |
| version | int | 欄位定義版本——調欄位不覆蓋舊版 |
| param_schema | jsonb | 參數欄位定義(掃 IP 清單 / 網址 / 設備群 / 掃描 profile…) |
| 欄位 | 型別 | 說明 |
|---|---|---|
| uid | uuid | 主鍵 |
| tenant_id / agent_id | uuid / FK | 派給哪台 Agent |
| job_execution_uid | FK | 對應哪個稽核任務 |
| detection_tool_id | FK | 用哪個工具 |
| params | jsonb | 本次掃描參數快照 |
| status | varchar | pending → dispatched → running → succeeded / failed |
| result_ref / error | jsonb / text | 結果檔參照 / 失敗訊息 |
| 欄位 | 型別 | 說明 |
|---|---|---|
| uid | uuid | 主鍵 |
| agent_task_uid | FK | 對應派工單 |
| job_execution_uid | FK | 對應任務 |
| started_at / finished_at | timestamptz | 執行區間 |
| status / summary | varchar / jsonb | 成敗 + 摘要(如發現幾項) |
| report_file_id | FK | 原始報告檔(→ upload_files,供下載) |
| evidence_id | FK | 轉出的證據(→ job_evidences) |
表名/欄位為草案,正式建表依
sql-migration規範定案(GRANT cm_app、sequence 權限、schema_migrations 登記)。
pending_tasks,Agent 領走 → ack(task→dispatched)→ 執行 → 回報 running → POST /agents/tasks/{id}/result + 報告檔(task→succeeded)。common/util/agent_auth(mTLS + JWT),新 endpoint 掛同一套,不重新設計。Agent 回傳報告後,雲端照 ImportDriveFileHandler 同一套路:報告存 Minio → 寫 job_evidences,source 從 DRIVE_SYNC 換成 DETECTION_TOOL,created_user 用系統帳號(如 detection-agent@system)。既有證據列表、刪除連動邏輯自動涵蓋。
完成模式只是「系統要不要幫忙自動按完成鍵」的開關,不新增任何任務狀態。 掃描完成、證據入庫、發 mail 後,依任務設定的完成模式 flag:
complete_job,任務 PROCESSING → COMPLETED。complete_job,跟一般任務完全一樣)。關鍵:不新增 JobStatus 狀態值、不動 jedi_flow_engine 套件。 manual=系統不主動呼叫 complete_job;重掃=PROCESSING 下既有的「再執行」能力(每次一筆 detection_executions 獨立紀錄,不覆蓋前次、可下載比對);手動完成=既有 complete_job。
任務 PROCESSING(既有狀態)
→ 按「開始執行」→ 派工 → Agent 掃描 → 回報告
→ 證據入庫(job_evidences) + detection_executions 落一筆 + 發 mail 通知負責人
→ 完成模式 = auto → 系統自動 complete_job → COMPLETED
→ 完成模式 = manual → 任務仍 PROCESSING,等人工判斷:
· 證據可用 → 手動 complete_job → COMPLETED
· 不可用 → 抽屜再按執行(重掃,留歷史)或補上傳證據 → 再手動完成
掃描失敗 → detection_executions 標 failed(不 silent)→ 任務仍 PROCESSING,可重試
「完成模式」只影響掃描完成後系統要不要自動按完成;任務狀態機完全沿用既有 JobStatus(TODO/PROCESSING/COMPLETED/CANCEL),零改動。完成模式值用
auto/manual(原「人工覆核」措辭改為單純「manual=系統不自動完成」)。
表用 detection_*(檢測),非 scan_*:
tool-plugin-manage、選單「檢測工具管理」)。assessment_*(被 OSCAL 的 AP/AR/assessment_object 佔用)、integration/connector(被 cloud_integration / tenant_drive_integrations 佔用)。每階段可獨立上線、獨立驗收。子任務切到「一個 session 跑得完、有明確產出、可獨立 commit」。
FR-056.1(工具管理 config schema)── 地基
├─→ FR-056.2(任務類型 + 參數)
└─→ FR-056.3(Agent 派工 + executor) ← .2 / .3 可並行
↓
FR-056.4(執行編排 · 證據 · 通知)── 收尾整合
| 子任務 | 範圍 | 產出/驗收 | 依賴 | Repo |
|---|---|---|---|---|
| T-1.1 | 建 config schema + 三表 migration(GRANT cm_app、schema_migrations 登記);seed OpenVAS | migration 套進 DEV,查得到表與 seed | — | BE |
| T-1.2 | BE:detection_tools 目錄唯讀 API(DDD 全層);清單改由 DB 提供 | GET 清單回 OpenVAS + coming_soon;有 pytest | T-1.1 | BE |
| T-1.3 | BE:租戶工具設定 CRUD + 憑證加密(沿用 drive 加密範式) | 建/改/停用;DB 內憑證密文;有 pytest | T-1.1 | BE |
| T-1.4 | BE:測試連線 endpoint + 停用/重置「引用任務數」提醒(D6) | 測試連線回成敗;提醒回引用數 | T-1.3 | BE |
| T-1.5 | FE:檢測工具管理頁重做(真 API、動態欄位、啟用/停用/重置、測試連線、coming_soon 灰掉) | 整頁走真後端;重整持久化;mock 全移除 | T-1.2/1.3/1.4 | FE |
| 子任務 | 範圍 | 產出/驗收 | 依賴 | Repo |
|---|---|---|---|---|
| T-2.1 | BE:GrcJobType 加 detection_tool + BPMN userTask 同步線(actionType/actionInfo 回寫 template xml) |
任務可存 detection_tool 類型並同步範本;有 pytest | —(可與 P1 並行) | BE |
| T-2.2 | BE:param_schemas 版本化定義 + 任務綁定工具+參數快照 + 完成模式 flag | 任務存下工具/參數/完成模式;重開還在;有 pytest | T-1.1/T-2.1 | BE |
| T-2.3 | FE:任務設置頁——選檢測工具執行 → 選工具 → 動態參數欄位 + 完成模式選擇 | 設定期完整可存;不影響 general/survey | T-2.2 | FE |
| 子任務 | 範圍 | 產出/驗收 | 依賴 | Repo |
|---|---|---|---|---|
| T-3.1 | BE:agent_tasks 表 + 派工 service + 狀態機 + Agent capability 標記 | 能建派工單、查狀態;有 pytest | T-1.1 | BE |
| T-3.2 | BE:心跳夾帶待辦 + ack + 結果回收 endpoint(沿用 mTLS+JWT) | 心跳領到任務、result 回收改狀態;有 pytest | T-3.1 | BE |
| T-3.3 | Agent 端(evidence-agent):executor 模組骨架——領任務、回報 running、送 result;沙箱/權限邊界 | 能收派工並回報;不含具體工具邏輯 | T-3.2 | evidence-agent |
| T-3.4 | Agent 端:OpenVAS connector(三層 adapter,API/CLI 兩型;mirror FR-043/044) | 手塞派工→跑 OpenVAS→回報告全鏈通 | T-3.3 | evidence-agent |
| 子任務 | 範圍 | 產出/驗收 | 依賴 | Repo |
|---|---|---|---|---|
| T-4.1 | BE:結果轉證據 handler(detection_executions 落一筆 + 報告存 Minio → job_evidences source=DETECTION_TOOL;沿用 DRIVE_SYNC 模板) | result 進來自動生執行史 + 證據;有 pytest | T-3.2 | BE |
| T-4.2 | BE:執行編排——開始執行串派工、完成模式分岔(auto 呼叫既有 complete_job / manual 不做事)、失敗狀態、發信通知負責人 | auto & manual 各驗一次;失敗不 silent;負責人收信 | T-2.2/T-3.1/T-4.1 | BE |
| T-4.3 | FE:任務執行抽屜——開始執行 / 手動重新執行 / 執行歷史列表(狀態+摘要+下載);manual 模式靠既有「完成任務」按鈕(不新增 UI) | auto & manual 全鏈手測通;重掃留歷史可比對 | T-4.2 | FE |
總計 15 子任務(5 / 3 / 4 / 3),跨三 repo(BE / FE / evidence-agent)。每子任務 = 一張 Notion 子卡,掛在對應 FR-056.x 下、再掛回母案。
每張卡填「需求編號」欄位。session 做完子任務:commit + 回寫該子卡狀態,下個 session 從 Notion 看依賴接續,交接不歪。