| 項目 | 內容 |
|---|---|
| 緣由 | 本 session 已執行大量工作、context 品質下降(user 觀察到反覆確認/反應變慢),換新 session 冷接繼續 |
| 交接日期 | 2026-07-26 |
| Branch(BE) | feature/scan-plugin-integration(未切過 branch,全程在此) |
| Branch(FE) | feature/scan-plugin-integration(同名,兩 repo 各自獨立) |
| 本 session 角色 | FR-056.2 runner(T-2.1/T-2.2/T-2.3 實作者)——不是驗收者 |
| 接手前必讀 | 本文件全讀 → §0 讀序,再跑 §6 pre-flight |
| 預估時間 | 若只需確認/收尾:10-15 分鐘;若驗收出問題需返工:視問題規模 |
| push 狀態 | BE/FE 皆有大量未 push commits,push 永遠等 user 明示,不自動做 |
FR-056 整個母功能要解決:客戶目前「用檢測工具(OpenVAS 等)掃描 → 匯出報告 → 手動上傳當任務證據 → 手動完成任務」全程手工,要自動化成「設定好工具與參數 → 系統自動觸發掃描 → 自動回收報告當證據 → 依設定決定自動或人工完成任務」。
FR-056.2(本 session 負責的子需求)具體做的是任務設定面:讓使用者在系統裡把某個評估任務(AO 底下的 job)標記為「檢測工具執行」類型,並設定要用哪個工具、掃描參數、以及完成後是自動標記完成還是留給人工確認(completion_mode)。這是整條自動化鏈的「入口設定」——沒有這塊,後面 56.3(Agent 派工執行)沒有東西可以觸發。
三個子任務:
GrcJobType 列舉加 detection_tool 值,BPMN userTask 範本要能同步存這個類型(跟現有 survey 類型的存法一致)完成模式(completion_mode)容易誤解,必須先弄懂:這只是一個「掃完之後要不要自動按完成鍵」的旗標,不是新的任務狀態。auto = 系統自動呼叫既有的 complete_job 邏輯;manual = 系統什麼都不做,任務停留在 PROCESSING,等人工看過證據後手動按完成。全程沒有新增 JobStatus,jedi_flow_engine 完全沒動。
🔒 先懂需求 gate(讀完才准動作):
docs/features/FR-056-2607-detection-tool-integration/design.md §3 決策表 D1–D11(至少 D9/D10/D11 三條,跟本子需求最相關)handoff/2026-07-26-orchestrator-mid-arc-handoff.md 全讀——這是主導 session 的中繼交接,說明整個 FR-056 的派工/驗收格局,本文件只是它底下 56.2 這條線的補充handoff/2026-07-26-runner-562-completion-handoff.md 全讀——這是本 session 稍早已經寫好的完工回報,含 T-2.1/T-2.2/T-2.3 每個 commit 的來龍去脈,本文件不重複那份的內容,只補充「現在該做什麼」冷接自檢 4 問(答不出回去讀,別動工):
completion_mode 是狀態還是旗標?如果是 manual,任務會停在什麼狀態?T-2.1/T-2.2/T-2.3 三個子任務程式碼已全部完成、commit 已做、關鍵路徑已在真實瀏覽器手測驗證通過、Notion CM-917/918/919 已回填「修正待驗證」。尚未經過獨立驗收,尚未 push。 換句話說:功能沒有半途而廢,是完整做完等驗收的狀態,不是有 bug 或卡住需要修。
如果 fresh session 接手後 user 沒有新指示,下一步預設是等主導 session(或 user)安排驗收,不是自己找事做、不是重新測一次、更不是重寫。
TaskSetupView.vue(FE commit f7d4968),事後手測才發現這頁是斷頭頁——ui_routes 無選單條目、程式內無導覽點、fetchTree() 打的 API 路徑本身就是 404。教訓:改 UI 前要先確認頁面是否為使用者實際能到達的頁面,不能只靠「檔名看起來像」或計畫文件裡寫的路徑就假設。已 revert(fd2e837)並在真實頁面 ProjectPlanningView.vue 重做(5914df2)。config.job_execution_detection_tools 的 RLS policy 一開始抄了 T-1.1 修正前的舊寫法(逗號分隔 + is_super_admin 比 'true'),真實非 super-admin 登入會炸。教訓:新表如果照抄同 FR 內較早子任務的 migration 當範本,要確認範本本身有沒有後續修正 commit,不能只抄最初版本。 已修正(afdb9b44)。project_extensions.deleted_at 軟刪除標記,測試後已還原原值(2026-07-23 04:43:26.37393)。教訓:任何為了手測而暫時改動的資料庫狀態,必須在收工前還原,且要在交接文件寫清楚還原了什麼。專案 296(uid c891a920-e0d8-43fb-9277-5271321f5234)曾在手測期間暫時解除軟刪除,已於本 session 內還原。驗證指令(下一棒可跑確認狀態正確):
-- 應該看到 deleted_at 有值(= 2026-07-23 04:43:26.37393,代表已還原成軟刪除狀態)
SELECT project_id, deleted_at FROM compliance.project_extensions WHERE project_id = 296;如果這條查出來 deleted_at 是空的,代表還原沒做完整,需要重新執行:
UPDATE compliance.project_extensions SET deleted_at = '2026-07-23 04:43:26.37393' WHERE project_id = 296;本次手測留下的真實測試資料(job_execution_detection_tools 綁定列)沒有清除,因為它是驗證「重整頁面 prefill 回填」用的正常資料,不是髒資料。驗收 subagent 若要重新走一次手測流程,可以直接沿用這筆(job_execution_id=13342,uid 77a9079c-f628-41df-b1ba-8cfcecc159ec),或自行找其他任務測。
已經完整寫好、不需要重讀 code 細節的參考(直接讀這兩份就有全貌):
handoff/2026-07-26-runner-562-completion-handoff.md——commit 清單 + 每個 commit 的觸發原因3a9346da-4cd0-8134-8e92-dea4a6486607)——完整返工回報 + 手測證據 + 執行紀錄,用 notion-fetch 讀如果要驗收,才需要讀的程式碼(BE):
common/enum/grc_job_type_enum.py(T-2.1 枚舉加值)infra/grc/repository/grc_job_repo_impl.py(BPMN 同步 + _batch_fetch_job_tools)domain/detection_tools/ + infra/detection_tools/(T-2.2 綁定表九層 DDD)app/grc/service/job_service.py(_replace_detection_tool_binding)infra/oscal/repository/ssp_control_implementation_query.py::get_detection_tools_by_job_idsapp/oscal/service/ssp_control_implementation_service.py::build_control_tree_by_ssp_id(T-2.3 rework 的 BE 配套)scripts/sql/2026-07-26-fr056-2-*.sql(三個 migration:建表、RLS 修正、OpenVAS param seed)test/test_grc_job_detection_type.py、test/test_job_detection_tool_binding.py、test/test_detection_tool_connection.py如果要驗收,才需要讀的程式碼(FE,路徑 ~/Projects/Billows/Audit-Manager/compliance-manager-fe/):
src/views/project/ProjectPlanningView.vue(T-2.3 rework 主體,改動集中在 jobTypeOptions / TaskConfig interface / 任務面板 v-if 區塊 / saveTask)src/views/project/TaskSetupView.vue——應該已回到 revert 前狀態,驗收時可 git show fd2e837 --stat 確認 revert 乾淨src/stores/menuStore.js(fetchDetectionToolMenu)src/components/detection-tools/DetectionConfigField.vue(複用元件,屬 FR-056.1,本次未改動,只是重新引用)cd ~/Projects/Billows/Audit-Manager/compliance-manager-be
git branch --show-current # 應為 feature/scan-plugin-integration;不對就停下問 user
git log --oneline -5 # 最上面應是 37451cd2 feat(fr056): enrich control-tree jobs with detection-tool binding (T-2.3 rework)
git status --short # design.md / implementation-plan-phase2.md 有 M 是主導 session 先前更新的 plan 文件(非本棒改動),docs/ 下一堆 ?? 是既有雜項,皆非本 arc 產物,勿清理
cd ~/Projects/Billows/Audit-Manager/compliance-manager-fe
git branch --show-current # 應為 feature/scan-plugin-integration
git log --oneline -5 # 最上面應是 5914df2 feat(fr056): rebuild detection_tool job type UI in ProjectPlanningView (T-2.3 返工)
git status --short # 應為乾淨(無 uncommitted)Notion 現況查驗(用 notion-fetch 讀 page_id,或用 SQL 查任務清單 data source collection://23c346da-4cd0-8041-955e-000bb6976dd2 篩 需求編號 LIKE 'FR-056.2%'):
3a9346da-4cd0-8134-8e92-dea4a6486607)都應是「修正待驗證」3a9346da-4cd0-8182-8451-f473f1bde2d5)應該還是 runner 開始前的狀態,本 session 依慣例沒有先改它,留給驗收通過後再改-- 確認 T-2.3 手測留下的綁定資料還在(不是必須,只是佐證)
SELECT jedt.*, dt.code, dt.name
FROM config.job_execution_detection_tools jedt
JOIN config.detection_tools dt ON dt.id = jedt.detection_tool_id
WHERE jedt.job_execution_id = 13342;
-- 預期:tool_params = {"hosts": "192.168.50.100"}, completion_mode = 'auto', code = 'openvas'
-- 確認 Step 0.5 seed 還在
SELECT dt.code, ptp.version, ptp.is_current, jsonb_array_length(ptp.param_schema) AS field_count
FROM config.detection_tool_param_schemas ptp
JOIN config.detection_tools dt ON dt.id = ptp.detection_tool_id
WHERE dt.code = 'openvas';
-- 預期:is_current=true, field_count=4
-- 確認專案 296 已還原軟刪除狀態
SELECT project_id, deleted_at FROM compliance.project_extensions WHERE project_id = 296;
-- 預期:deleted_at 有值(非 NULL)feature/scan-plugin-integration,不切換closing-and-handoff skill 的區分)kill -9 舊 process 後重跑 python main_app.py)若 user 之後說「收尾」/「驗收過了,總結」,照 closing-and-handoff skill 的六步流程走。目前不要主動做:
feedback_*.md,屬非顯而易見的教訓)TaskSetupView.vue 斷頭頁本身的 bug 修復:已裁定不修,只記錄,除非 user 明確改變決策BE(feature/scan-plugin-integration,origin 落在 88e79baf,之後全部未 push):
37451cd2 feat(fr056): enrich control-tree jobs with detection-tool binding (T-2.3 rework)
8efbb6b2 feat(fr056): seed OpenVAS param schema (T-2.3 step 0.5)
afdb9b44 fix(fr056): jedt RLS policy delimiter + is_super_admin bug (T-2.2 follow-up)
ea661321 fix(fr056): agent_tasks state machine reject invalid/terminal transitions (T-3.1 follow-up)
c51bd884 fix(fr056): expose detection-tool binding on job read path (T-2.2 follow-up)
d378596e feat(fr056): job-detection-tool binding + param schema read (T-2.2)
1086ee94 feat(fr056): heartbeat task dispatch + ack + result endpoints (T-3.2)
580c80ac docs(FR-056): 主導 session 中繼交接 handoff——56.1 驗收放行、56.2/.3 平行執行中
aa916792 feat(fr056): agent_tasks table + state machine + agent capabilities (T-3.1)
a5a7cf4c feat(fr056): add detection_tool job type + BPMN sync (T-2.1)
b26f83f1 fix(fr056): test_connection must merge field_values with decrypted credentials (T-1.4)
(ea661321、1086ee94、aa916792 屬 56.3 runner 的產出,本 session 未接觸,僅供對照)
FE(同 branch 名,origin 落在 f6d9ea7,之後全部未 push):
5914df2 feat(fr056): rebuild detection_tool job type UI in ProjectPlanningView (T-2.3 返工)
fd2e837 Revert "feat(fr056): add detection_tool job type to task setup page (T-2.3)"
f7d4968 feat(fr056): add detection_tool job type to task setup page (T-2.3)
06c1fb5 fix(fr056): sync DetectionToolsErrorCode to FE zh-tw/en error-code.json
0d18938 feat(fr056): rebuild detection tool management page with real API (T-1.5)
請讀 docs/features/FR-056-2607-detection-tool-integration/handoff/2026-07-26-t23-completion-cold-handoff.md 接手。
先過「🧭 原始需求」+ 冷接自檢 4 問,確認自己弄懂 FR-056.2 在做什麼、completion_mode 是什麼,
再跑 §6 pre-flight 確認兩個 repo 狀態跟文件描述一致。
T-2.1/T-2.2/T-2.3 已完成、已測試、已回填 Notion,目前是等驗收的狀態,不是需要修的 bug。
除非我另有指示,你的下一步是等我安排(可能是驗收、可能是繼續 56.3/56.4、可能是收尾),不要自己找事做或重新實作。