# 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**） |

## 🧭 需求脈絡（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。

## ⚠️ FR-056.5：測試連線架構缺陷（下一棒第一優先）

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

**問題：** 現 `test_connection` 由 BE `OpenVasProbe`（`infra/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）。
- **雲端 BE**：`test_connection`（`app/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 方法」，不是新鏈路。

## 📋 本棒已做的事（端到端實測衍生）

### 已 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」。**

## 🖥️ 部署現況（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 這段。

## 🔑 座標

- 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，改檔即生效）

## 📌 收尾待辦（累積，等 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 個測試全樹跑被污染，隔離跑全過）

## 行為規範提醒

- 不切 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 重啟
