FR-056 主導 session 中繼交接 v2 — 半夜自主任務鏈防斷點(orchestrator handoff)

項目 內容
緣由 主導 session context 用量偏高,半夜要跑無人值守自主任務鏈(56.4 驗收→修復→手冊),寫此保險 handoff 防 session 斷點/變笨
交接日期 2026-07-26 深夜(56.4 runner 已派出,預計 27 日凌晨完成)
Branch(BE/FE/evidence-agent 三 repo 同名) feature/scan-plugin-integration(不可切 branch)
本棒角色 主導/驗收 session——派工 + 驗收 + 收口,不自己實作(實作歸 runner / 修復 subagent)
現況一句話 56.1/56.2/56.3 全數獨立驗收放行;56.4 runner(Sonnet 5,user 另開 session)執行中;user 已授權半夜自主鏈(見 §NIGHT)
push 狀態 BE/FE/evidence-agent 皆有未 push commits(push 永遠等 user 明示)
取代 同資料夾 2026-07-26-orchestrator-mid-arc-handoff.md(前一棒交接,內容已過時但背景仍可參考)

🧭 原始需求 / WHY(必讀)

要解決什麼:客戶目前「用檢測工具掃描 → 匯出報告 → 手動上傳當任務證據 → 手動完成任務」全程手工。FR-056 把這條線自動化:

  1. 租戶自助設定檢測工具(首接 OpenVAS)——工具目錄 DB 驅動,租戶填連線資訊+憑證(加密落庫)【56.1,已放行】
  2. 任務可設為「檢測工具執行」類型+掃描參數(BPMN userTask 同步)【56.2,已放行】
  3. 按「開始執行」→ 客戶端 Agent 觸發掃描——複用 FR-039 evidence-agent(mTLS+JWT),派工走「心跳夾帶待辦」【56.3,已放行】
  4. 報告自動回收成任務證據(source=DETECTION_TOOL,沿用 DRIVE_SYNC handler 模板)→ 發信通知 → 依 completion_mode flag 決定自動完成或留人工【56.4,執行中】

完成模式(易誤解,必懂)completion_mode 只是「掃完要不要自動按完成鍵」的 flag,不是新狀態。auto=系統自動呼叫既有 complete_job;manual=系統不做事,任務留 PROCESSING,人工判斷證據後手動完成。零新增 JobStatus、不動 jedi_flow_engine

關鍵決策 D1–D11 在 design.md §3。56.4 最相關:D11 證據用既有 FILE 型別(嚴禁新增 REPORT)/ D9 憑證雲端解密隨派工下發不落地 / D8 完成模式預設 manual。

開發模式:主導出 plan → user 開 Sonnet runner session 實作 → 主導派獨立 subagent 驗收(不信自報)→ Notion 三層留痕 + 執行時間紀錄(user 在收模式效率數據)。

🌙 §NIGHT:user 已授權的半夜自主任務鏈(2026-07-26 深夜下令,原話要旨)

「大約台北時間 27 號 AM 3 點檢查是不是都做完了,還沒做完隔半小時再檢查,做完了就做驗收。驗收有問題,就你這邊派 subagent 去處理,都完成後給一份 HTML 使用手冊(要做什麼測試、agent 要怎麼升級、任務跟檢測工具要怎麼設定),跟檢測項目做好都放到 Notion 內,交給你了。」

授權範圍(可不經 user 直接做)

  1. 定時查 56.4 完成狀態(未完成 → 30 分鐘後再查,用 CronCreate one-shot 續排)
  2. 完成 → 派獨立 Sonnet subagent 分段驗收(照 56.1–56.3 模式)
  3. 驗收缺失 → 直接派 Sonnet subagent 修復(不返工給 runner)→ 複驗到放行
  4. 全放行 → 產出:(a) HTML 使用手冊(派 subagent 寫,主 session 驗收)(b) Notion 新 case「FR-056 人工驗證測試(user 手測)」(c) 母案 CM-907 補指引一行

授權外(仍禁止):push / 切 branch / 動 jedi_flow_engine / 收尾類動作(spec/SUMMARY/母案收口/memory——等 user 醒來下令)。

已排 cron:session 內 one-shot(27 日 02:57 台北),未完成自動續排 30 分。cron 是 session 記憶體內的——若本 session 斷掉 cron 就消失,接手的新 session 要自己重建(直接手動執行下方檢查即可,不必重排 cron 若已過時間)。

§0 接手讀序(fresh session 冷接照此順序)

🔒 先懂需求 gate:

  1. 本文件 🧭 + §NIGHT 全讀
  2. docs/features/FR-056-2607-detection-tool-integration/design.md §3(D1–D11)+ §6(Agent 派工/轉證據/執行流程)
  3. memory project_fr056_detection_tool_integration.md 開檔全讀

冷接自檢 4 問(答不出回去讀):

  • FR-056 要讓使用者少做哪些手工?
  • completion_mode=manual 時任務狀態是什麼、系統做什麼?
  • 半夜自主鏈的授權邊界在哪(哪些可直接做、哪些仍禁止)?
  • 56.4 驗收若發現缺失,處理方式跟 56.2/56.3 時有什麼不同?(提示:不返工給 runner)

然後按需讀:implementation-plan-phase4.md(驗收 56.4 時才讀,別整讀——很大,grep 定位)。

§1 現況快照(交接當下)

1.1 三子需求驗收全放行(勿重跑)

子需求 驗收結論 驗收報告位置
56.1(CM-908) 16✅+1N/A 零缺失放行 CM-908 卡內文
56.2(CM-909) 四段全過零返工放行(BE 三段+FE 一段) CM-909 卡內文
56.3(CM-910) 首輪 16/17 過→返工 ea661321(狀態機終態防護)→複驗 9 項全過放行 CM-910 卡內文

56.2 期間兩個 plan 級問題已處理完(都不是 runner 的錯):

  • T-2.3 落點錯誤:原 plan 指到斷頭頁 TaskSetupView.vue(ui_routes 無條目/無導覽/API 未註冊),裁定 revert(FE fd2e837)+ 在 ProjectPlanningView.vue 重做(FE 5914df2)。已回寫 plan-phase2/design.md/CM-919。
  • param seed 遺漏detection_tool_param_schemas 原本零 seed,connector params.hosts 必填會炸。已補 seed migration(BE 8efbb6b2),4 key(hosts/timeout_sec/scan_config_id/scanner_id)與 evidence-agent connector 逐字對齊,DEV 已驗。

1.2 56.4 runner(user 另開 Sonnet 5 session,執行中)

Case:T-4.1 CM-924(source 加 DETECTION_TOOL + detection_executions 表 + 轉證據 handler)/ T-4.2 CM-925(執行編排 + 完成模式分岔 + 通知)/ T-4.3 CM-926(FE 任務執行抽屜)。plan:implementation-plan-phase4.md。runner prompt 已含 Notion 回填鐵則(含執行紀錄段)/ 測試策略 / git 紀律(顯式 add、禁 push)。

1.3 Notion 座標

母案 CM-907:3a9346da-4cd0-81a5-be6f-f0ddd6d770c6。子需求卡:.1=3a9346da-4cd0-810c-9544-c237066d39d4 / .2=3a9346da-4cd0-8182-8451-f473f1bde2d5 / .3=3a9346da-4cd0-811d-8d54-cbf81686b661 / .4=3a9346da-4cd0-81c2-aae3-d8d6af1f8689。T-4.x:CM-924=3a9346da-4cd0-815c-b282-c50d5b9d9c3d / CM-925=3a9346da-4cd0-815c-be82-eb593a766505 / CM-926=3a9346da-4cd0-8195-b39c-e58639d5a383。任務清單 data source:collection://23c346da-4cd0-8041-955e-000bb6976dd2(查狀態 SQL:SELECT "Case No","任務名稱","狀態" ... WHERE "需求編號"='FR-056.4')。

1.4 repo 座標

  • BE:~/Projects/Billows/Audit-Manager/compliance-manager-be
  • FE:~/Projects/Billows/Audit-Manager/compliance-manager-fe
  • evidence-agent:~/Projects/Billows/Audit-Manager/evidence-agent(pytest 須 poetry run,系統 python 缺 gvm)
  • DEV DB:psql -h 192.168.50.188 -p 25432 -U cmmgr -d guidant_ai_dev,密碼查 BE .env DB_SECRET JSON 的 rds_master_password

§2 教訓(本棒新增,別重蹈)

  1. 驗收 subagent 清單塞太重必 context 爆:56.2 BE 段第一次派整包(8 大項)爆掉;拆三段(每段 ≤6 檢查項)後全過。每個驗收 subagent scope 上限 ≤6 檢查項,讀檔紀律必帶:嚴禁讀 .html/.md/docs、grep -n 定位小段 Read ≤80 行、Bash 輸出 head 截斷、pytest 只 tail、超大 vue 檔嚴禁整讀。
  2. runner 的「沒有導覽點」類主張要用 DB ui_routes 複核:真選單在 DB 不在程式碼,grep 不到 ≠ 不存在(T-2.3 斷頭頁判定就是靠這步定案)。
  3. user 質疑「欄位夠不夠」時做三邊對照:seed 定義 / connector 消費端 / 上游真實需求——param seed 遺漏就是這樣抓到的。
  4. BE 全量 pytest 有既有 110 failed/34 errors(既有債務,與 FR-056 無關):驗收跑回歸時看「FR-056 相關測試全過 + FAILED 清單 grep detection/job 零命中」即可,別被既有紅嚇到。

§3 半夜鏈工作清單(= cron prompt 的展開版)

3a. 檢查 56.4 完成度

Notion SQL 查 FR-056.4 四張卡是否全「修正待驗證」+ git log --oneline -8(BE 應多 T-4.1/4.2 commits、FE 多 T-4.3)。未完 → 30 分後再查。

3b. 驗收(全完成後,分段派 Sonnet,每段 ≤6 項)

  • 段1 BE migration+活庫:detection_executions 表 migration 鐵則(-- Date:/GRANT/schema_migrations)+ DEV 活庫實查(表在/RLS 在/登記在/tenant_id+org_unit_id)+ evidence source enum 加 DETECTION_TOOL 的全 call site 掃
  • 段2 BE 編排+分岔:completion_mode 分岔正確(auto→呼叫既有 complete_job;manual→不做事)+ 嚴禁動 JobStatus/jedi_flow_engine(git show --stat grep flow_engine|job_status 應零) + 轉證據 handler 沿用 DRIVE_SYNC 模板(source=DETECTION_TOOL、D11 用 FILE 型別非 REPORT)+ 通知沿用既有信件機制 + result 回收→轉證據的鏈路 pytest
  • 段3 BE DDD+回歸:新層 DDD/session/@transaction/幽靈 WHERE + FR-056 相關 pytest 全過(既有 110 failed 屬債務,見 §2-4)
  • 段4 FE 抽屜:任務執行抽屜 UI + i18n 繁體無簡體 + vite build 過 + 既有頁面回歸(純增量)

3c. 缺失 → 直接派修復 subagent(user 已授權,不返工 runner)

修復 subagent 紀律:顯式 git add 逐檔 / commit fix(fr056): ... (T-4.x follow-up) / migration 照鐵則套 DEV / 修完派複驗。

3d. 全放行 → 交付物

  1. HTML 使用手冊(派 Sonnet subagent 寫,主 session 只驗收;繁體中文自包含單檔)存 docs/features/FR-056-2607-detection-tool-integration/user-manual.html,章節:
    • 檢測工具設定(平台目錄 → 租戶設定頁填 base_url/帳密/port → 憑證加密說明 → 測試連線)
    • 任務設定(規劃頁控制項實作 Tab 點 AO → 任務類型選「檢測工具執行」→ 選工具 → 掃描參數 hosts 等 → 完成模式 manual/auto 差異白話說明)
    • evidence-agent 升級部署(從 FR-039 版升級:git pull 新版 → poetry install(新增 python-gvm)→ 重啟 → capability 確認)
    • 端到端流程(開始執行 → 心跳領工 → 掃描 → 報告自動回收成證據 → 通知信 → 完成分岔)
    • 人工測試 checklist(含真實 OpenVAS 前置:GVMd 9390 TLS 開放檢查——Docker 版常只開 Unix socket,這是已知部署陷阱)
  2. Notion 新 case:「FR-056 人工驗證測試(user 手測)」,需求編號 FR-056、狀態 Not started、作業人員留空(user 做)、內文=checklist 摘要+指向 user-manual.html。開卡前先搜尋防重複
  3. 母案 CM-907 內文補一行手冊指引。
  4. 每步留進度訊息給 user 睡醒看。

3e. user 醒來後(等下令才做)

總收尾(spec / SUMMARY / 母案收口 / memory / 執行時間彙整成本分析)。收尾待辦清單見 §10。

§6 Pre-flight(fresh session 接手先跑)

cd ~/Projects/Billows/Audit-Manager/compliance-manager-be
git branch --show-current   # feature/scan-plugin-integration;不對停下問 user
git log --oneline -10       # 對照 §11
cd ~/Projects/Billows/Audit-Manager/compliance-manager-fe && git log --oneline -5
cd ~/Projects/Billows/Audit-Manager/evidence-agent && git log --oneline -5

§8 行為規範提醒

  • 不切 branch / 不 push / 收尾等 user 下令(半夜鏈授權範圍見 §NIGHT,其外仍禁止)
  • 派 subagent 一律 Sonnet(或 Haiku),驗收 subagent 必帶讀檔紀律(§2-1)
  • 繁體中文;Notion 先搜尋再開卡;Claude 做的作業人員填「小弟」
  • BE 改 service 要 kill -9 重啟才生效(log/app.log 看錯誤)

§10 不在本期 scope / 收尾待辦(user 醒來裁)

不做:Nessus/SonarQube connector / REPORT 證據型別 / jedi_flow_engine 改動 / 執行時間彙整(等收尾令)。

收尾待辦清單(累積中)

  1. TaskSetupView.vue 斷頭頁去留(含 fetchTree 404 既有 bug)
  2. FE fetchAOJobs() 死碼路徑未 map tool 欄位(既有)
  3. BE 全量 pytest 既有 110 failed/34 errors 債務盤點
  4. 真實 OpenVAS 環境全鏈驗證(需實體 GVMd + 部署 agent 容器;9390 TLS 前置檢查)
  5. STG/POC 套全部 fr056 migrations
  6. 執行時間彙整成本分析(user 要的模式效率數據,各卡執行紀錄段已在收集)

§11 關鍵 commits(交接當下;以 origin 對照為準,後段未 push)

BE(fr056 相關,新→舊):

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)
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)
(更早 T-1.x 見前一棒 handoff §11)

FE:

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)(已被 revert)
06c1fb5 / 0d18938(T-1.5,見前一棒)

evidence-agent:

35847df feat(fr056): OpenVAS connector (T-3.4)
16f7462 feat(fr056): agent task executor skeleton (T-3.3)

(56.4 runner 的 commits 交接後陸續出現,屬預期)

§12 給 fresh session 的超短 prompt

請讀 docs/features/FR-056-2607-detection-tool-integration/handoff/2026-07-26-orchestrator-night-chain-handoff.md 接手 FR-056 主導 session。
先過 🧭 + §NIGHT + 冷接自檢 4 問,再跑 §6 pre-flight。
你的角色是派工+驗收,不自己實作。56.4 runner 執行中;user 已授權半夜自主鏈
(檢查→驗收→subagent 修復→HTML 手冊+Notion case),授權邊界見 §NIGHT。
若已過檢查時間直接手動執行 §3a 起的清單,不必重排 cron。