子需求卡:FR-058.7 SonarQube 上傳檔案掃描(scan 模式取源擴充)(CM-1002)
FR-058.7 驗收期間發現:專案規劃頁「開始執行任務」會自動派發檢測掃描(TaskExecutionService.start_task_execution → _auto_dispatch_detection_scans),自動路徑不帶檔案,對 scan_mode=upload 的任務必然觸發 DETECTION_TOOLS_400005(首次無檔 400),且被批次派發的 try/except 吞掉只留 warning log——PM 看到成功 toast、執行者無感的靜默失敗。又因失敗不產生執行紀錄,冪等條件(查無 detection_executions)永遠成立,每按一次「開始執行任務」就再失敗一次。D33 定案:upload 任務在挑選階段就排除、不進自動派發清單,一律由執行者在任務抽屜上傳檔案後手動執行(抽屜已有完整前置擋門)。
infra/grc/repository/task_execution_query.py:134-159 get_detection_jobs_without_execution——查詢加排除 tool_params->>'scan_mode'='upload' 的綁定。不是給 start_execution 加 auto 旗標在 service 層判斷(已排除:汙染共用簽名,過濾在挑選階段做更乾淨)ProjectPlanningView.vue 批次發佈 confirm 補一句「上傳型掃描任務需由執行者上傳檔案後手動執行」;ProjectAuditorOverview.vue 有同款 confirm(同 i18n key),兩處同步docs/features/FR-058-2607-detection-tools-expansion/design.md:決策理由見 §2 D33、設計說明見 §4.8「自動派發與 upload 模式」段、拆分與驗收條件見 §5.12 T-7.5。
以前 PM 在專案規劃頁按「開始執行任務」,系統會順手幫所有檢測工具任務派出第一次掃描。但上傳型(upload)的掃描任務需要先有源碼壓縮包才掃得動,系統自動派的時候手上沒檔案,所以每次都在背後失敗——失敗訊息被吞掉只寫進 log,PM 看到的還是綠色的成功提示,執行者那邊也完全沒感覺。更麻煩的是失敗不會留下執行紀錄,系統就一直以為「這個任務還沒派過」,所以每按一次就再默默失敗一次。
這次改成:上傳型任務從一開始就不列入自動派發的名單,不是派出去了再擋。這類任務一律由執行者在任務抽屜裡上傳檔案後自己按執行(抽屜那邊本來就有擋門,沒檔案不給按)。
沒有動到的部分:拉取型(pull)和掃描型(scan)任務的自動派發完全照舊;其他檢測工具的掃描模式(主動 / 被動 / 認證掃描等)也不受影響——判斷用的是完全相符比對,只認 upload 這個值。已經執行過的上傳型任務本來就不在自動派發名單裡,所以這次只影響「第一次執行」那一段。