---
title: "任務關卡 — 討論稿 (FR-148)"
brand: "Guidant AI · **FR-148** 任務關卡"
eyebrow: "FR-148 · 討論稿 · 2026-10-18"
h1: "一張任務卡走完「交證據 → 主管審 → 顧問審 → 結案」"
subtitle: "關卡是任務裡面的事；BPMN 流程圖一顆方塊、一筆任務，不動圖"
lede: "現在要讓一個任務經過主管、顧問兩道審核，只能在流程圖畫三個方塊，結果變成三張任務卡，證據與留言各自分家，後面的人看不到前面的東西。本案在**任務身上加一條可自訂的關卡清單**：公司在系統設定建好幾條審核流程，各專案在規劃頁自己決定哪些任務套哪一條（可一次套用到多個任務），任務卡上多一條關卡列與「審核歷程」按鈕（點開彈窗看），每換一關通知下一關負責人。流程圖維持一顆方塊、一筆任務；走完最後一關才叫既有的「完成任務」讓流程往下走。請先開 [雛形索引](prototype/index.html) 點四頁，再回來看規格。"
chips: [
  {text: "四頁假資料雛形", kind: accent},
  {text: "不動 BPMN 引擎、不動流程圖", kind: ok},
  {text: "D1～D14 全裁（D3 作廢）", kind: ok},
  {text: "問卷審核第一期不併", kind: warn}
]
footer: "FR-148 · 討論稿 · 2026-10-18 · 雛形 [prototype/index.html](prototype/index.html) · 現況依據：程式碼行號與 DEV DB 唯讀查詢（2026-10-18）· 沿革見 LOG 與 git log"
---

**狀態**：討論稿（D1～D12 全裁、D3 作廢；雛形待依定案改，改完決策者看過即落 design.md）　｜　**日期**：2026-10-18　｜　**雛形**：[prototype/index.html](prototype/index.html)

路徑慣例：BE 路徑相對 `compliance-manager-be/`；`pkg/` 代表 `~/Projects/Jedicogy/module/jedi-python-package/`；FE 路徑相對 `compliance-manager-fe/`。

## 變更紀錄 {#changelog nav="變更紀錄"}

| 日期 | 變更 | 對應 |
|---|---|---|
| 2026-10-18 | v1：方案比較（四案）、資料模型草案、端到端流程、畫面放法、D1～D10 待裁、拆卡草案、四頁雛形 | 本稿 |
| 2026-10-18 | 決策者裁 D13（任務配置 Excel 只管第 1 關，加唯讀摘要欄）、D14（改善計畫任務不套樣板）；規劃頁指派收進彈窗（零關也開彈窗） | 決策者 |
| 2026-10-18 | 決策者補裁 D7：出廠預設＝內建零關樣板「免審直通」（不可刪、不可加關），管理員自己改預設才會變 | 決策者 |
| 2026-10-18 | 決策者裁：用詞改為「任務關卡樣板」（系統設定選單叫「任務關卡樣板設定」、任務卡上叫「關卡進度」），「流程」只留給 BPMN 流程圖；設定頁改成清單＋編輯 dialog，版型與專案列表統一。以下內文的「審核流程」皆指任務關卡樣板 | 決策者 |
| 2026-10-18 | 決策者裁 D4、D6、D7、D9、D10 照建議；D8 改為「批次完成＝推進當下那一關」（審核關也可批次）。全部決策裁完 | 決策者 |
| 2026-10-18 | 決策者裁 D1：流程不設負責人，只是象徵性的關卡骨架；每關由誰做由 PM 在規劃頁指派，跟現在指派任務人員一樣、每關可多人。D3 作廢。資料模型拿掉 owner 欄、新增每關指派表 | 決策者 |
| 2026-10-18 | 決策者裁：審核歷程改成按鈕＋彈跳視窗，不常駐在任務卡內（資訊太多） | 決策者 |
| 2026-10-18 | 決策者裁：D2（畫面呈現「開始 → 1 → 2 → 3 → 結案」，開始／結案只是端點、中間三關照舊）、D5（任務一旦開始就不能改流程）、D11（流程建在系統層、各專案自己決定套到哪些任務）、D12（不做單一任務微調，要不同流程就套不同條）。雛形待依新定案改 | 決策者 |

---

## 分工概述（30 秒版） {#overview nav="概述"}

整案一句話：**任務身上帶一條可自訂的關卡清單，同一張卡依序交給不同的人，每換一關通知下一關負責人，走完最後一關才算完成；流程圖一顆方塊一筆任務，不動。**

給非工程讀者的背景：稽核任務常常不是一個人做完就算數——執行人交證據、部門主管看過、顧問確認符合法規，才算結案。現在系統的任務只有「未開始／進行中／已完成」三態，想做審核只能在流程圖畫三個方塊，就變成三件任務：證據在第一張、主管在第二張看不到證據、顧問在第三張看不到前兩張的留言。本案讓這三步變成**同一張卡上的三關**。

| 卡 | 做什麼 | 產出 | 決策者檢查法 |
|---|---|---|---|
| **① 任務卡關卡列＋送審／核可／退回＋歷程** | 任務卡標頭下多關卡列；底部按鈕跟著「目前關卡負責人是不是你」變；標題列右上角時鐘圖示，點開彈窗列出歷程；每換一關寄信 | 兩張新表（關卡快照、歷程）＋任務新欄、推進／退回 service、通知掛點、FE 關卡列與歷程子元件 | 對照 [雛形頁 1](prototype/task-drawer.html)：用三個身分各登入一次，送審→主管核可→顧問核可並結案，歷程三筆、每步下一關的人收到信；主管退回執行人收到信且卡回第一關 |
| **② 待辦任務頁** | 多一欄「目前關卡」、篩選多一段「待我處理」 | 待辦查詢加欄位與條件、FE 表格欄與篩選段 | 對照 [雛形頁 2](prototype/my-tasks.html)：王經理登入「待我處理」只列等他審的；陳小明登入看到被退回的那筆 |
| **③ 系統設定「任務關卡樣板設定」** | 清單＋編輯 dialog（版型同專案列表）；管理員建好幾個樣板，每個自訂關卡名稱／說明／允許退回到哪（**不設負責人**）；一條設公司預設 | 關卡組兩張表＋migration、CRUD 端點、FE 新頁 | 對照 [雛形頁 4](prototype/settings.html)：點一列開 dialog 加一關、新增一個樣板、設預設，重開頁面還在 |
| **④ 規劃頁套流程＋每關指派人員＋套用到其他任務** | 任務設定多一個下拉「審核流程」選系統層的哪一條（複製一份到任務）；原本的「指派人員」一格變成每關一格（第 1 關＝原指派人員），每格可多人；「套用到其他任務」一次勾多個；任務開始後鎖 | 套用端點、每關指派端點、批次套用端點、FE 任務表單區塊、啟動前置檢查加「每關都要有人」 | 對照 [雛形頁 3](prototype/planning.html)：選「標準三關」，指派人員變成三格、各填人（可多人），存檔重開還在；已開始的任務是鎖的 |
| **⑤ 退回重開與結案接線** | 管理員退回已結案任務時關卡重設第一關；走到最後一關才呼叫既有 `complete_job` 讓流程往下走；專案啟動時沒套的任務自動帶公司預設組 | `reopen_job_execution` 與 `restart_from_first_station` 加 hook、`complete_job` 前置判斷、啟動時帶預設 | 把已結案任務退回重開 → 關卡列回第一關、執行人收到信；沒套關卡的任務行為與現在完全一樣 |

依賴：①是核心、先做（決策者最早看得到畫面）；②只依賴①；③④可與②平行；⑤最後做。**卡的排序以「何時看得到畫面」為準**。

```{.mermaid cap="圖 1 — 五張卡的依賴（實線＝必須先做）"}
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#E2F0F1','primaryTextColor':'#14201F','primaryBorderColor':'#0E7C86','secondaryColor':'#EEF2F3','secondaryTextColor':'#14201F','tertiaryColor':'#FBFCFC','tertiaryTextColor':'#14201F','lineColor':'#4A5A5C','textColor':'#14201F','mainBkg':'#E2F0F1','nodeBorder':'#0E7C86','nodeTextColor':'#14201F','edgeLabelBackground':'#FBFCFC','titleColor':'#14201F','clusterBkg':'#FBFCFC','clusterBorder':'#E4EAEB','actorBkg':'#E2F0F1','actorTextColor':'#14201F','actorBorder':'#0E7C86','actorLineColor':'#C7D1D2','signalColor':'#4A5A5C','signalTextColor':'#14201F','labelBoxBkgColor':'#EEF2F3','labelBoxBorderColor':'#C7D1D2','labelTextColor':'#14201F','loopTextColor':'#14201F','noteBkgColor':'#F6EBD5','noteTextColor':'#14201F','noteBorderColor':'#9C6B12','activationBkgColor':'#EEF2F3','activationBorderColor':'#C7D1D2','sequenceNumberColor':'#FFFFFF'}}}%%
flowchart LR
    C1[① 任務卡關卡列<br/>送審／核可／退回／歷程] --> C2[② 待辦任務頁]
    C1 --> C3[③ 任務關卡樣板設定]
    C3 --> C4[④ 規劃頁套流程<br/>套用到其他任務]
    C1 --> C5[⑤ 退回重開與結案接線]
    C4 --> C5
```

---

## 為什麼不用 BPMN 做：四個方案比較 {#options nav="方案比較"}

決策者的疑問是：「原版靠 BPMN 處理流程，再加一套設定是不是流程定義變兩個地方？」答案是**兩層各管各的**——BPMN 管「任務與任務之間」（先後、平行、分支），關卡管「一件任務裡面誰簽」。真正的癥結不是 BPMN，是這條既有鐵律：

::: {.callout .crit}
**🔴 一個方塊＝一筆 `job_executions`，證據、留言、問卷、執行紀錄全掛在那一筆上**

FR-112 定的（`app/flow_control/service/flow_apply_to_tasks_service.py` 檔頭、`workflow_xml_sync_service.py` 三向 diff 都靠 `job_execution_uid` 配對）。所以只要審核畫成多個方塊，資料就一定拆開；要資料不拆，換手就得放在引擎以外。
:::

| 方案 | 做法 | 每間公司不一樣怎麼辦 | 牽連範圍 | 判定 |
|---|---|---|---|---|
| **一：三個方塊＋「同一串」標記** | 圖上三方塊標成同串，引擎照跑三筆，UI 與證據池把同串當一張卡 | 靠畫圖 | **最大**。所有「按任務讀」的地方改「按串讀」：稽核作業頁、AO 底稿（FR-141／142 剛做完）、證據分類、複審複製、進度與通過清單、Drive 歸檔；三向 diff 與套用到其他任務的配對規則重寫 | 排除 |
| **二：一個方塊，關卡塞方塊屬性** | 關卡清單寫進 camunda 屬性 | 靠畫圖時填 | 引擎不執行該屬性，只是當設定檔存；FR-112 才把屬性瘦到只剩名稱；範本 XML 是可翻譯欄位要雙寫 | 排除（重走舊路） |
| **三：一個方塊，關卡是任務層資料** | 任務多「目前第幾關」，關卡清單存新表；走到最後一關才 `complete_job` | 公司自建關卡組，PM 套、可微調 | **最小**。14 個按 `JobStatus.COMPLETED` 讀的地方、三向 diff、套用到其他任務一行不改。要動：新表、推進／退回 service、通知掛點、任務卡 FE、待辦頁、設定頁 | **建議** |
| **四：BPMN call activity 子流程** | 一顆方塊展開成子流程三站 | 靠畫圖 | 子流程三站仍是三筆 `job_executions`，資料拆開問題與方案一相同，只多一層包裝 | 排除 |

**反悔條件**：若客戶要求「主管退回後走另一條路」「兩個審核並行」「審核結果決定下一個任務是誰」——這些是分支，是圖的事，線性關卡不夠，那時才把審核拉進圖；但資料共用問題仍要解，方案一的成本不會消失。

---

## 現況盤點：接入點 × 現況 × 本案動作 {#inventory nav="盤點"}

| 元件 | 現況 | 本案動作 |
|---|---|---|
| 任務狀態 `JobStatus` | `pkg/jedi-flow-engine/.../job_code.py`：TODO／PROCESSING／COMPLETED／CANCEL 四態 | **不動**。關卡是另一欄，PROCESSING 期間在關卡內換手 |
| 任務表 `job_executions` | `pkg/jedi-flow-engine/jedi_flow_engine/infra/models/job_execution.py`：FR-137 已加週期六欄、期限兩欄 | 加 `review_step_no`（目前第幾關，null＝沒套）、`review_group_id`（套了哪組，只記來源） |
| 完成任務入口 | `api/flow_engine/__init__.py:38` `/flow-engine/task/complete/<id>` → `workflow_execution_service.complete_job()`（:623）→ 把下一方塊實體化成 PROCESSING 並 `notify_user_todo_job` | 有關卡的任務：FE 不直接打這支；推進 service 走到最後一關時由 BE 呼叫它。沒關卡的任務不變 |
| 批次完成 | `app/flow_control/service/job_batch_complete_service.py:43` | 有關卡且未到最後一關的任務要擋（或改成批次送審）——D8 裁 |
| 退回重開 | `app/flow_engine/service/job_reopen.py:10` `reopen_job_execution`（管理員退回結案）、`job_restart_service.py:63` `restart_from_first_station`（週期重跑） | 兩處加 hook：關卡重設第一關、寫一筆歷程、通知執行人 |
| 通知 | `workflow_execution_service.py:1209` `notify_user_todo_job(job_id, assignees=None)`：寄信＋Discord／Telegram，可指定收件人 | 換關時以該關負責人為 `assignees` 呼叫，不新開管線；信件文案多一種「待你審核」 |
| 指派表 `task_assignees` | `pkg/jedi-task-platform/.../task_assignee.py`：`is_approver`（問卷審查人員專用）、`role`（String 50，現未用於審核） | **不動 `is_approver`**（語意是問卷）。關卡負責人另存關卡快照表，不塞指派表 |
| 專案角色 | `common/enum/participant_enum.py`：manager／reviewer／auditor／viewer；`reviewer` 註解「系統送待審核通知給他」但 grep 全 app 只有一處 i18n 用到 | 關卡「依角色」的選項就是這四個＋「任務執行人」；`reviewer` 當主管審預設、`auditor` 當顧問審預設 |
| 組織單位 | `pkg/jedi-iam/.../org_unit.py`：name／parent_id／path／metadata，**沒有主管欄** | 「執行人的部門主管」查不到，負責人只能是專案角色或指定人（D3） |
| 問卷審核 | `pkg/jedi-survey/.../task_survey_code.py`：待填寫／編輯中／待審核／待補充說明／完成；`task_survey.approval_required`；BE 主專案 2 檔、套件 7 檔、FE 12 檔 | **第一期不併**（D9）。問卷任務不套關卡，維持現狀 |
| 流程圖「套用到其他任務」 | `app/flow_control/service/flow_apply_to_tasks_service.py`：列同輪候選、只允許全 TODO 的目標 | 關卡的「套用到其他任務」比照同一動線：同輪候選、已開跑不可套 |
| 待辦任務頁 | FE `src/views/project/MyTasksView.vue`（760 行）：表格欄專案／輪次／控制項／AO／任務／類型／期限／狀態；篩選全部／未開始／進行中／已完成 | 加「目前關卡」欄、「待我處理」段；BE 待辦查詢加兩欄與一個條件 |
| 任務卡 | FE `src/components/grc/JobExecutionDrawer.vue`（**2,344 行，已超標**）：`JobDrawerHeader`＋描述／指南／檢測設定／指派／部門／設備／問卷／執行紀錄／證據 | 關卡列、動作區、歷程**各開子元件**，抽屜只插三行；不往裡塞 |
| 規劃頁 | FE `src/views/project/ProjectPlanningView.vue`（**2,604 行，已超標**） | 「審核關卡」區塊開子元件 |
| 規劃頁「匯出／匯入任務配置」Excel | `app/flow_control/service/job_import_service.py`（492 行）：前九欄資源庫共用格式（`task_guidance_workbook.py`）＋後四欄「任務類型／指派人員／參與部門／設備」；匯入＝上傳→預覽（`JobImportDialog.vue`，可在表上改指派與部門）→確認，寫回 `task_assignees`；指派人員必填；問卷審核者「留下來的人保留、新加的人預設否」 | D13：指派人員／參與部門兩欄改為「第 1 關」；加一欄唯讀「任務關卡」摘要；第 2 關以後與樣板選擇不進 Excel；填寫說明頁加一句 |
| 改善計畫 Excel | `poam_workbook_export.py`／`poam_workbook_import.py`：「執行人員」欄是改善任務的執行人 | D14：改善任務不套樣板，**不動** |
| 資源庫任務說明、SSP 控制項現況、稽核計畫、稽核結果 Excel | 只有任務名稱／描述／指南三欄，或不碰指派 | 不動 |
| 下拉選項政策 | CLAUDE.md：選項進 `system_menus` | 關卡**名稱是自由文字**不是選項；「依角色」的角色清單是程式列舉（專案角色 enum），屬例外 |

---

## 資料模型草案 {#model nav="資料模型"}

```{.mermaid cap="圖 2 — 新表與任務表的關係"}
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#E2F0F1','primaryTextColor':'#14201F','primaryBorderColor':'#0E7C86','secondaryColor':'#EEF2F3','secondaryTextColor':'#14201F','tertiaryColor':'#FBFCFC','tertiaryTextColor':'#14201F','lineColor':'#4A5A5C','textColor':'#14201F','mainBkg':'#E2F0F1','nodeBorder':'#0E7C86','nodeTextColor':'#14201F','edgeLabelBackground':'#FBFCFC','titleColor':'#14201F','clusterBkg':'#FBFCFC','clusterBorder':'#E4EAEB','actorBkg':'#E2F0F1','actorTextColor':'#14201F','actorBorder':'#0E7C86','actorLineColor':'#C7D1D2','signalColor':'#4A5A5C','signalTextColor':'#14201F','labelBoxBkgColor':'#EEF2F3','labelBoxBorderColor':'#C7D1D2','labelTextColor':'#14201F','loopTextColor':'#14201F','noteBkgColor':'#F6EBD5','noteTextColor':'#14201F','noteBorderColor':'#9C6B12','activationBkgColor':'#EEF2F3','activationBorderColor':'#C7D1D2','sequenceNumberColor':'#FFFFFF'}}}%%
erDiagram
    review_step_groups ||--o{ review_step_group_items : "一組多關（公司設定）"
    job_executions ||--o{ job_review_steps : "套組時複製成快照"
    job_executions ||--o{ job_review_step_logs : "每次推進／退回一筆"
    job_review_steps ||--o{ job_review_step_assignees : "PM 在規劃頁指派每關的人（可多人）"
    review_step_groups {
        int id PK
        int tenant_id "租戶"
        string name "組名稱"
        text description
        bool is_default "公司預設"
    }
    review_step_group_items {
        int group_id FK
        int seq "順序"
        string name "關卡名稱（自由文字）"
        text description
        int[] back_to_seqs "允許退回到哪幾關"
    }
    job_executions {
        int review_step_no "目前第幾關；null=沒套"
        int review_group_id "來源組，只記錄"
    }
    job_review_steps {
        int job_execution_id FK
        int seq
        string name
        text description
        int[] back_to_seqs
    }
    job_review_step_assignees {
        int job_execution_id FK
        int seq "第幾關"
        int user_id "可多人"
    }
    job_review_step_logs {
        int job_execution_id FK
        int seq "在哪一關"
        string action "submit / approve / reject / reopen"
        int to_seq "退回到哪關"
        int user_id
        text note
        timestamptz created_at
    }
```

要點：

- **快照**：套組＝把組的關卡複製進 `job_review_steps`。之後改組、刪組都不影響已套的任務；不然會出現「指標在第 3 關、清單只剩 2 關」。
- **畫面長「開始 → 1 → 2 → 3 → 結案」**：「開始」「結案」只是流程圖的兩個端點，純顯示、不存資料、沒有負責人與按鈕。中間 1～N 才是關卡，存在表裡。走完最後一關（第 N 關）核可時，系統呼叫 `complete_job` 進入「結案」端點。
- **流程只是象徵性的關卡骨架**：系統層的流程只有關卡名稱、說明、順序、允許退回到哪——**不設負責人**。
- **零關的流程**（只有開始 → 結案）＝現狀，執行人按完成就結束；「免審」就是建一條零關流程讓任務套。
- **誰做每一關＝PM 在規劃頁指派**，跟現在指派任務人員同一套操作，只是從「一格指派人員」變成「每一關各一格」，每格可多人（`job_review_step_assignees`）。第 1 關（交證據）的人就是原本的任務指派人員（`task_assignees`），不另存一份。
- **任務開始前每關都要有人**：有關卡沒指派人時，專案啟動前置檢查擋下（比照現在「任務沒有指派人員」的檢查）。
- **歷程獨立一張表**，不塞進既有留言——稽核時要能單獨抽出「誰在哪一關簽了什麼」。
- 三張表都是 tenant-scoped，要帶 `org_unit_id`／RLS（[[feedback_tenant_scoped_table_needs_org_unit_id]]）。

---

## 端到端流程 {#flow nav="流程"}

```{.mermaid cap="圖 3 — 一張卡從套組到結案（含退回）"}
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#E2F0F1','primaryTextColor':'#14201F','primaryBorderColor':'#0E7C86','secondaryColor':'#EEF2F3','secondaryTextColor':'#14201F','tertiaryColor':'#FBFCFC','tertiaryTextColor':'#14201F','lineColor':'#4A5A5C','textColor':'#14201F','mainBkg':'#E2F0F1','nodeBorder':'#0E7C86','nodeTextColor':'#14201F','edgeLabelBackground':'#FBFCFC','titleColor':'#14201F','clusterBkg':'#FBFCFC','clusterBorder':'#E4EAEB','actorBkg':'#E2F0F1','actorTextColor':'#14201F','actorBorder':'#0E7C86','actorLineColor':'#C7D1D2','signalColor':'#4A5A5C','signalTextColor':'#14201F','labelBoxBkgColor':'#EEF2F3','labelBoxBorderColor':'#C7D1D2','labelTextColor':'#14201F','loopTextColor':'#14201F','noteBkgColor':'#F6EBD5','noteTextColor':'#14201F','noteBorderColor':'#9C6B12','activationBkgColor':'#EEF2F3','activationBorderColor':'#C7D1D2','sequenceNumberColor':'#FFFFFF'}}}%%
sequenceDiagram
    participant PM as 專案管理者
    participant EX as 執行人
    participant MG as 主管（第 2 關）
    participant CS as 顧問（第 3 關）
    participant BE as 後端
    participant WF as BPMN 引擎
    PM->>BE: 規劃頁套「標準三關」（複製快照、cur=1）
    Note over WF: 專案啟動，方塊實體化成 PROCESSING（既有）
    BE-->>EX: 通知「待你處理」（既有 notify_user_todo_job）
    EX->>BE: 上傳證據、按「送審」
    BE->>BE: cur=2、寫歷程 submit
    BE-->>MG: 通知「待你審核」
    MG->>BE: 看同一張卡的證據與留言，按「退回 → 第 1 關」＋理由
    BE->>BE: cur=1、寫歷程 reject
    BE-->>EX: 通知「被退回」＋理由
    EX->>BE: 補證據、再送審
    BE-->>MG: 通知
    MG->>BE: 核可
    BE->>BE: cur=3、寫歷程 approve
    BE-->>CS: 通知
    CS->>BE: 核可並結案
    BE->>BE: cur=4（最後一關）
    BE->>WF: complete_job()（既有）
    WF->>WF: 下一方塊實體化、通知其執行人（既有）
```

關鍵接線只有三處：

1. **FE 按鈕**：有關卡的任務，「完成任務」改成「送審／核可／退回」打新的推進端點；沒關卡的任務照舊打 `/flow-engine/task/complete/<id>`。
2. **推進 service 的最後一步**：到最後一關時呼叫既有 `complete_job`，由它做 BPMN 推進與下一方塊通知——本案不重寫這段。
3. **退回重開 hook**：`reopen_job_execution` 與 `restart_from_first_station` 結束時重設關卡。

---

## 畫面放法 {#ui nav="畫面"}

| 畫面 | 放哪 | 雛形 |
|---|---|---|
| 關卡列、動作區、審核歷程 | 任務卡（`JobExecutionDrawer`）：關卡列在標頭下、標題列右上角一個時鐘圖示（角標顯示筆數，放在狀態標籤右邊），點開彈窗列時間／關卡／誰／核可或退回／理由；動作區在描述上方。歷程不常駐在抽屜內，避免資訊過多 | [頁 1](prototype/task-drawer.html) |
| 目前關卡欄、待我處理段 | 待辦任務頁（`MyTasksView`）：欄在「狀態」右邊；段插在「全部」與「未開始」之間 | [頁 2](prototype/my-tasks.html) |
| 選流程、套用到其他任務 | 規劃頁任務表單：一個下拉「審核流程」＋「套用到其他任務」按鈕，位置在週期設定之後 | [頁 3](prototype/planning.html) |
| 任務關卡樣板管理 | 系統設定新頁「任務關卡樣板設定」：標題列＋搜尋＋表格（名稱／說明／關卡數／公司預設／已套用任務／操作，不放關卡預覽），點一列或「新增」開編輯 dialog，關卡預覽只在 dialog 內顯示；版型與專案列表統一 | [頁 4](prototype/settings.html) |

UI 鐵律自檢：雛形 `grep border-left` 只命中三處 1px 結構邊線（抽屜左邊、工具列兩側），沒有粗色強調條。

---

## 決策 {#decisions nav="決策"}

::: {.callout .decided}
**✅ D1 — 流程不設負責人，每關由誰做是 PM 在規劃頁指派（決策者 2026-10-18 裁）**

**定案**：系統層流程只是象徵性的關卡骨架（名稱、說明、順序、可退回到哪），不設負責人。PM 在規劃頁替任務指派人員時，跟現在一樣的操作，只是從一格變成每關一格，每格可多人。第 1 關（交證據）就是原本的任務指派人員。

**理由**：流程是公司層的範本，誰做是專案的事；沿用現有指派操作，PM 不用學新東西。

**被排除**：流程上填專案角色、跑到那關時查角色——要先在專案參與人員設角色才會生效，多一層間接、PM 看不出某關到底是誰。
:::

::: {.callout .decided}
**✅ D2 — 畫面呈現「開始 → 1 → 2 → 3 → 結案」（決策者 2026-10-18 裁）**

**定案**：開始、結案是流程圖的兩個端點，讓流程看起來完整；中間三關照舊（1 執行人交證據、2 主管審核、3 顧問審核）。第 1 關負責人固定任務執行人。

**理由**：純顯示，不影響資料模型；零關流程畫面上就是「開始 → 結案」，一眼看得出是直通不是壞掉。
:::

::: {.callout .decided}
**✅ D3 — 作廢**

D1 定案後每關由 PM 直接指派人，不需要系統自動找「執行人的部門主管」。
:::

::: {.callout .decided}
**✅ D4 — 一關指派多人時，任一人核可就過（決策者 2026-10-18 裁）**

**定案**：同一關指派多人時，第一個按核可或退回的人就算數；歷程記是誰簽的。

**理由**：全部都要簽等於會簽，要多一層「已簽幾個」的狀態，第一版不做。
:::

::: {.callout .decided}
**✅ D5 — 任務一旦開始就不能改流程（決策者 2026-10-18 裁）**

**定案**：任務開始（專案啟動、任務進入進行中）後，規劃頁的流程下拉鎖住；系統層改某條流程只影響還沒開始的任務——已套用的任務拿的是複製品。

**理由**：避免「主管正在審、流程被改掉第 2 關」的壞狀態。
:::

::: {.callout .decided}
**✅ D11 — 流程建在系統層，各專案自己決定套到哪些任務（決策者 2026-10-18 裁）**

**定案**：管理員在系統設定建好幾條審核流程（一條可設公司預設）；各專案在規劃頁替任務選要套哪一條，並可「套用到其他任務」一次套多個。套用時把流程複製一份到任務身上。

**理由**：公司建一次、所有專案都能選，不用每個新專案重建；複製一份讓系統層改流程不影響已套的任務。放系統層或專案層的工作量相同（差別只在流程表掛 `tenant_id` 或 `project_id`），選系統層是看用法。

**被排除**：流程建在專案層——每個新專案都要重建或從他處複製，又要處理「從哪複製」。
:::

::: {.callout .decided}
**✅ D12 — 不做單一任務微調，要不同流程就套不同條（決策者 2026-10-18 裁）**

**定案**：任務套上流程後不能在任務上加減關、換負責人。要讓某些任務走不同的審核，就在系統層多建一條（例如「免審直通」＝零關、「含法遵四關」）讓它套。

**理由**：微調會讓「這個任務到底走哪條」無從追查；多建一條流程是同樣效果、而且看得見。
:::

::: {.callout .decided}
**✅ D6 — 退回時不清證據（決策者 2026-10-18 裁）**

**定案**：退回後執行人在原有證據上補；歷程記退回理由。

**理由**：證據本來就可以多筆，標記「上一輪」是另一層資料。
:::

::: {.callout .decided}
**✅ D7 — 沒選流程的任務：有公司預設就自動帶，沒設就零關（決策者 2026-10-18 裁）**

**定案**：系統出廠內建一筆零關樣板「免審直通」，**預設就勾它**（seed migration 寫入、不可刪、不可加關）。所以裝好不動任何設定時，所有任務都是零關＝現狀，這個功能對沒設定的客戶等於隱形。管理員自己把公司預設改成別的樣板，之後新啟動專案的任務才自動帶那個；已在跑的舊專案不回頭套。（決策者 2026-10-18 補裁：預設用 0 關，除非使用者自己改）

**理由**：客戶一設預設，新專案全部任務自動有審核；不設的客戶什麼都不會變。
:::

::: {.callout .decided}
**✅ D8 — 批次完成：多關卡任務就是完成當下那一關（決策者 2026-10-18 裁）**

**定案**：待辦頁勾多筆按「批次完成」，有關卡的任務**推進當下那一關**（執行人那關＝送審、審核關＝核可），各自寄信給下一關的人；零關任務照現在直接完成。只有當下那關的指派人勾得到。

**理由**：執行人一次交十筆、主管一次核可十筆都是常見動線；批次核可時沒有逐筆理由欄，要退回仍要逐筆開卡。

**被排除**：審核關不能批次——決策者裁示審核關也要能批次推進。
:::

::: {.callout .decided}
**✅ D9 — 問卷任務第一版不能套流程（決策者 2026-10-18 裁）**

**定案**：問卷任務維持問卷自己的審核（待審核／待補充說明），規劃頁的流程下拉對問卷任務不顯示；第二期再把問卷審核對到關卡上。

**理由**：一起併要動 jedi-survey 套件發版＋FE 12 支檔，範圍翻倍。
:::

::: {.callout .decided}
**✅ D10 — 資源庫任務範本不預設流程（決策者 2026-10-18 裁）**

**定案**：第一版只有「公司預設」與「規劃頁替任務選」兩層，資源庫不加。

**理由**：FR-147 剛把資源庫任務三欄做完，再加一層要重碰那頁；需求明確再開第二期。
:::

::: {.callout .decided}
**✅ D13 — 任務配置 Excel 只管第 1 關（決策者 2026-10-18 裁）**

**定案**：規劃頁「匯出／匯入任務配置」Excel 的「指派人員」「參與部門」兩欄，意思改成**第 1 關**（＝原本的指派人員）；加一欄**唯讀**「任務關卡」顯示摘要（例：「標準三關（3 關，2 關已指派）」）；第 2 關以後的人員與樣板選擇不進 Excel，一律在規劃頁彈窗設；「填寫說明」頁加一句「多關卡任務的審核關卡人員請到規劃頁設定」。零關任務（預設）格式與行為完全不變，舊檔照樣能匯入。任務已開始時匯入改第 1 關的人照舊放行（換人不改關卡結構）；問卷審核者保留邏輯照舊。

**理由**：每個任務關數不同，攤成「第 N 關人員／部門」欄會讓欄數照最多的樣板開、大半空格，換樣板欄位位置還會跑；要大量派人的多半是第 1 關執行人，審核關通常是固定幾位主管顧問，彈窗設就夠。

**被排除**：(a) 每一關攤成欄。
:::

::: {.callout .decided}
**✅ D14 — 改善計畫（POA&M）任務不套任務關卡樣板（決策者 2026-10-18 裁）**

**定案**：改善任務不能套樣板，改善計畫頁與其 Excel 完全不動。

**理由**：改善任務是稽核結束後才產生，走另一條流程；一起套會擴大到改善計畫的指派、匯入與頁面。
:::

---

## 拆卡草案（依「何時看得到畫面」排序） {#cards nav="拆卡"}

| 順序 | 卡 | 範圍 | 看得到什麼 |
|---|---|---|---|
| 1 | ① 任務卡關卡列＋推進／退回＋歷程 | 三張新表 migration、任務新欄、推進／退回 app service（含通知、最後一關呼叫 `complete_job`）、三支端點、FE 三個子元件插進抽屜；**先用 DEV 手灌一組關卡到一個任務**驗畫面 | 一張卡三個身分走完送審→核可→結案，含退回 |
| 2 | ② 待辦任務頁 | 待辦查詢加「目前關卡」「負責人是我」、FE 欄與段 | 主管登入看「待我處理」 |
| 3 | ③ 系統設定任務關卡樣板 | 樣板兩張表、CRUD、FE 清單頁＋編輯 dialog、`ui_routes` 選單 | 管理員建樣板 |
| 4 | ④ 規劃頁套流程＋套用到其他任務 | 套用端點（複製快照）、批次套用端點、FE 下拉與按鈕、任務開始後鎖 | PM 替任務選流程 |
| 5 | ⑤ 退回重開＋啟動帶預設＋批次推進 | 兩處 reopen hook、啟動時帶公司預設流程（D7）、批次完成改成推進當下那一關（D8） | 退回重開回第一關；待辦頁勾三筆按批次完成，三筆各前進一關 |
| 6 | ⑥ 任務配置 Excel 對齊（D13） | 匯出加唯讀「任務關卡」欄、指派／部門兩欄註明為第 1 關、填寫說明頁加一句；匯入預覽表加唯讀欄；`job_import_service.py` 與 `JobImportDialog.vue` | 匯出一份含多關卡任務的檔，看到摘要欄；改第 1 關的人匯入，只動第 1 關、後面關卡的人不變 |

卡 1 動到 jedi-flow-engine 的 `job_executions` 加兩欄 → 走套件 path dependency、待發版；守衛測試與 RLS 形狀測試每卡 commit 前跑。

---

## 不做清單 {#out nav="不做"}

- 關卡分支／並行／會簽（D4 選 a 後的延伸）
- 單一任務微調關卡（D12 已裁不做）
- 專案層自建流程（D11 已裁放系統層）
- 任務配置 Excel 攤開每一關的人員欄（D13 已裁只管第 1 關）
- 改善計畫任務套樣板（D14）——需要時回頭評估方案一。
- 問卷審核併入（D9 第二期）。
- 資源庫範本層預設組（D10 第二期）。
- 組織單位主管欄（D3 另一 FR）。
- 關卡層級的期限（每關幾天內要處理）——先沿用任務期限。
- 既有專案回頭套關卡——只對新啟動的專案生效。
