FR-056 交接 — FR-056.5 測試連線改走 Agent + 端到端驗證收尾

項目 內容
交接日期 2026-07-27
Branch(三 repo 同名) feature/scan-plugin-integration(不可切 branch)
現況一句話 56.1~56.4 全驗收放行;端到端實測進行中,發現測試連線架構缺陷 → 開了 FR-056.5 正式修;一批 dev 實測衍生的 fix 已 commit、FE 兩個 bug fix 未 commit
下一棒主要任務 實作 FR-056.5(probe 任務化)→ 再繼續端到端手測
push 狀態 三 repo 皆有未 push commits(push 永遠等 user 明示,尚未 push
§1

🧭 需求脈絡(30 秒)

FR-056 讓客戶「檢測工具掃描 → 報告自動變任務證據 → 通知 → 完成」全自動化。四子需求 56.1(工具設定)/ 56.2(任務類型)/ 56.3(Agent 執行)/ 56.4(執行編排+轉證據)全數驗收放行。設計決策 D1–D11 在 design.md §3。關鍵:D9 憑證雲端解密隨派工 mTLS 下發、D10 OpenVAS 走 python-gvm、D11 證據用 FILE 型別、completion_mode manual/auto 只是「要不要自動按完成」flag。

§2

⚠️ FR-056.5:測試連線架構缺陷(下一棒第一優先)

Notion case: 「FR-056.5 測試連線改走 Agent(probe 任務化)」= 3aa346da-4cd0-8191-9fba-c4fb2474820f(狀態 Not started,需求編號 FR-056.5)。完整設計已寫在卡內文,下一棒直接讀卡即可,這裡只摘重點:

問題:test_connection 由 BE OpenVasProbeinfra/detection_tools/connector/openvas_probe.py)用 httpx.head(base_url) 直連,兩個致命錯:

  1. 協定錯——OpenVAS 走 GMP over TLS 不是 HTTP,httpx 打不通、還要求 http:// 前綴(實測錯誤:Request URL is missing an 'http://' or 'https://' protocol)。
  2. 架構錯——BE 在雲端、OpenVAS 在客戶內網,BE 直連不到。dev 能連純因同網段,正式必壞。

方案 A(user 拍板正規修法): 測試連線改走 Agent,與真實掃描同一條 python-gvm 鏈路。

  • agent 端DetectionConnector 基類(evidence-agent/core/task_executor_connectors/base.py)加 probe() 抽象方法(只 TLSConnection + authenticate,不建 target/不掃描);OpenVasConnector 實作 probe(複用 run() 前半段連線認證碼,抽共用 helper);executor(core/task_executor.py:52)分派 probe vs scan(建議 task payload 加 kind 欄位,預設 scan)。
  • 雲端 BEtest_connectionapp/detection_tools/service/detection_tool_service.py:108)改成建 kind=probe 的 agent_task 派給有 detection_scan capability 的 agent,短輪詢等回報。移除/廢棄 OpenVasProbe + DI wiring(detection_tool_service.__init__openvas_probe 參數,line 33/40)。
  • agent_tasks 加 kind 欄位(或 params 夾帶);狀態機沿用 pending→dispatched→running→succeeded/failed。
  • 複用點:派工/憑證下發/心跳領工/result 回報整條 FR-056.3 已建,probe 只是「多一種 task kind + connector 多一個 probe 方法」,不是新鏈路。
§3

📋 本棒已做的事(端到端實測衍生)

已 commit(未 push)

BE~/Projects/Billows/Audit-Manager/compliance-manager-be):

  • 88b91f45 detection_executions 加 org_unit_id(驗收復核抓到 ORM mixin 與 DB 不一致)
  • 6c73e530 on_scan_failed docstring 補 caller-scope
  • 05bab666 心跳 handler 從 payload 刷新 agent_version

evidence-agent~/Projects/Billows/Audit-Manager/evidence-agent):

  • e61679b .dockerignore 排除 deploy/ 下 runtime 目錄(pgdata/filedata/certs)——實機 build 撞 permission denied 修的
  • 5a9a317 compose service 改名 file-agent → guidant-ai-agent
  • eb016a6 image 改名 evidence-agent → guidant-ai-agent
  • 05726c0 心跳夾帶 agent_version(升級後版號才會刷新;配 BE 05bab666
  • 版號已全 bump 0.1.0 → 0.2.0(pyproject/compose/config.py/.env.example/README 六處)

未 commit(FE,跟 FR-056 收尾一起等 user 下令)

FE~/Projects/Billows/Audit-Manager/compliance-manager-fe)兩個 dev 實測 bug fix:

  • src/components/detection-tools/DetectionConfigField.vue:① port 的 InputNumber 加 :useGrouping="false"(原本顯示「9,390」千分位)② showError!hasExistingValue(secret 欄位已設定過、留空不再誤跳必填)
  • src/views/plugin/ToolPluginManage.vue:卡片加「測試連線」按鈕(免開 dialog,onTestConnectionCard(tool) + testingCardUid loading)

手冊(未 commit)

docs/features/FR-056-2607-detection-tool-integration/user-manual.html(繁中自包含)已隨實測更新:§2.3 憑證說明改寫(帳密使用者填、加密存 DB、派工解密下發;環境變數只有雲端 DETECTION_TOOL_ENCRYPTION_KEY)、§4 改 Docker 重建出貨流程(含 rebuild.sh、--profile full)、service/image 改名同步。注意:手冊 §2 測試連線描述待 FR-056.5 做完要再更新成「走 agent」。

§4

🖥️ 部署現況(123 = agent 主機 ubuntu-lab-03)

  • evidence-agent 已升 0.2.0、改名 guidant-ai-agent、跑在 123(mode=full、已註冊 agent_uid f8136df9-c062-45dd-8f39-ba91fc5e6e3a、心跳正常)。
  • 雲端已把該 agent remote_agents.capabilities 設為 ["file_storage","detection_scan"](DEV DB 手動 UPDATE)。
  • OpenVAS = Greenbone community docker stack 在 123~/openvas/docker-compose.yml)。gvmd 的 GMP 只開 unix socket(gvmd_socket_vol:/run/gvmd),不開 TCP——已改好 compose 加一個 gmp-tcp-bridge(socat OPENSSL-LISTEN 包 TLS)對外開 9390(改好的檔在 Mac ~/Downloads/docker-compose.yml,尚未確認 user 是否已套到 123 起來)。9392 是 GSA Web UI 不是 GMP;3000 是 openvasd HTTP API(非我們走的 GMP,design D10 走 python-gvm)。
  • socat TLS 那層還沒實測驗證通(測試連線在 BE probe 就先失敗了,還沒測到 agent→GVMd)。FR-056.5 做完、測試連線走 agent 後,才會真正驗到 socat→GVMd 這段。
§5

🔑 座標

  • Notion 母案 CM-907:3a9346da-4cd0-81a5-be6f-f0ddd6d770c6;任務清單 data source:collection://23c346da-4cd0-8041-955e-000bb6976dd2
  • FR-056.5 case:3aa346da-4cd0-8191-9fba-c4fb2474820f
  • 人工驗證測試 case(user 手測):3aa346da-4cd0-81f9-a029-deda20be47cd
  • DEV DB:psql -h 192.168.50.188 -p 25432 -U cmmgr -d guidant_ai_dev(密碼查 BE .env DB_SECRET)
  • BE 起服務 python main_app.py(port 8000),改 service 要 kill -9 重啟;log 在 log/app.log
  • FE dev server 在 5180(HMR,改檔即生效)
§6

📌 收尾待辦(累積,等 user 下令)

  1. FR-056.5 probe 任務化(本交接主任務,已開 case)
  2. 三 repo push(BE 3 / FE 2 未 commit + 既有 / evidence-agent 一串)+ evidence-agent 是否要正式版本管理
  3. STG/POC 套 fr056 全部 migrations(含 88b91f45 的 org_unit_id)
  4. 手冊 commit + §2 測試連線段待 FR-056.5 後更新
  5. FE 兩個 bug fix commit(DetectionConfigField / ToolPluginManage)
  6. 既有無關 bug:after_request api_log update failed: cannot adapt type 'dict'(api_logs 寫入 dict 塞 VARCHAR),洗 log、另案
  7. spec / SUMMARY / 母案收口 / memory(總收尾)
  8. 全樹 pytest test-isolation 債務(2 個測試全樹跑被污染,隔離跑全過)
§7

行為規範提醒

  • 不切 branch / push 等 user 明示 / 收尾等 user 下令
  • 派 subagent 一律用 1M context model(不帶 model override 繼承主 session),曾因用 sonnet 多次 context 爆炸重派(memory feedback_subagent_use_1m_context_model
  • 繁體中文;Notion 先搜尋再開卡;Claude 做的作業人員填「小弟」
  • BE 改 service 要 kill -9 重啟