# FR-110 STATE — Google Drive 應用程式設定

**整案 Done**（2026-09-17 主體，2026-09-18 追加三張卡後全數完成）。四階段全部驗收通過，
決策者手測完畢並下令收尾。決策軌跡在 [design.md](../design.md)（D1–D12）與
[SUMMARY](2026-09-17-FR-110-SUMMARY.md)，本檔不設 LOG。

## 現況

| 項目 | 狀態 |
|---|---|
| 實作 | ✅ 完成（BE 20 支 commit、FE 7 支；含 2026-09-18 追加三張卡） |
| 驗收 | ✅ 決策者手測通過（含 2026-09-18 二度手測回饋三項） |
| 收尾文件 | ✅ spec 四頁、SUMMARY、STATE、analysis、FR 登記、memory 同步 |
| **Push** | ✅ **BE / FE 兩 repo 均已 push** |
| 部署 | DEV 已套 migration；出貨基線已重產（`8cc99148`）；STG / POC 未動 |

## 卡片狀態

母卡 **CM-1890** 狀態 `Done`。

| 子需求 | 卡 | 子任務 | 狀態 |
|---|---|---|---|
| FR-110.1 存讀與解析 | CM-1891 | T-1.1 設定群組（CM-1895）／T-1.2 解析器（CM-1896）／T-1.3 OAuth 用戶端改造（CM-1897）／T-1.4 背景排程讀取查證（CM-1898）／T-1.3b 測試 fixture 補正（CM-1910）／T-1.5 通知頻道網址補接（CM-1911） | 全 Done |
| FR-110.2 驗證與 API | CM-1892 | T-2.1 讀存端點＋網址推導（CM-1899）／T-2.2 驗證憑證端點（CM-1900） | 全 Done |
| FR-110.3 畫面與選單 | CM-1893 | T-3.1 設定頁 FE（CM-1901）／T-3.2 選單 migration（CM-1902）／T-3.3 租戶頁前提提示（CM-1903）／**T-3.4 資料夾初始化子執行緒補身分（CM-1912）**／**T-3.5 三項體驗缺口補強（CM-1913）**／**T-3.6 專案頁「證據雲端資料夾」入口（CM-1940）** | 全 Done |
| FR-110.4 設定檔退場 | CM-1894 | T-4.1 範本與文件（CM-1904）／T-4.2 離線腳本（CM-1905） | 全 Done |

原計畫 11 張子任務，實際 16 張——CM-1910 / CM-1911 是首次驗收發現的兩個缺口補卡（SUMMARY §8），
CM-1912 / CM-1913 / CM-1940 是 2026-09-18 決策者二度手測後追加（SUMMARY §9）。

## 剩餘 follow-up（都不擋本案收口）

1. **error code 鏡像測試紅**：主專案 `flow_control_error_code` 碼表比 `jedi_compliance_audit` 多三碼。
   決策者裁**下次發套件時一併補**。memory `followup_error_code_mirror_parity_jedi_compliance_audit_lagging`。
2. **離線 Drive 分類腳本待刪**：現為停用狀態，屬 FR-107 舊 Drive 分類線，待下一版隨該線一併移除。
   memory `followup_fr107_remove_legacy_drive_classification_line`。
3. **AI 服務設定頁尚無對應 spec 頁**：本案照抄的先例（FR-107 T-5.5）自己沒有頁面 spec，
   本案已補齊 Drive 這半邊，AI 那半邊仍缺。

## 部署待辦

- **STG / POC 套 migration** — 走 init image 的 migrate 模式，等決策者放行（開發期只動 DEV）

## 接手要點

- **四項環境變數可留作後備**、`DRIVE_TOKEN_ENCRYPTION_KEY` **必留**（密文與鑰匙分開放；這把是空的時候存檔直接拋錯，沒有存明文這條路）。
- **資料庫與設定檔是整組切換不逐欄位混用**，判準是資料庫那一列有沒有 `client_id`。
- **開放範圍旗標前後端各一份**（`common/constant/drive_app_config.py` ／ `src/config/driveAppConfig.js`），要改一起改。
- **對外網址不是 https 時即時通知不會生效**，走定時輪詢同步；設定頁會警告但不擋存檔（內網部署的合法降級）。
- **子執行緒不繼承身分**：任何用 `ThreadPoolExecutor` 扇出、又要碰資料庫的地方，都得
  `contextvars.copy_context().run(...)` 各複製一份 context 帶進去，否則 RLS 整張表擋成 0 列。
- 行為規格看 [`docs/spec-site/current/system-admin/google-drive-app-config.md`](../../../spec-site/current/system-admin/google-drive-app-config.md)。
