# Requirements: 巡樓 Console（整包重構）

> Status: **`approved`**  
> Slug: `haixun-console`  
> Last updated: `2026-07-09`  
> 批准：使用者確認 OK（2026-07-09）  
> 策略：舊碼整包封存 `old/`；**主線從零重寫**；先地基 → 前端 mock → 再接後端；文案含多帳號互回  
> 變更：reply 步驟可選 **lead**（主帳可接續回覆）

---

## 1. 一句話

用 Grok 4.5 **重構**巡樓工作台：先把登入、Threads 串接、Job、通知、權限等地基做對；**前端用全新流程與視覺 + 假資料**把操作順到你滿意，再補真實後端與業務，避免在舊混亂上疊功能。

---

## 2. 誰用、在什麼情境

| 角色 | 目標 |
|------|------|
| 經營者 | 綁多個 Threads、產文案（主帳+配角互回）、海巡外展、排程發文；看任務與通知 |
| 管理員 | 建會員、管權限（封閉 beta） |
| （系統）Worker | 長任務執行並回報進度 |

---

## 3. 背景與動機

### 為什麼要重構（不是小修）

- 現況前後端半成品交織：假成功 API、幽靈 worker、巨型頁、文件漂移 → **在舊樹上修會繼續亂**。  
- 你希望流程與風格都重想；業務好不好用要先**用手走完**，不是先堆後端。  
- 交付方式：**舊 monorepo 已封存至 `old/`**，根目錄從零建立 `apps/web`、`services/*` 等；`old/` 只讀參考。

### 參考（非最終規格）

- 封存：`old/backend/`、`old/docs/`、`old/AGENTS.md`  
- 產品：`docs/product/haixun-console/`

---

## 4. 交付策略（怎麼重構）— 硬性順序

```text
Phase A  地基（最小可用平台）
    → Phase B  新前端 + Mock（流程與風格定稿）
        → Phase C  後端接真（替換 mock，同一套 UI）
            → Phase D  業務加深（海巡、進階互回、成效…）
```

| Phase | 目標 | 完成定義（產品語言） |
|-------|------|----------------------|
| **A 地基** | 平台能站起來 | 登入會話可用；權限可擋路由；Threads 帳號能綁/能呼叫 API（或明確 mock 開關）；Job 能建立/查狀態/通知；**無假成功** |
| **B 前端 Mock** | 操作順、好看 | 全主要流程用假資料可點完；你認可 IA + 視覺；API 層可切 `mock | live` |
| **C 接後端** | 假資料變真 | 同一 UI，逐頁/逐域替換 live；契約與 mock 對齊 |
| **D 業務加深** | 護城河 | 海巡閉環、進階互回/AI 分角、護欄與成效等 |

**原則：**

1. **B 未通過前，不開大範圍業務後端**（避免又寫一堆用不到的 API）。  
2. A 只做「所有業務都會用到的管子」，不做完整海巡/完整矩陣。  
3. 新碼只在根目錄新結構；**不在 `old/` 上繼續開發**。  
4. 舊 monorepo **已封存**於 `old/`（2026-07-09）。

---

## 5. 目標分級

### 5.1 P0-A — 地基（平台）

1. **登入與會話**  
   email/password 登入、logout、refresh；未登入不可進主殼。  
   （封閉註冊：admin 建號或 seed；公開註冊非 P0。）  
2. **權限**  
   至少：已登入會員 vs admin；前端路由與關鍵操作可依角色顯示/阻擋；後端同語意。  
3. **Threads API 串接完成（基礎）**  
   - 綁定帳號（OAuth 或文件化的連線方式）  
   - 列表已綁帳號、連線健康/錯誤可讀  
   - 具備「用指定帳號打 Threads API」的統一出口（發文/回覆可先最小 smoke，完整業務在 C/D）  
4. **Job 系統（最小）**  
   建立任務、查列表/詳情、狀態（queued/running/succeeded/failed/cancelled）、進度摘要。  
5. **Notification（任務通知）**  
   任務完成/失敗時，Console 內可感知（鈴鐺列表或 toast + 可點進 job）；不要求 email/push 推播為 P0。  
6. **契約底線**  
   JSON envelope、錯誤可讀、時間 UTC nano（後端）、**禁止 stub 回成功**。

### 5.2 P0-B — 新前端 + Mock（你要先滿意的部分）

1. **全新資訊架構與視覺**（見 §8），不沿用「掌機側欄 + 巨型單頁」當預設。  
2. **Mock 驅動的完整主流程**（假資料也要真實感）：  
   - 登入殼 → 總覽（今日待辦）  
   - 帳號（多 Threads）  
   - **發文計畫 / 串場**（主題 → 主帳+cast → 草稿串 → 預覽 → 排程預覽）  
   - 出站佇列（Outbox）狀態  
   - 任務與通知中心  
   - 設定（AI key 可先 UI only）  
3. **多帳號互回（流程先做對）**  
   - 主帳號 **lead** 1 個：負責樓主貼（root）  
   - **cast** 多選：本串可出場的其他帳號  
   - **發言池 = lead ∪ cast**：每一則「回覆步驟」都可指定池內**任一帳號**，**包含 lead**  
     （例：lead 發主貼 → cast 帳回 → **lead 再回那則** → 另一 cast 再接）  
   - 單線接龍步驟可編輯、可預覽「誰說什麼」  
   - Mock 發布過程：逐步狀態動畫/列表即可  
4. **雙模式資料層**  
   `dataSource: mock | api`；B 預設 mock；切 api 時契約不變。  
5. **RWD**：手機可走完核心流（不必完美，但不可壞掉）。

### 5.3 P0-C — 接後端（在 B 過關後）

1. Auth / me / permissions 接真。  
2. Threads 帳號與 OAuth 接真。  
3. Job + 站內通知接真。  
4. 發文計畫 / 互回草稿 / 佇列逐步接真（可按垂直切片：先單帳發文，再互回）。  

### 5.4 P1 — 業務加深

1. 海巡：品牌 → 主題 → 掃描 → 外展草稿。  
2. 互回進階：AI 分角色產整串、間隔/護欄 per-account、失敗單步重試完善。  
3. 提及收件匣、成效儀表。  
4. Job 可靠度硬化（dedupe/heartbeat 等）。  
5. Email 驗證閘道（若仍需要）。

### 5.5 P2

公開註冊、Islander agent、extension 安全同步、大型多租戶計費等。

---

## 6. 範圍

### In scope

- **從零重寫**（舊碼在 `old/` 封存，主線新樹）。  
- 地基：Auth、Permission、Threads 基礎串接、Job、站內 Notification。  
- 全新前端體驗 + mock 業務流（含多帳互回）。  
- 之後同一套 UI 接後端。  
- 產品文件：`docs/product/haixun-console/` 為決策真相。

### 多帳號互回 — 行為邊界

| 項目 | P0 要 | P0 不要 |
|------|-------|---------|
| lead | 必選 1 個；**root 固定 lead**；**也可在 reply 再出場** | 主帳只能發主貼、不能回後續 |
| cast | 多選其他帳；與 lead 組成**發言池** | 跨會員借號 |
| reply 發言者 | **lead 或任一 cast**（主帳可回別人的回覆） | 僅 cast 能回 |
| 串結構 | 單線接龍：每步接上一步 | 樹狀多分支（以後再說） |

### Out of scope（本重構週期明確不做）

- 在 `old/` 或舊 UI 上繼續疊功能當最終產品。  
- 把 `old/` 整包「搬回」當新主線而不重寫。  
- 復原舊 copy_mission 五段 worker 管線。  
- 自動 refill 庫存 bot、公開自助註冊、MFA、Zitadel。  
- 重型 UI 框架（MUI/Ant/Chakra）。  
- 任天堂 / Nook 元素、emoji 當主圖示。  
- 把海巡與互回做成同一套語意。  
- 未綁定帳號、跨會員借號。  
- B 階段沒過就大寫海巡/矩陣後端。

---

## 7. 使用者故事

### 地基

| ID | 作為… | 我想要… | 以便… | 驗收 |
|----|--------|---------|--------|------|
| US-A1 | 經營者 | 登入並維持會話 | 進工作台 | 登入進主殼；logout 後不可進 |
| US-A2 | 經營者 | 依權限看到該看的選單 | 不誤操作 | 無 permission 時入口隱藏或 403 |
| US-A3 | 經營者 | 綁定並看到 Threads 帳號狀態 | 後續發文有對象 | 列表可見；錯誤可讀 |
| US-A4 | 經營者 | 看背景任務狀態與完成通知 | 知道跑完沒 | job 列表；完成/失敗有通知可點 |

### 前端 Mock / 文案流

| ID | 作為… | 我想要… | 以便… | 驗收 |
|----|--------|---------|--------|------|
| US-B1 | 經營者 | 在新 UI 上走完「今日 → 開一個發文計畫」 | 覺得流程順 | mock 下無卡死、步驟清楚 |
| US-B2 | 經營者 | 指定主帳 + 選其他帳互回，且 lead 也可再回後續留言 | 多號串場、主帳能接話 | 每句顯示帳號；reply 步驟可選 lead 或 cast；預覽順序正確 |
| US-B3 | 經營者 | 在 Outbox 看到這串的排程狀態 | 掌握發送 | mock 狀態流轉合理 |
| US-B4 | 經營者 | 從通知跳到對應任務或計畫 | 減少找頁 | 一鍵到達 |

### 接真後（C）

| ID | 作為… | 我想要… | 以便… | 驗收 |
|----|--------|---------|--------|------|
| US-C1 | 經營者 | 同一套畫面改打真 API 仍可用 | 上線 | mock/api 契約一致；關鍵流 live 通過 |

---

## 8. 新前端：流程與風格方向（提案，待你選/改）

> 現況問題（簡述）：導覽像「很多 App 格」但主線不清；單頁過重；視覺偏玩具掌機，專業經營感不足；海巡/文案/發布心智模型混。

### 8.1 產品隱喻（建議）

**「泊岸工作台 Harbor Desk」** — 不是掌上遊戲機，而是**靠港調度台**：

- 今天要出港的內容（發文/互回）  
- 船隊帳號（多 Threads）  
- 遠航探查（海巡，P1）  
- 船期與回報（Outbox + Jobs + 通知）

語氣：年輕、清楚、短句；可留「島」「巡」詞，但 UI **不要**雲朵滿版搶戲。

### 8.2 資訊架構（建議導覽）

最多 **5 個主入口**（桌面側欄 + 手機底欄）：

| 入口 | 做什麼 |
|------|--------|
| **今日 Today** | 待發、失敗需處理、進行中 job、快捷「開新串」 |
| **帳號 Crew** | 綁定/健康/選預設主帳 |
| **創作 Studio** | 發文計畫 wizard + 草稿庫（多帳互回在這裡） |
| **探查 Scout** | 海巡（P1 再滿血；B 可放空狀態說明） |
| **發送 Outbox** | 佇列、歷史、護欄狀態 |

**全域：** 頂欄右側 = 通知鈴 + 主題 + 使用者選單（設定/登出）。  
**不做：** 十幾個 App tile、Jobs/Gaps 當一級又難找又佔位（Jobs 併入通知與 Today）。

### 8.3 創作主流程（Studio wizard，B 階段就要順）

```text
1. 主題      一句話 + 可選「幫我想」
2. 船隊      選 lead（主帳）+ cast（其他可出場帳，可多選）
3. 劇本      單線步驟：第 0 步 root=lead；之後每步 = **發言池內帳號（含 lead）** + 文案
4. 預覽      像 Threads 對話泡泡；可見 lead 穿插回覆
5. 船期      主貼時間 + 回覆間隔
6. 提交      進 Outbox（mock 狀態：排程中 → 發送中 → 完成/失敗）
```

任一兩可回上一步；每步自動存 draft（mock localStorage 即可）。

### 8.4 視覺方向（建議，可整包替換舊 hx-scene）

| 面向 | 建議 |
|------|------|
| 調性 | **安靜專業 + 一點溫度**：偏「設計工具 / 編輯台」，不是遊戲 HUD |
| 色彩 | 深 slate 字 + 暖白紙面 + **單一 brand**（建議霧青/海色 `#2A9D8F` 系）；深淺主題都走 token |
| 字體 | 維持 **Inter + Taipei Sans TC**（閱讀與中文標題夠用） |
| 版面 | 左窄導覽（icon+字）+ 右內容；**不要**固定超寬掌機外框 |
| 卡片 | 1px 細邊、中等圓角（12–16px）、輕陰影；少裝飾 blob |
| 動效 | 僅頁面切換與列表 150–200ms；不搶操作 |
| 圖示 | 原創線條 SVG 一套即可；禁止 emoji 當主 icon |
| 密度 | 表單與表格可讀優先；中文 line-height ≥ 1.6 |

**明確告別：** 舊「奶油票券 + 滿天雲 + PATROL PAD 掌機」作為預設殼（若你仍想保留可作「懷舊主題」P2，不當預設）。

### 8.5 Mock 資料原則

- 預置 2–3 個假 Threads 帳號（不同顯示名/頭像色）。  
- 預置 1 條進行中 job、1 條失敗通知。  
- 預置 1 份範例互回劇本：root(lead) → reply(cast) → reply(lead)（示範主帳接話）。  
- 所有列表可空狀態插畫/短文案，不空白死頁。

---

## 9. 成功標準

### Phase A

- [ ] US-A1～A4 在「真後端或契約完整 mock server」下可演示。  
- [ ] 無對外 stub 成功 API。  

### Phase B（**你主觀過關為準**）

- [ ] 你親自走完 Studio 互回 wizard + Outbox + 通知，認為**流程順、風格可接受**。  
- [ ] 能做出 root(lead) → reply(cast) → reply(lead) 並預覽/進 Outbox。  
- [ ] 主 IA ≤ 5 個一級入口；無巨型單頁不可維護感（單檔建議有分頁/步驟元件）。  
- [ ] `mock | api` 可切換架構已就位（api 可暫時 501，但不能亂成功）。  

### Phase C

- [ ] 登入、帳號、job/通知、至少「單串發文或 mock 同等」一條 live 路徑。  
- [ ] 同一 UI 不需重畫。  

### 全域

- [ ] 產品決策以本文 + 後續 spec/plan/tasks 為準。  

---

## 10. 約束與假設

- **重構工具：** 以 Grok 4.5 / 本 repo agent 為主；`/spec-driven` 管文件閘門。  
- **可重寫 monorepo**；舊碼是零件庫與行為參考。  
- **後端契約精神可保留**（envelope、JWT 分離、job 狀態機），實作可新建。  
- **前端：** 輕量 React + Vite（或同等）；不引入重型 UI kit；**新 design token 允許全新一輪命名**。  
- **假設：** B 階段你會參與 1～2 輪流程/視覺拍板，否則 mock 白做。  
- **假設：** Threads App 憑證在接 C 時可取得。  
- **互回：** 僅自有已綁帳號；P0-B 單線接龍；**reply 發言池含 lead**（主帳可回別人的回覆）。  

---

## 11. 風險

| 風險 | 緩解 |
|------|------|
| 重寫範圍爆炸 | 死守 A→B→C→D；B 過關才加深後端 |
| Mock 與真 API 契約漂移 | 先定 thin types / MSW 或 mock 模組與未來 API 同 shape |
| 視覺改了又改 | B 只定 **一套** 預設主題；大改須改 requirements/spec |
| 舊資料/舊 job 遷移 | C 再定；B 不承諾遷移 |
| 多帳互回後端複雜 | B 只鎖 UX；C 垂直切片接真 |

---

## 12. 開放問題（請你拍板）

1. **重寫落點：** ~~二選一~~ → **已決策：舊碼進 `old/`；新前端 `apps/web`；新後端另建（如 `services/api`），不從舊樹原地改。**  
2. **登入是否要 email 驗證才能進？** **預設：A 可先關，P1 再開。**  
3. **視覺提案「Harbor Desk」是否當預設？** 若否，請給 3 個形容詞（例如：極簡黑白 / 編輯器感 / 更活潑）。  
4. **Scout（海巡）在 B 階段：** 完全隱藏，還是放「即將推出」空頁？**預設：空頁占位，免導覽以後大改。**  
5. **Mock 持久化：** 僅 memory，還是 localStorage 跨重新整理？**預設：localStorage。**  

---

## 13. 附錄：與舊需求的差異（摘要）

| 舊 | 新 |
|----|-----|
| 不在舊樹上重寫 monorepo | **允許整包重構/重寫** |
| 海巡/文案/發布 P0 一次閉環 | **先 A 地基 + B 前端 mock，再 C 接真** |
| 沿用田園掌機 UI | **新 IA + Harbor Desk 風格提案** |
| 多帳互回（已納入） | **保留，且 B 階段就要流程順** |

---

## 14. 批准

- [x] 需求已批准：2026-07-09（使用者 OK；採預設：`apps/web`、Harbor Desk、海巡空頁、email 驗證 A 先關、mock localStorage）  
- 下一步：審核 [spec.md](./spec.md) → 回 `spec OK` 後寫 plan
