# Phase C — 決策表（已 finalized）

> 2026-05-22 finalized — 全 26 題決策完成，design / plan 文件已同步更新。
> 此份保留作歷史紀錄。

---

## C1（OSCAL 角色 master data）

| 編號 | 問題 | 決策 |
|------|------|------|
| C1-D1 | `system_menus` 加 UNIQUE(group, key)？ | ✅ 加（pre-flight verify 無重複後加） |
| C1-D2 | 9 個角色 description 文案？ | ✅ 以 OSCAL spec / NIST SP 800-18 慣例為準（design-C1.md §3.2 已寫入 SQL）|

## C8（_ROLE_LABEL_MAP 清理）

| 編號 | 問題 | 決策 |
|------|------|------|
| C8-D1 | DB 內 broken role_id 跑一次性 SQL 修正？ | ✅ 修（pre-flight audit 數量後跑）|
| C8-D2 | `prepared-for` 算 organization role？ | ✅ 看亞航 reference docx 確認（pre-flight）|

## C7（06_外部利用恢復）

| 編號 | 問題 | 決策 |
|------|------|------|
| C7-D1 | TEMPLATE_VERSION v2.0.0 → v2.1.0？ | ✅ Bump |
| C7-D2 | C7 是否做？ | ✅ 做（兩行修改成本低）|

## C6（FE 移除受評範圍 section）

| 編號 | 問題 | 決策 |
|------|------|------|
| C6-D1 | 列表頁顯示「設備數 / 系統數」column？ | ✅ 保留 |
| C6-D2 | 「前往 SSP 編輯」hard navigation vs tab 切換？ | ✅ tab 切換（保 context 連貫）|
| C6-D3 | 詳情頁 card 顯示三項？ | ✅ devices / info_systems / leveraged 全顯示 |

## C4（專案 CRUD 改造）

| 編號 | 問題 | 決策 |
|------|------|------|
| C4-D1 | request 內舊欄位處理 | ✅ unknown=EXCLUDE + log warn（向後相容）|
| C4-D2 | `AuditSystemInputSchema` / `DeviceInputSchema` class 留還是刪？ | ✅ C 階段尾聲確認無 caller 後刪（C4 本期保留）|
| C4-D3 | `ParticipantInputSchema.role` 加 validate.OneOf？ | ✅ 加 |

## C2（SSP-scoped endpoints）

| 編號 | 問題 | 決策 |
|------|------|------|
| C2-D1 | Party DELETE cascade or reject？ | ✅ 預設 reject，`?cascade=true` query 強制 |
| C2-D2 | AP closed → SSP 完全 lock or reviewer comment？ | ✅ 完全 lock 寫操作（comment 屬另一獨立 feature）|
| C2-D3 | C2 分批 ship？ | ✅ 分兩批：C2.1 (basic CRUD) → C2.2 (excel-import + leveraged)|
| C2-D4 | `current-ssp-uid` URL pattern？ | ✅ `/projects/<uid>/current-ssp-uid` |

## C3（受評範圍遷移，重型）

| 編號 | 問題 | 決策 |
|------|------|------|
| C3-D1 | Backfill SQL 跑時機？ | ✅ 人工跑（PR1 ship 後 DBA 監督執行）|
| C3-D2 | PR1 ~ PR2 觀察期長度？ | ✅ 1 週 |
| C3-D3 | 沒 active AP 的 project backfill？ | ✅ 跳過（user 啟動 AP 後 SSP 從 MF clone 帶範圍）|
| **C3-D4** | **410 response 訊息規範** | ✅ **用 GrcErrorCode pattern** (`GRC_410001` / `GRC_410002`)，FE 用 error_code 查 i18n，msg 為 zh-tw fallback。**對齊專案規範。** |
| **C3-D5** | **`OscalRole` ORM 處理方式** | ✅ **保留 OscalRole stack**（OSCAL 文件結構用，跟 `system_menus` 服務不同對象 — UI dropdown vs OSCAL 匯出 metadata.roles[]）；**C1 同步 seed `oscal_roles` 9 筆** |

## C5（FE SSP tab）

| 編號 | 問題 | 決策 |
|------|------|------|
| C5-D1 | AP selector 預設？ | ✅ Latest active |
| C5-D2 | 預展開 accordion？ | ✅ 基本資料 + 受評範圍-設備 |
| C5-D3 | 控制項 / 程序書 link 跳新頁？ | ✅ 跳新頁（既有 fullpage 設計）|
| C5-D4 | leveraged section 等 C2.2 後再做？ | ✅ 是（C5 first ship 不含 leveraged，accordion 顯示 placeholder）|
| C5-D5 | non-manager 編輯按鈕 hide vs disable？ | ✅ disable + tooltip（user 知功能存在但無權）|

---

## 兩個從建議覆寫的決策

| 編號 | 我原建議 | User 覆寫 | 為什麼 |
|------|---------|----------|--------|
| **C3-D4** | 410 訊息 zh-tw 直接寫死 | **用 GrcErrorCode + FE i18n** | 對齊**專案規範** — 所有 error 都該走 error code 結構 + FE i18n |
| **C3-D5** | OscalRole 留到 C 階段尾聲評估 | **保留 + C1 同步 seed `oscal_roles`** | 釐清 `oscal_roles` 跟 `system_menus` 服務不同對象（OSCAL 文件 vs UI），不互相取代 |

---

## 下一步

✅ 全 26 題決策已完成
✅ design / plan 文件已同步更新
✅ open-decisions.md 標示 resolved

**user 可切換 model 到 Sonnet**，貼 `handoff-to-sonnet.md` 內的接手 prompt 開工。
